单向链表的节点插入与删除
来源:互联网 发布:淘宝开店培训班多少钱 编辑:程序博客网 时间:2024/05/16 07:07
理解了链表的创建后,其他链表操作也变得比较简单,对上次的代码做了些修改,今天来记录一下自己对链表节点的插入与删除操作的学习。
在某个节点后插入节点
struct node *insert(struct node *head, int datanum, struct node *new){ struct node *p1; if(head == NULL)//是空链表时 { head = new;//让头结点指向新建的节点 new->next = NULL;//新节点的下一位为空,只有头结点 n = n+1; return head; } p1 = head; while(p1->datanum != datanum && p1->next != NULL) { p1 = p1->next; } if(p1->datanum == datanum)//在p1指向的节点的数据号后面插入新链表 { new->next = p1->next;//p1的next保存的下一个节点位置给新节点的next p1->next = new;//新节点成为p1的下一个节点 n = n+1;//节点数+1 } else { printf("not found datanum%d\n",datanum); } return head; make5.c };
删除某个节点
struct node *delete(struct node *head, int datanum){ struct node *p1; struct node *p2; if(head == NULL)//头指针为空则打印信息并返回 { printf("空链表\n"); return 0; } p1 = head;//p1保存头结点 { p2 = p1; p1 = p1->next; } if(p1->datanum == datanum)//当找到需要删除的数据号时 { if(p1 == head)//如果要删除头结点 { head = p1->next;//让头结点后移一位 } else { p2->next = p1->next;//把p1的next指向的节点让p2的next保存 } free(p1);//释放掉p1 p1 = NULL;//避免p1成为野指针 printf("successed delete datanum%d\n", datanum); n = n-1;//节点少一个 } else { printf("not found datanum%d\n",datanum); } return head;//返回头指针};
代码示例,删除与插入
/********************************************************************************* * Copyright: (C) 2017 fanmaolin<fanmaolinn@gmail.com> * All rights reserved. * * Filename: make5.c * Description: This file * * Version: 1.0.0(08/05/2017) * Author: fanmaolin <fanmaolinn@gmail.com> * ChangeLog: 1, Release initial version on "08/05/2017 11:18:55 AM" * ********************************************************************************/#include <stdio.h>#include <stdlib.h>#define LEN sizeof(struct node)struct node{ int datanum;//数据号 int data;//存储数据 struct node *next;//指向下一个节点};int n;//统计是第几个节点struct node *creat(){ struct node *head;//头指针,指向第一个节点 struct node *p1 = NULL;//p1保存创建的新节点的地址 struct node *p2 = NULL;//p2保存原链表最后一个节点的地址 n = 0; p1 = (struct node *)malloc(LEN);//新建一个节点 p2 = p1; if(p1==NULL)//创建节点失败 { printf("creat fail\n"); return 0; } else { head = NULL;//头指针为空 printf("please input %d node\n",n+1); scanf("%d %d",&(p1->datanum), &(p1->data));//输入数据 } while((p1->datanum)!=0) //循环进行的条件 { n = n + 1;//计算创建的节点数 if(n==1) { head = p1;//head保存头结点的位置 p2->next = NULL;//因为前面p1 = p2,而且现在只有一个节点,把next设置为空 } p2->next = p1;//当不是第一个节点时,p2的next指向p1新创建的节点 } p2 = p1;//p2保存p1的指向的节点,为p1创建新的节点做准备 printf("Please input %d node\n", n+1); scanf("%d %d", &(p1->datanum), &(p1->data));//向新的节点输入数据 } p2->next = NULL;//最后一个节点指向为空 free(p1);//释放结束时p1申请的内存空间 p1 = NULL;//避免p1成为野指针 return head;//返回头指针};void print(struct node *head){ struct node *p; p = head; { //打印节点的地址,数据,下一个节点的地址 p = p->next;//p指向下一个节点 }while(p != NULL);};struct node *delete(struct node *head, int datanum){ struct node *p1; struct node *p2; if(head == NULL)//头指针为空则打印信息并返回 { printf("空链表\n"); return 0; } p1 = head;//p1保存头结点 { p2 = p1; p1 = p1->next; } if(p1->datanum == datanum)//当找到需要删除的数据号时 { if(p1 == head)//如果要删除头结点 { head = p1->next;//让头结点后移一位 } else { p2->next = p1->next;//把p1的next指向的节点让p2的next保存 } free(p1);//释放掉p1 p1 = NULL;//避免p1成为野指针 printf("successed delete datanum%d\n", datanum); n = n-1;//节点少一个 } else { printf("not found datanum%d\n",datanum); } return head;//返回头指针};struct node *insert(struct node *head, int datanum, struct node *new){ struct node *p1; if(head == NULL)//是空链表时 { head = new;//让头结点指向新建的节点 new->next = NULL;//新节点的下一位为空,只有头结点 n = n+1; return head; } p1 = head; while(p1->datanum != datanum && p1->next != NULL) { p1 = p1->next; } if(p1->datanum == datanum)//在p1指向的节点的数据号后面插入新链表 { new->next = p1->next;//p1的next保存的下一个节点位置给新节点的next p1->next = new;//新节点成为p1的下一个节点 n = n+1;//节点数+1 } else { printf("not found datanum%d\n",datanum); } return head; make5.c };int main(){ struct node *head; struct node *new; int datanum; head = creat(); print(head); /*插入一个节点*/ new = (struct node *)malloc(LEN);//创建新节点 printf("Please input insert node datanum and data:"); scanf("%d %d", &(new->datanum), &(new->data)); printf("insert behind datanum:");//选择在哪一个节点的数据号后面插入新节点 scanf("%d", &datanum); head = insert(head, datanum, new); print(head); /*删除一个节点*/ printf("you want delete :");//输入要删除的节点的数据号 scanf("%d",&datanum); head = delete(head, datanum); print(head);}
检查运行结果
[fanmaolin@Centeros lianbiao]$ gcc make5.c [fanmaolin@Centeros lianbiao]$ ./a.out please input 1 node11Please input 2 node22Please input 3 node33Please input 4 node55Please input 5 node00head is 226550020p is 226550020 ,datanum is 1, data is 1, pnext is 226550060p is 226550060 ,datanum is 2, data is 2, pnext is 226550120p is 226550120 ,datanum is 3, data is 3, pnext is 226550160p is 226550160 ,datanum is 5, data is 5, pnext is 0Please input insert node datanum and data:4 666insert behind datanum:3head is 226550020p is 226550020 ,datanum is 1, data is 1, pnext is 226550060p is 226550060 ,datanum is 2, data is 2, pnext is 226550120p is 226550120 ,datanum is 3, data is 3, pnext is 226550220p is 226550220 ,datanum is 4, data is 666, pnext is 226550160p is 226550160 ,datanum is 5, data is 5, pnext is 0you want delete :5successed delete datanum5head is 226550020p is 226550020 ,datanum is 1, data is 1, pnext is 226550060p is 226550060 ,datanum is 2, data is 2, pnext is 226550120p is 226550120 ,datanum is 3, data is 3, pnext is 226550220p is 226550220 ,datanum is 4, data is 666, pnext is 0//我在数据号为3的节点后面插入数据号为4的几点,插入数据为666;删除了数据号为5的节点
阅读全文
0 0
- 单向链表的节点插入与删除
- 单向链表插入与删除
- 删除单向链表的部分节点
- 单向链表的节点删除
- 删除单向链表的指定节点
- 单向链表的插入删除代码
- 单向链表的创建 删除 插入
- 单向链表删除节点
- 单向链表删除节点
- 单向链表删除节点
- 单向链表删除节点
- 双向链表的插入与删除节点
- 单链表的插入节点与删除节点
- 单向链表插入新节点
- 单向链表(二) 删除指定位置的节点
- 删除单向链表中的节点
- 删除单向链表中的某一个节点
- C++单向链表之删除节点
- WeixinJSBridge is not defined的解决方案
- 数据库中差集的使用
- MFC对话框标题栏颜色自绘,标题栏由过渡色组成,自绘关闭按钮
- 下载及运行Github的React Native开源项目
- Android Studio 快捷键
- 单向链表的节点插入与删除
- 用私有构造器或者枚举类型强化Singleton属性。
- 五本书籍助你从零基础学习java编程到精通之路
- sqoop安装
- Dagger2关键字之注解
- prompt(1) to win -----XSS学习笔记
- io流
- Unity中Invoke和InvokeRepeating
- 生活在孤独的思考中走过