数据结构学习日记(二)
单链表是由头指针唯一确定, 因此单链表可以用头指针的名字来命名。

typedef struct Lnode{//声明结点的类型和指向结点的指针类型
ElemType data; //结点的数据域
struct Lnode * next; //结点的指针域
}Lnode,*LinkList; //LinkList为指向结构体Lnode的指针类型


结点只有一个指针域的链表,称为单链表或线性链表
结点有两个指针域的链表,称为双链表
线性表中数据元素(结点)在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理位置上不一定相邻。
单链表的初始化(带头结点的单链表)

[算法步骤]
(1)生成新结点作头结点,用头指针L指向头结点。
(2)将头结点的指针域置空。
算法描述
Status lnitList L(LinkList &L){
L = new LNode;//或L= (LinkList) malloc ( sizeof (LNode));
L->next = NULL;
return OK;
}
判断链表是否为空:
空表:链表中无元素称为空链表(头指针和头结点仍然在)
[算法思路]判断头结点指针域是否为空
int ListEmpty(LinkList L){//若L为空表,则返回1,否则返回0
if(L->next)
return 0;
else
return 1;
}
单链表的销毁:链表销毁后不存在
[算法思路]从头指针开始,依次释放所有结点

如果用delete,前面要用new
如果替换成free(p),前面也应该替换成malloc()
[算法]销毁单链表L
Status DestroyList_L(LinkList &L){//销毁单链表L
Lnode *p;//或LinkList p;
while(L){
p=L;
L=L->next;
delete p;
}
return OK;
}
清空链表:
链表仍存在,但链表中无元素,成为空链表(头指针和头结点仍然在)
[算法思路]依次释放所有结点,并将头结点指针域设置为空

[算法]清空链表L:
Status ClearList(LinkList &L){//将L重置为空表
Lnode *p,*q;//或LinkList p,q;
p = L->next;
while(p){ //没到表尾
q=p->next;
delete p;
p = q;
}
L->next = NULL; //头结点指针域为空
return OK;
}
求单链表的表长:
[算法思路]从首元结点开始,依次计数所有结点

[算法]求单链表L的表长
int ListLength_L(LinkList L){//返回L中数据元素的个数
LinkList p;
p = l->next;//p指向第一个结点
i=0;
while(p){ //遍历单链表,统计结点数
i++;
p=p->next;
}
return i;
}

浙公网安备 33010602011771号