数据结构:线性表

线性表(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;

 

转载于:https://www.cnblogs.com/bl8ck/p/9528677.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值