单链表的存储结构
typedef struct Londe{ //声明结点的类型和指向结点的指针类型
ElemType data; //结点的数据域
struct Lnode *next; //结点的指针域
}Lnode, * LinkList; //LinkList为指向结构体Lnode的指针类型
定义链表L: LinkList L; <–> LNode *L;
定义结点指针p: Lnode *p; <–> LinkList p;
例如:存储学生学号、姓名、成绩的单链表结点类型定义如下
typedef Struct{
char num[80]; //数据域
char name[8]; //数据域
int score; //数据域
}ElemType;
typedef struct Lnode{
ElemType data; //用结构类型定义数据域
struct Lnode *next; //指针域
}Lnode ,*LinkList;
单链表基本操作的实现
单链表的初始化(带头结点的单链表)即构造一个空表
【算法步骤】
(1)生成新结点做头结点,用头指针L指向头结点
(2)将头结点的指针域置空
【算法描述】
Status InitList_L(LinkList &L){
L=(LinkList)malloc(sizeof(LNode));
//sizeof(LNode):从内存中找到一块空间;
//malloc函数:将内存分配出来;
//(LinkList):转换成此类型,经过此运算L就表示成这一空间的地址
L->next=NULL;//将头结点的指针域置空
return OK;
}
判断链表是否为空:
空表:链表中无元素,称为空链表(头指针和头结点仍然在)
【算法思路】 判断头结点指针域是否为空
【算法描述】
int ListEmpty(LinkList L){
//若L为空表,则返回1,否则返回0
if(L->next) return 0;
else return 1;
}
单链表的销毁:链表销毁后不存在
【算法思路】从头指针开始,依次释放所有结点(包括头结点)
【算法描述】
Status DestroyList_L(LinkList &L){
Lnode *p; //LinkList p;
while(L) //非空
{
p=L;
L=L->next; //L得到下一结点的地址,指向下一结点
free(p);
}
}
清空单链表:链表仍存在,但链表中无元素,成为空链表(头指针和头结点仍然在)
【算法思路】从首元结点开始依次释放所有结点,并将头结点指针域设置为空
Status ClearList(LinkList &L){
Lnode *p,*q; //或LinkList p,q;
p=L->next; //p指针指向首元结点(保存住头结点)
while(p){ //结束条件:p==NULL
q=p->next;
free(p);
p=q;
}
L->next=NULL; //头结点指针域为空
return OK;
}
求单链表的表长:
【算法思路】从首元结点开始,依次计数所有结点
【算法描述】
int ListLength_L(LinkList L){
LinkList p;
p=L->next; //p指向首元结点
int i=0;
while(p){
i++;
p=p->next;
}
return i;
}
重要操作:
p=L; //p指向头结点
s=L->next; //s指向首元结点
p=p->next; //p指向下一结点