单链表的定义和表示
typedef struct{
char name[8]; //数据域
int score; //数据域
}ElemType;
typedef struct Lnode{
ElemType data; //数据域
struct Lnode *next //指针域
}Lnode, *LinkList;
单链表的销毁
从头指针开始,依次释放所有结点
Status Destroy_L(LinkList & L){
Lnode *p; //或Linklist p;
while(L!=NULL){
p=L;
L=L->next;
delete p; //c语言是free(p);
}
return ok;
}
单链表的清空
链表仍存在,但链表中无元素,成为空链表(头指针和头结点仍然存在)
从首元结点开始依次释放所有结点,并将头结点指针域设置为空
Status ClearList(LinkList & L){
Lnode *p,*q; //或Linklist p,q;
p=L->next;
while(p!=NULL){
q=p->next;
delete p; //c语言是free(q);
p=q;
}
L->next=NULL; //头结点指针域为空
return ok;
}
求单链表的表长
从首元结点开始,依次计数所有结点
int ListLength_L(LinkList L){
LinkList p;
p=L->next; //p指向第一个结点
int i = 0;
while(p!=NULL){ //遍历单链表,统计结点数
i++;
p=p->next;
}
return i;
}
查找操作-按序号
从头指针出发,顺着链域next逐个结点往下搜索,直到搜索到第i个结点为止。因此,链表不是随机存取结构。
从第一个结点(L->next)顺链扫描,用指针p指向当前扫描到的结点,p初值为L->next
j做计数器,初值为1
p扫描到下一结点时,计数器+1
当j==i,p所指向的结点即为答案
Status GetElem_L(LinkList L,int i,ElemType &e){
p=L->next; //p指向第一个结点
int j = 1;
while(p!=NULL&&j<i){ //向后扫描,直到p指向第i个元素或p为空
p=p->next;
++j;
}
if(j==i)
return p;
return else;
}
查找操作-按值
从单链表的首元结点开始,判断当前结点的值是否为x,若是则返回该结点的指针,否则继续遍历,找不到则为空
LinkList Locate_LinkList(LinkList L,ElemType x){
LinkList p;
p=L->next;
while(p->data!=x&&p!=NULL){
p=p->next;
}
return p;
}
插入运算
在单链表第i个结点前插入值为x的元素
先查找第i个结点的前驱结点是否存在,若存在则用指针p指向它,否则程序终止运行。然后为新节点申请存储空间并将x值存入数据域,最后通过修改元素之间的链接关系插入新结点