线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任意元素。线性表链式存储结构特点是用一组任意的存储单元存储数据元素,为了表示每个数据元素ai与其直接后继数据元素ai+1之间的逻辑关系,对数据元素ai来说,除了存储本身信息外,还要存储指示其直接后继的信息(即直接后继的存储位置)。这两部分信息称为数据元素ai的存储映像,称为结点(node)。它包括两个域,其中存储数据信息的称为数据域,存储直接后继存储位置的域称为指针域。
1、线性表的单链表存储结构
typedef struct Node{ //节点类型定义 ElemType data; //数据域 struct Node *next; //指针域 }Node,*LinkList; //LinkList为结构指针类型LintList L; //为单链表的头指针,也称为单链表L
假设L是LinkList型变量,则L是单链表的头指针,它指向表中第一个节点,若L为空(L=NULL),则所表示的线性表为空表,其长度n为0,有时我们在单链表的第一个结点前附设一个结点,称为“头结点”,头结点的数据域可以不存储任何信息,头结点的指针域指向第一个结点的指针(即第一个元素结点的存储位置)。
2、初始化单链表
//单链表的初始化Status ListInit_L(LinkList &L){ //构造一个空的单链表L L = (LinkList)malloc(sizeof(Node)); //产生一个头节点,并使L指向此头节点 if(!L) exit(OVERFLOW); //初始化失败 L->next = NULL; //指针域为空 return OK; }
3、单链表的销毁
//销毁单链表Status ListDelete_L(LinkList &L){ //前提条件:单链表已经存在 LinkList q; if(L){ q=L->next;//指向第一个节点 free(L);//释放L L=q; } retun OK;}
4、清空单链表
//单链表的清空Status ListClear_L(LinkList &L){ //前提条件,L存在,将L置为空表 LinkList p,q; p=L->next; while(p){ q=p->next; free(p); p=q; } L->next=NULL;//头节点指针域为空 return 0; }
5、判断单链表是否为空
//判断单链表是否为空Status ListEmpty_L(LinkList &L){ //初始条件:线性表L已存在 //操作结果:若L为空表,则返回TRUE,否则返回FALSE if(L->next)//非空 return true; else return false; }
6、计算单链表的长度
//计算单链表的长度int ListLength_L(LinkList &L){ //初始条件:线性表L已存在 //操作结果:返回L中数据元素个数 int i=0; LinkList p = L->next; //指向第一个节点 while(p){ //p没到表尾 i++; p=p->next; } return i; }
7、取元素
//取单链表中的数据元素Status ListGet_L(LinkList &L,int i,ElemType &e){ //初始条件:L为带头结点的单链表的头指针 //操作结果:当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR int j=1;//计数器 LinkList p=L->next;//指向第一个节点 while(p || j next; j++; } if(!p || j>i)//第i个元素不存在 return ERROR; e = p->data;//取出第i个元素 return OK; }
8、插入
//单链表的插入操作Status ListInsert_L(LinkList &L, int i, ElemType e){ //在带头结点的单链表L中的第i个位置之前插入元素e LinkList p=L; int j=0; while(p && jnext; j++; } if(!p || j>i-1) return ERROR; s = (LinkList)malloc(sizeof(Node));//创建一个新的结点s s->data=e; s->next=p->next; p->next=s; return OK; }
9、删除
//删除Status ListDelete_L(LinkList &L, int i, ElemType &e){ //在带头结点的单链表L中,删除第i个元素,并由e返回其值 LinkList p=L;//指向第一个节点 LinkList q; int j = 0;//计数器 while(p && jnext; j++; } while(!p || j>i-1) return ERROR; q = p->next; p->next = q->next; e = q->data; free(p); return OK; }