单链表
链表是表ADT的一种链式映像。单链表是链表的一种,即每个结点只有一个指针域,指向和它相连的下一个结点。
(这里的链表是带有头结点的链表)
单链表的结点的声明与定义如下:
//clare node (写于头文件之中)
struct Node;
typedef struct Node *PtrToNode;
typedef struct PtrToNode Position; //指向链表的结点的指针
typedef struct PtrToNode List; //指向链表头的指针(分开来以示区分)
//define node **(写于头文件之中)**
struct Node{
Elementtype Element;
Position Next;
};
单链表上的一些操作:
(其它可自定义)
- int IsEmpty(List L);
- int IsLast(List L, Position P);
- Position Find(Elementtype x, List L); //找到x第一次出现的位置
- void Delete(Elementtype x, List L); //删除第一次出现的x
- void Insert(List L, Position P, Elementtype x); //在P之前插入一个结点,值为x
- void DeleteList(List L);
- Position Advance(List L, Position P);
单链表上对这些操作的定义:
//define node
struct Node{
Elementtype Element;
Position Next;
};
//functions
int IsEmpty(List L) {
return L->Next == NULL;
}
int IsLast(List L, Position P) {
return P->Next == NULL;
}
Position Find(Elementtype x, List L) { //找到x第一次出现的位置
Position p;
P = L->Next;
while (P && P->Element != x)
P = P->Next;
return P;
}
void Delete(Elementtype x, List L) { //删除第一次出现的x
Position P;
P = L;
//找出第一个指向元素x的指针P->Next,因为删除时需要知道结点的前驱,所以要这样查找:
while (P->Next && P->Next->Element != x)
P = P->Next;
//特判: 如果P指向最后一个结点,则说明这个表中不存在x,所以什么也不做。
if (P->Next != NULL) {
//删除P->Next指向的结点
Position Q = P->Next;
P->Next = Q->Next;
free(Q);
}
return;
}
void Insert(List L, Position P, Elementtype x) { //在P之前插入一个结点,值为x
//首先,要确保P不是头结点
if(P == L) return;
//创建一个结点的空间
Position Q;
Q = (Position)malloc(sizeof(Node));
if(!Q) exit(1);
//insert
Position Pre = Advance(Position P);
Q->Next = P;
Pre->Next = Q;
return;
}
void DeleteList(List L) {
Position P = L;
while (P) {
Position Q = P;
P = P->Next;
free(Q);
}
}
Position Advance(List L, Position P) {
//首先要确保P不是NULL且不明头结点
if(P == L || P == NULL) return NULL;
Position Q = L;
while (Q->Next != P && Q->Next)
Q = Q->Next;
return Q;
}
至此单链表实现完毕