链表
链表的运用非常广泛,而对于一个链表的创建,常见的方法有头插法和尾插法,而对于链表的增删改查的函数又可以以直接接受数据为主和接受节点指针为主,上一篇文章中我就接受数据为主做了一个尾插法的链表完整源代码,这次就利用传递节点的指针为主,重新构建一个能实现链表的四个操作的函数.
(本人作为一个初学者,此篇文章主要以记录学习过程为主,不足之处或有错误的地方往大佬下手轻点).
(要放假了,懒得写详细注释了哎嘿).
首先创建结构体
typedef struct link{
int a;
struct link* next;
}link;
创建头尾节点指针
struct link* head;
struct link* end;
声明我们的多个函数
(这里我多创建了几个函数,能更方便的实现各种功能)
link* list_point();//申请临时头指针
void list_add(link*);//尾添加一个链表
void list_input(int*, link*);//指定插入链表
link* list_find(int*);//找到链表所在位置
void list_printf();//打印全部链表
void list_delete(link*);//删除指定链表
void list_change(link*, link*);//修改指定链表
申请临时头指针
link* list_point(){
link* point;
point = (link*)malloc(sizeof(head));
if (point == NULL){
printf("申请地址空间失败\n");
free(point);
return NULL;
}
point = head;
return point;
}
这个函数能在我们后边查找对应的节点时直接使用,节约代码量,比如在插入一段节点时,需要找到要插入节点的位置.
定义添加节点函数
void list_add(link* lb){
if (head == NULL){
head = lb;
end = lb;
end->next = NULL;
}
else
{
end->next = lb;
end = lb;
end->next = NULL;
}
}
找到并返回对应节点指针函数
link* list_find(int* data){
link* point = list_point();
while (point->next != NULL){
if (point->a == *data){
return point;
}
point = point->next;
}
return point;
}
利用这个函数,我们能直接得到需要节点的地址
插入节点函数
void list_input(int *data, link* lb_next){
link* point = list_point();
int num1 = *data;
point = list_find(&num1);
if (point->next == NULL){
point->next = lb_next;
lb_next->next = NULL;
return;
}
lb_next->next = point->next;
point->next = lb_next;
return;
}
打印全部节点数据
void list_printf(){
link* point = list_point();
while (point->next != NULL){
printf("%d", point->a);
point = point->next;
}
printf("%d", point->a);
return;
}
删除指定节点函数
void list_delete(link* lb){
link* point = list_point();
while (point->next != lb){//将要删除的前后节点连接起来
point = point->next;
}
point->next = lb->next;
}
改变指定节点函数
void list_change(link* lb, link* lb_change){
link* point = list_point();
while (point->next != lb){
point = point->next;
}
point->next = lb_change;
lb_change->next = lb->next;
}
逐一验证各个函数
int main(int argc, char* argv[]){
link lb1;
lb1.a = 1;
link lb2;
lb2.a = 2;
link lb3;
lb3.a = 3;
list_add(&lb1);
list_add(&lb2);
list_add(&lb3);
printf("第一次创建了3个链表后的数据为:\n");
list_printf();
printf("\n");//结果为123
link lb4;
lb4.a = 4;
list_input(&lb3.a, &lb4);
printf("添加了链表四后的数据为:\n");
list_printf();
printf("\n");//结果为1234
list_delete(&lb4);
printf("删除链表四后的数据为:\n");
list_printf();
printf("\n");//结果为123
list_change(&lb2, &lb4);
printf("将2链表改为4链表后的数据为\n");
list_printf();
printf("\n");//结果为143
link lb5;
lb5.a = 5;
list_input(&lb1.a, &lb5);
printf("在1链表后添加5链表后的数据为\n");
list_printf();
printf("\n");//结果为1543
return 0;
}
运行结果如下:
由此可见,我们对链表的增删改查操作都已经通过各个函数实现.因为使用的节点的指针,我们需要先创建一个结构体才能使用这一系列操作.文中可能存在很多不足之处,往大佬们能指出共同进步!