一.类型声明
struct node;
typedef struct node *ptr;//声明一个结构体指针
typedef ptr position;//都是别名
typedef ptr list;//同样
struct node {
int data;//存储的数据类型,本例中为int类型
position next;//指向下一个数据的指针
};
list MakeEmpty(list L);
int IsEmpty(list L);
int IsLast(position p, list L);
position Find(int x, list L);
position FindPrevious(int x, list L);
void Delete(int x, list L);
void Insert(int x, list L, position p);
void DeleteList(list L);
position Header(list L);//创建哑(头)节点
二.详细代码
创建头(哑)节点即表头
position Header(list L) {
position p;
p = malloc(sizeof(struct node));//为p分配内存
if (p == NULL) {
exit(1);//在stdlib头文件中
//如果分配失败就进行报告,退出进程
}
p->next = NULL;//看图
return p;
}
测试链表是否为空
int IsEmpty(list L) {
//可以用bool类型来测试
return L->next == NULL;//即正常链表为空就返回0,否则返回1
}
所以list->next==NULL时,下一个节点就是空值,即为空表。注意,这个表是带有表头的空表。
测试当前位置是否为表末尾
int IsLast(position p, list L) {
return p->next == NULL;
}//与上一个同理
find例程
注意:上图颜色相同,内存相同。
position Find(int x, list L) {
position p;//定义一个临时指针
p=L->next;
//一直循环到末尾,并且找到x所在位置
while (p->next != NULL && p->next->data != x) {
p = p->next;//相当于向右移动指针
}
return p;//返回当前指针
FindPrevious例程
position FindPrevious(int x, list L) {
position p;//临时指针
p = L;//注意,这块有所不同,为的就是寻找前一个
//一直循环到末尾,并且找到x所在位置
while (p->next != NULL && p->next->data != x) {
p = p->next;
}
return p;
}
Insert例程
void Insert(int x, list L, position p) {
position tmpcell;
//创建新节点
tmpcell = malloc(sizeof(struct node));
//一定要把特殊情况列出来!!!
if (tmpcell == NULL) {
FatalError("Out of space");
}
//进行插入操作
tmpcell->data = x;
tmpcell->next = p->next;
p->next = tmpcell;
}
Delete例程
void Delete(int x, list L) {
position p, tmpcell;
//插入就是先找到前一位
p=FindPrevious(x, L);//这个函数由上可知,返回指针类型
//如果不是链表末尾就可以进行
if (!IsLast(p, L)) {
tmpcell = p->next;//表明要删除的节点
//进行删除操作
p->next = tmpcell->next;
free(tmpcell);//销毁那个节点
}
}
DeleteList例程
void DeleteList(list L) {
position p, tmp;
//假设是哑节点
p = L->next;
L->next = NULL;
while (p != NULL) {
//进行删除操作
tmp = p->next;
free(tmp);
//进行下一轮,更新
p = tmp;
}
}
9.MakeEmpty例程
void MakeEmpty(list L) {
position p;
p = L->next;
while (p->next != NULL) {
p->next = NULL;
}
}