数据结构:线性表

线性表(List)

线性表是n个元素构成的有序序列(a1,a2,...,an)

ListMakeEmpty() 初始化一个空线性表L

ElementType FindKth(int K, List L) 根据位序K返回相应元素

int Find(ElementType X, List L) 在线性表L中查找X第一次出现的位置

void Insert(ElementType X, int i, List L) 在位序i前插入新元素X

void Delete(int i, List L) 删除指定位序i的元素

int Length(List L) 返回线性表L的长度n

 

顺序存储

typedef struct{

  ElementType Data[MAXSIZE];

  int Last;

}List;

List L, *PtrL;

 

访问下标为i的元素:L.Data[i]或PtrL->Data[i]

线性表的长度:L.Last+1或PtrL->Last+1

 

1,初始化

List *MakeEmpty(){

  List *PtrL;

  PtrL = (List*)malloc(sizeof(List));

  PtrL->Last = -1;

  return PtrL;

}

2,查找

int Find(ElementType X, List *PtrL){

  int i = 0;

  while((i<PtrL->Last+1)&&(X!=PtrL->Data[i]))  i++;

  if(i==PtrL->Last+1)  i = -1;

  return i;

}

3,插入(从后往前开始一直到i-1,先将元素向后移动一个单位,再在i-1处插入新的元素)

void Insert(ElementType X, int i, List *PtrL){

  if(PtrL->Last+1==MAXSIZE){

    printf("表已满");

    return;

  }

  if(i<1||i>PtrL->Last+2){

    printf("位置不合法");

    return;

  }

  for(int j=PtrL->Last; j>=i-1; j--){

    PtrL->Data[j+1] = PtrL->Data[j];

  }

  PtrL->Data[i-1] = X;

  PtrL->Last++;

  return;

}

4,删除(从i开始,将第i个元素移动到i-1的位置上,删除第i-1个元素)

void Delete(int i, List *PtrL){

  if(i<1||i>PtrL->Last+1){

    printf("不存在第%d个元素", i);

    return;

  }

  for(int j=i; j<PtrL->Last+1; j++){

    PtrL->Data[j-1] = PtrL->Data[j];

  }

  PtrL->Last--;

  return;

}

 

链式存储

typedef struct Node{

  ElementType Data;

  struct Node *Next;

}List;

List L, *PtrL;

 

1,求表长

int Length(List *PtrL){

  List *p = PtrL;

  int i = 0;

  while(p){

    p = p->Next;

    i++;

  }

  return i;

}

2,查找

(1)按序号查找

List *FindKth(int K, List *PtrL){

  List *p = PtrL;

  int i = 0;

  while(p!=NULL&&i<K){

    p = p->Next;

    i++;

  }

  return p;

}

(2)按值查找

List *Find(ElementType X, List *PtrL){

  List *p = PtrL;

  while(p!=NULL&&p->Data!=X){

    p = p->Next;

  }

  return p;

}

3,插入(在第i-1个节点后插入一个值为X的新节点)

(1)先用malloc构造一个新节点,用s指向

(2)再找到链表的第i-1个节点,用p指向

(3)然后修改指针,插入节点

List *Insert(ElementType X, int i, List *PtrL){

  List *p,*s;

  if(i==1){

    s = (List*)malloc(sizeof(List));

    s->Data = X;

    s->Next = PtrL;

    return s;

  }

  p = FindKth(i-1, PtrL);

  if(p==NULL){

    printf("参数错误");

    return NULL;

  }else{

    s = (List*)malloc(sizeof(List));

    s->Next = p->Next;

    p->Next = s;

    s->Data = X;

    return PtrL;

  }

}

4,删除(删除链表上第i个节点)

(1)先找到链表的第i-1个节点,用p指向

(2)再用指针s指向要删除的节点

(3)修改指针,删除s指向的节点

List *Delete(int i, List *PtrL){

  List *p, *s;

  if(i==1){

    s = PtrL;

    if(s!=NULL)  PtrL = PtrL->Next;

    else return NULL;

    free(s);

    return PtrL;

  }

  p = FindKth(i-1, PtrL);

  if(p==NULL||p->next==NULL){

    printf("找不到指定位置的元素");

    return NULL;

  }else{

    s = p->Next;

    p->Next = s->Next;

    free(s);

    return PtrL;

  }

}

 

广义表

1,广义表是线性表的推广

2,对于线性表而言,n个元素都是基本的单元素

3,广义表中,这些元素不仅可以是单元素,也可以是另一个广义表

 

typedef struct GNode{

  int Tag;          /*标志域:0表示结点是单元素,1表示节点是广义表*/

  union{          /*子表指针域Sublist与单元素数据域Data复用,即公用存储空间*/

    ElementType Data;

    struct GNode *SubList;

  }URegion;

  struct GNode *Next;    /*指向后继节点*/

}GList;

 

posted @ 2018-08-24 15:07  bl8ckwid0w  阅读(119)  评论(0编辑  收藏  举报