博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构之C语言实现链表的操作
阅读量:6708 次
发布时间:2019-06-25

本文共 5426 字,大约阅读时间需要 18 分钟。

1 /*  2             链表节点的插入与删除  3   4        编译环境:VC++ 6.0||VC++2008||......  5        编译系统:windows   6 */  7   8 #include 
9 #include
10 #include
11 12 // 定义链表中的节点 13 typedef struct node 14 { 15 int member; // 节点中的成员 16 struct node *pNext; // 指向下一个节点的指针 17 }Node,*pNode; 18 19 // 函数声明 20 pNode CreateList(); // 创建链表函数 21 void TraverseList(pNode ); // 遍历链表函数 22 bool Insert_Node(pNode ,int ,int); // 链表节点插入函数,第一个参数是头节点,第二个参数是要在第几个节点前插入,第三个参数是要插入的数据 23 int Del_Node(pNode,int ); // 删除链表节点,第一个参数是头节点,第二个参数是删除第几个节点,第三个作为 24 int main() 25 { 26 pNode pHead = NULL; // 定义初始化头节点,等价于 struct Node *pHead == NULL 27 int data; // 作为Insert_Node函数的第三个参数 28 int num; // 作为Inset_Node函数第二个参数 29 int choose; 30 int return_val; 31 pHead = CreateList(); // 创建一个非循环单链表,并将该链表的头结点的地址付给pHead 32 printf("你输入的数据是:"); 33 TraverseList(pHead); // 调用遍历链表函数 34 printf("是否还要进行如下操作:\n"); 35 printf("1.插入数据 2.删除数据\n"); 36 printf("请输入:"); 37 scanf("%d",&choose); 38 switch (choose) 39 { 40 case 1: 41 { 42 printf("请输入要在第几个节点前插入数据:"); 43 scanf("%d",&num); 44 printf("请输入要插入的数据:"); 45 scanf("%d",&data); 46 if(Insert_Node(pHead,num,data) == true) 47 { 48 printf("插入成功\n插入后的数据是:\n"); 49 TraverseList(pHead); 50 } 51 else 52 { 53 printf("插入失败\n"); 54 } 55 printf("操作完成后的数据是:"); 56 TraverseList(pHead); 57 break; 58 } 59 case 2: 60 { 61 printf("请输入要删除第几个节点的数据:"); 62 scanf("%d",&num); 63 return_val = Del_Node(pHead,num); 64 if (return_val == 0) 65 { 66 printf("删除失败。\n"); 67 } 68 else 69 { 70 printf("删除成功。删除的元素是:%d\n",return_val); 71 } 72 printf("操作完成后的数据是:"); 73 TraverseList(pHead); 74 } 75 } 76 return 0; 77 } 78 79 // 创建链表函数 80 pNode CreateList() 81 { 82 int i; // 用于下面循环 83 int len; // 用来存放有效节点的字数 84 int val; // 用于临时存放用户输入的数据 85 pNode pHead = (pNode)malloc(sizeof(Node)); // 分配一个不存放有效数据的头结点 86 pNode pTail = pHead; // 链表的最后一个节点 87 pTail->pNext = NULL; // 最后一个节点的指针置为空 88 printf("请输入节点个数:"); 89 scanf("%d",&len); 90 for(i = 0; i < len; i++) 91 { 92 printf("第 %d 个节点的数值:",i+1); 93 scanf("%d",&val); 94 pNode pNew = (pNode)malloc(sizeof(Node)); // 为节点分配空间 95 pNew->member = val; //将用户输入的数据赋给节点的成员 96 pTail->pNext = pNew; //将最后一个节点的指针指向下一个新的节点 97 pNew->pNext = NULL; //将新节点中的指针置为空 98 pTail = pNew; //将新节点赋给最后的一个节点 99 }100 return pHead; //返回头节点101 102 }103 104 // 遍历链表函数105 void TraverseList(pNode pHead)106 {107 pNode p = pHead->pNext; //将头节点的指针给予临时节点p108 while(NULL != p) //节点p不为空,循环 109 {110 printf("%d ",p->member); 111 p = p->pNext; 112 }113 printf("\n");114 return ;115 }116 117 // 链表节点插入函数118 // 第一个参数是头节点,第二个参数是要在第几个节点前插入,第三个参数是要插入的数据119 bool Insert_Node(pNode pHead, int front,int data)120 {121 int i = 0;122 pNode _node = pHead;123 pNode pSwap; // 用于交换124 if ((front < 1) && (NULL != _node)) //判断用户输入的数据是否大于等于1,及_node是否为空125 {126 return false;127 }128 while (i < front - 1) //通过循环使指针指向要插入哪个节点前的节点。说的自己都不懂了,还是看下面的图吧。 129 {130 _node = _node->pNext;131 ++i;132 }133 pNode pNew = (pNode)malloc(sizeof(Node));134 135 pNew->member = data; // 把输入的数据赋给要插入的节点136 pSwap = _node->pNext; // 把下一个节点的地址,给用于交换的pSwap137 _node->pNext = pNew; // 把要插入的节点的地址,给上个节点的指针域138 pNew->pNext = pSwap; // 把插入节点的下一个节点的地址,给插入节点的指针域139 return true;140 141 }142 143 // 删除链表节点函数144 // 第一个参数是头节点,第二个参数是要删除第几个节点·······和上面的插入函数是不是很像145 int Del_Node(pNode pHead,int back)146 {147 int i = 0;148 int data;149 pNode _node = pHead;150 pNode pSwap;151 if ((back < 1) && (NULL == _node->pNext))152 {153 printf("删除失败!\n");154 return 0;155 }156 while(i < back-1)157 {158 _node = _node->pNext;159 ++i;160 }161 pSwap = _node->pNext;162 data = pSwap->member;163 _node->pNext = _node->pNext->pNext;164 free(pSwap);165 return data;166 }

 

转载于:https://www.cnblogs.com/zeng-jie/p/4936871.html

你可能感兴趣的文章
正则匹配
查看>>
kindle型号
查看>>
C函数调用与栈--代码真相
查看>>
Objective-C多态:动态类型识别+动态绑定+动态加载
查看>>
spring异常与事务回滚
查看>>
安卓与windows
查看>>
ubuntu wifi连接出现Network service discovery disabled的解决办法
查看>>
hashlib 和 logging模块
查看>>
你不知道的JavaScript(九)switch语句
查看>>
备战招聘——信息获取与简历制作
查看>>
每天一得,能得就得~~^_^
查看>>
jsp快速学习
查看>>
01Oracle数据库系统环境搭建
查看>>
实时同步方式
查看>>
Android URLConnection发送Get请求 HttpGet封装
查看>>
在页面上实现无缝滚动
查看>>
Windows 编程1
查看>>
sublime Text使用技巧及常用插件
查看>>
Css3 Transition
查看>>
CABasicAnimation的基本使用方法(移动·旋转·放大·缩小)
查看>>