c语言链表各种操作
来源:互联网 发布:档案软件 编辑:程序博客网 时间:2024/05/18 03:04
实现链表的数据查询, 计数,翻转,插入,删除,
#include<stdio.h>#include<stdlib.h>typedef struct linknode // 定义结构体 //typedef 简化创建的struct{ int data; struct linknode *pnext;}node;void init(node *phead, int data) //初始化头结点 { phead->pnext = NULL; phead->data = 0;}node *deletefirst(node*phead, int findata) //删除找到的data{ node *p1=NULL,*p2=NULL; //双指针法 p1 = phead; //保存头结点 while(p1 != NULL) { if(p1->data != findata) { p2 = p1; //p2保存p1上一个位置 p1 = p1->pnext; //向前移动 } else { break; } } if(p1 != phead) //不是头结点 { p2->pnext = p1->pnext; //跳过p1 free(p1); //删除p1 } else { phead = phead->pnext; free(p1); //头部删除 } return phead;}//尾部添加数据node *addback(node *phead , int data) { node *pnew = (node*)malloc(sizeof(node)); //创建结构体指针变量pnew 并动态分配内存 pnew->data = data; pnew->pnext = NULL; //尾指针的pnext字段设置为null if(phead == NULL) { phead = pnew; //直接相连 } else { node *ptemp = phead; //备份头结点 while(ptemp->pnext != NULL) { ptemp = ptemp->pnext; } ptemp->pnext = pnew; } return phead;}// 显示链表void show(node *phead){ if(phead == NULL) { return; } else { printf("%d, %p, %p\n",phead->data, phead, phead->pnext); show( phead->pnext ); //递归调用 全部显示 }}void addhead(node **pphead, int data) //头部插入{ node *pnew = (node *)malloc(sizeof(node)); pnew->data = data; pnew->pnext = NULL; //先赋值为null if(pphead == NULL) { *pphead = pnew; //直接连接 } else { pnew->pnext = *pphead; *pphead = pnew; }}//链表的啊反转 node *revit(node *phead){ if(phead == NULL || phead->pnext == NULL) { return; } else { node *pre = NULL; //创建3个指针 node *pcur = NULL; //当前节点指针 node *pext = NULL; //当前节点下一个节点指针 pre = phead; //让pre为当前头结点 pcur = phead->pnext; while(pcur != NULL) { pext = pcur->pnext; //备份下一个节点 pcur->pnext = pre; //指针翻转 pre = pcur; //前进 pcur = pext; } phead->pnext = NULL; phead = pre; } return phead;}//查找数据node *search(node*phead, int finddata){ node *p; for(p = phead;p!=NULL;p=p->pnext) { if(p->data == finddata) { return p; //返回找到地址 } } return NULL;}//在链表中插入数据node *insert(node*phead, int finddata, int newdata){ node *pew; node *p1=NULL,*p2=NULL; //双指针法 p1 = phead; //保存头结点 pew = (node *)malloc(sizeof(node)); //创建pew结构体指针 并动态分配内存 pew->data = newdata; //吧新数据赋给pew的数据域 pew->pnext = NULL; while(p1 != NULL) { if(p1->data != finddata) { p2 = p1; //p2保存p1上一个位置 p1 = p1->pnext; //向前移动 } else { break; } } if(phead==p1) { pew->pnext = phead; //保存头结点 phead = pew; //头部插入 } else { pew->pnext = p1; p2->pnext = pew; }}//获取当前链表的数量int getnum(node *phead){ if(phead == NULL) { return 0; } else { return 1+ getnum(phead->pnext); //向后传递参数 }}//冒泡排序void bubble(node *phead){ node *p1,*p2; for(p1 = phead; p1!=NULL;p1 = p1->pnext) //用双for循环 双指针 { for(p2 = phead; p2 != NULL; p2=p2->pnext) { if(p1->data>p2->data) //判定大小 { int temp; temp = p1->data; //交换数据 p1->data = p2->data; p2->data = temp; } } }}//bubble(phead);void main(){ node *phead = NULL; //init(phead,0); phead=addback(phead, 11); phead=addback(phead, 12); phead=addback(phead, 13); phead=addback(phead, 14); phead=addback(phead, 15); show(phead); phead = revit(phead); printf("\n\n\n"); //addhead(&phead, 20); //node *pfind = search(phead,13 ); //pfind->data = 99; //修改13 /*phead = deletefirst(phead, 11); phead = deletefirst(phead, 12);*/ printf("%d", getnum(phead)); phead = insert(phead, 13,88); phead = insert(phead, 11,77); show(phead); system("pause");}
阅读全文
0 0
- C语言链表各种操作
- c语言链表各种操作
- 单循环链表各种操作的C语言实现
- 对链表各种操作的实现(C语言)
- C语言各种文件操作
- (C语言)自拟顺序表的各种操作
- C语言各种链表操作(创建、打印、删除、插入、反转)
- C语言实现单链表的各种操作
- c语言单链表的各种操作<未完>
- C语言各种操作符介绍
- C语言 链表操作
- C语言 链表操作
- c语言链表操作
- c语言链表操作
- C语言 -- 链表操作
- c语言链表操作
- c语言链表操作
- C语言常用的各种操作字符串的函数
- Mockito 使用
- console.dir()和console.log()的区别
- jmeter个人学习之路--参数化设置
- 二叉排序树的实现(python)
- 大饼玩Kettle之Hello World Example
- c语言链表各种操作
- 使用Xcode自带单元测试UnitTest
- angularjs表单验证
- APP中的“去好评”功能的实现
- PostGIS常用函数
- 延迟队列DelayQueue
- H5滚动翻页 2
- 数据库题目参考答案
- CMarkup类解析xml文件 例子