链表
来源:互联网 发布:全国房地产数据 编辑:程序博客网 时间:2024/06/14 20:36
#include <stdio.h>#include <stdlib.h>#include <malloc.h>typedef struct Link{ int data;//定义节点的数据 struct Link *next;//定义指向下一个结点的指针}L;//定义一个别名为 L 的链表//表尾插入节点建立链表L *AppendNode(L *head){ int d; L *p1=NULL, *p2=head;//定义两个空指针 p1 = (L *)malloc(sizeof(L));//为了新建节点申请分配内存空间 if(p1==NULL) { printf("ERROR!\n"); exit(0); }//如果内存申请分配失败,则提示错误后退出程序 else if(head==NULL) { head = p1; }//如果内存申请分配成功并且链表为空表,则置新建节点为头结点 else { while(p2->next != NULL) { p2 = p2->next; }//如果指针未到表尾,则直接移动指针直到指针 p2 指向表尾 p2->next = p1; }//如果原链表非空,则将新建节点添加到表尾 p2 = p1; printf("please input data:"); scanf("%d", &d); p2->data = d; p2->next = NULL; return head;}//遍历链表void DispLink(L *head){ L *p=NULL; p = head;//指针指向头结点 while(p!=NULL)//如果指针指向不为空 { printf("%2d", p->data);//指针指向节点的数据域 p = p->next;//指针指向节点的指针域 } printf("\n");}//释放链表的内存空间void Delete(L *head){ L *p1=NULL, *p2=NULL; p1 = head; while(p1!=NULL) { p2 = p1->next;//指针 p2 指向下一个节点 free(p1);//释放当前节点的内存 p1 = p2;//指针 p1 指向下一个节点的指针 }}//删除链表节点L *DeleteNode(L *head){ int nodedata; L *pa = NULL, *pb = NULL; //提示输入删除节点的数据 printf("delete nodedata:"); scanf("%d", &nodedata); pa = head; //如果链表为空,则输出错误提示,返回头指针 if(head==NULL) { printf("链表为空表!\n"); return (head); } //若沒有找到节点,并且未到链表表尾,则继续查找 while(nodedata != pa->data && pa->next != NULL) { pb = pa; pa = pa->next; } //如果找到该节点,则删除该节点 if(nodedata == pa->data) { if(pa == head){//如果待删除节点为首节点,则改变头结点指针 head 的指向位置 head = pa->next; } else {//如果待删除节点不是首节点,则将前一节点的指针指向当前节点的下一个节点 pb->next = pa->next; } free(pa); } //没有找到待删除节点,则提示查找失败 else { printf("不存在这个数据节点!\n"); } printf("遍历删除节点后的链表:\n"); DispLink(head);//遍历链表 return (head);//返回删除节点的链表头结点指针}//在升序链表中插入节点L *InsertNode(L *head){ int nodedata; L *p = NULL, *pa = NULL, *pb = NULL; //提示输入插入节点的数据 printf("insert nodedata:"); scanf("%d", &nodedata); p = (L *)malloc(sizeof(L)); if(!p)//如果新建节点内存申请失败,则退出程序 { printf("No enough memory!\n"); exit(0); } p->data = nodedata; p->next = NULL; pa = head; //如果链表为空,则输出错误提示,返回头指针 if(head==NULL) { printf("链表为空表!无法插入节点\n"); return (head); } else//若链表非空 { while(nodedata > pa->data && pa->next != NULL)//若沒有找到节点,并且未到链表表尾,则继续查找 { pb = pa; pa = pa->next; } //如果找到该节点插入位置,则插入该节点 if(nodedata < pa->data) { if(pa == head){//在首节点插入新建节点 head = p; p->next = pa; } else {//如果待插入节点不是首节点,则将前一节点的指针指向当前节点 p->next = pb->next; pb->next = p; } } else//如果未找到该节点插入位置,且新建节点数据值比链表中的所有数据值大,则把新插入的节点插到表尾 { pa->next = p; p->next = NULL; } } printf("遍历插入新节点后的链表:\n"); DispLink(head);//遍历链表 return (head);//返回删除节点的链表头结点指针}//主函数,驱动测试void main(){ L *head = NULL; int i = 0, n = 5; int nodedata_1, nodedata_2;//分别定义一个插入节点,一个删除节点 for(i=0; i<n; i++) { head = AppendNode(head); } //遍历链表 printf("遍历原始链表:\n"); DispLink(head); //删除链表节点 DeleteNode(head); //插入链表节点 InsertNode(head); //释放链表的内存空间 Delete(head);}
阅读全文
0 0
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 之江学院 qwb has a lot of Coins 博弈
- springmvc异常处理
- Android客户端面试基础(五)-数据结构与算法
- HDU 4569 Special equations 枚举
- Python中map()函数浅析
- 链表
- HTML中的<ul>标签中li横向排列
- datalist不能添加点击事件onclick, select可以添加onclick
- UE4笔记---UMG对象指针转换成Slate对象指针并调用Slate方法
- Grails Controller层
- 关于路由汇聚计算
- LRU缓存策略设计
- java.net.UnknownHostException: hadoop
- openCV之高斯滤波(及代码实现)