一. 链表的基本概念
根据《数据结构》书中介绍,一个线性表是n个数据元素的有限序列,它的长度可根据需要增长或缩短,还有一系列对线性表的操作。
线性表可分为顺序存储结构和链式存储结构两种。
顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻。
链式存储结构的特点是不需要逻辑上相邻的元素在物理位置上也相邻。
下面重点介绍一下链式存储结构的线性链表,线性链表可分为单链表,循环链表,双链表。
线性表特点是用一组任意的存储单元存储线性表的数据元素,同时还存储一个指向后继信息的信息,这两部分信息组成为结点。结点包含两部分数据域和指针域。指针域存储信息成为指针或链。链表中只包含一个指针域,故称为单链表。
下面通过c语言实现单链表的基本操作:
#define MAXSIZE 20
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
//上述是一些重命名和宏定义
//单链表的存储结构
typedef struct LNode{
ElemType data; //数据域
struct Node *next; //指针域
}LNode,*LinkList;
读取链表第i个元素的数据:
Status GetElem(LinkList L, int i, ElemType *e){
LinkList p;
int j;
p = L->next;
j=1;
while(p && j<i){
p = p->next;
++j;
}
if(!p || j>i){
return ERROR;
}
*e = p->data;
return OK;
}
在带头结点的链表L的第i个位置之前插入元素e
Status ListInsert(LinkList &L, int i, ElemType e){
LNode p;
int j;
p = L;
j=0;
while(p && j<i-1){
p = p->next;
++j;
}
if(!p || j>i-1){
return ERROR;
}
LinkList s;
s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next =s;
return OK;
}
在带头结点的链表L,删除第i个位置的元素,并由e返回其值
Status ListDelete(LinkList &L, int i, ElemType &e){
LNode p;
int j;
p = L;
j=0;
while(p && j<i-1){
p = p->next;
++j;
}
if(!(p->next) || j>i-1){
return ERROR;
}
LinkList q;
q = p->next;
p = q->next;
e = q->data;
free(q);
return OK;
}
循环链表是另外一种存储形式的链式存储结构,特点是表中最后一个结点的指针域指向头结点。
双向链表:是指针域指向前驱结点和后继结点。
存储结构为:
typedef struct DuLNode{
ElemType data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode, *DuLinkList;