c语言链表各种操作
2017-06-28 10:18
477 查看
实现链表的数据查询, 计数,翻转,插入,删除,
#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) { 4000 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"); }
相关文章推荐
- [C语言]单链表各种基本操作
- C语言各种链表操作(创建、打印、删除、插入、反转)
- C语言链表各种操作
- 对链表各种操作的实现(C语言)
- C:C语言实现的链表及其各种链表操作
- 单循环链表各种操作的C语言实现
- [C语言]双链表各种基本操作
- 带头结点和不带头结点的单链表的尾插法以及各种操作
- SPLAY树各种操作--链表
- 单链表相关操作之C语言实现:插入,删除,倒转,复制,查找。。。
- C语言 链表操作
- C语言链表操作(新增单向链表的逆序建立)
- 常见算法:C语言中链表的操作(创建,插入,删除,输出)
- c语言链表操作
- 链表基本操作(C语言)
- 链表的各种操作
- 单链表各种操作
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- 单链表的各种操作
- 2.简单链表操作_C语言