C语言:循环双链表的创建,插入,删除
来源:互联网 发布:spring 源码书籍 编辑:程序博客网 时间:2024/05/16 17:10
/*双向循环链表的创建,插入,删除*/# include <stdio.h># include <malloc.h>//节点类型typedef struct node{int data;struct node * pNext;struct node * pPrior;}NODE, *PNODE;PNODE creat_list(); //建立链表void traverse(PNODE pHead); //遍历链表void insert(PNODE pHead, int pos, int val); //在链表的第pos位置插入元素valint Length(PNODE pHead); //求链表的长度void getEle(PNODE pHead, int pos); //获取第pos位置的前驱、后继元素void dele(PNODE pHead, int pos); //删除第pos位置的元素int main(void){PNODE pHead = creat_list(); //创建循环双链表traverse(pHead);//在第pos节点前插入新节点printf("在第1个节点前插入4:");insert(pHead, 1, 4);traverse(pHead);//获取pos位置的前驱、后继getEle(pHead, 2);getEle(pHead, 3);//删除第pos位置的元素printf("删除第4个节点:");dele(pHead, 4);traverse(pHead);return 0;}//创建循环双链表PNODE creat_list(){int len;int val;int i;PNODE pHead = (PNODE)malloc(sizeof(NODE)); //创建头结点pHead->pNext = pHead;pHead->pPrior = pHead;PNODE pTail = pHead;PNODE pNew;printf("链表节点个数为 len = ");scanf("%d", &len);for(i = 0; i < len; i++){printf("输入第%d个节点的值:", i+1);scanf("%d", &val);pNew = (PNODE)malloc(sizeof(NODE));pNew->data = val;pNew->pPrior = pTail;pNew->pNext = pHead;pTail->pNext = pNew;pTail = pNew;}return pHead;}//遍历链表void traverse(PNODE pHead){PNODE p = pHead->pNext;while(p != pHead){printf("%d ", p->data);p = p->pNext;}printf("\n");}//在第pos位置前插入元素valvoid insert(PNODE pHead, int pos, int val){PNODE p = pHead->pNext; //p指向首节点PNODE pNew = (PNODE)malloc(sizeof(NODE));pNew->data = val;int len = Length(pHead);int count = 0; //计数器if(1 == pos) //新节点插在首节点前{pNew->pNext = p;p->pPrior = pNew;pNew->pPrior = pHead;pHead->pNext = pNew;}//获取第pos-1个节点的指针p,新节点插在p后面else if(pos > 1 && pos <= len + 1) {while(p != pHead){count ++;if(count == pos - 1){pNew->pNext = p->pNext;p->pNext->pPrior = pNew;p->pNext = pNew;pNew->pPrior = p;break;}p = p->pNext;}}else{printf("插入位置错误");return;}}//求链表的长度int Length(PNODE pHead){int len = 0;PNODE p = pHead->pNext; //p指向首节点while(p != pHead){len ++;p = p->pNext;}return len;}//获取第pos个节点的前驱,后继void getEle(PNODE pHead, int pos){PNODE p = pHead->pNext;int count = 0;while(p != pHead){count ++;if(count == pos) //获取第pos节点的指针{if(p->pPrior == pHead){printf("第%d个节点的前驱数头结点\n", pos);}else{printf("第%d个节点的前驱是:%d\n", pos, p->pPrior->data);}if(p->pNext == pHead){printf("第%d个节点的后继数头结点\n", pos);}else{printf("第%d个节点的后继是:%d\n", pos, p->pNext->data);}}p = p->pNext;}}//删除第pos节点void dele(PNODE pHead, int pos){PNODE p = pHead->pNext;int count = 0;int len = Length(pHead);if(1 == pos) //删除首节点{pHead->pNext = p->pNext;p->pNext->pPrior = pHead;}else if(pos > 1 && pos < len + 1){while(p != pHead){count ++;if(count == pos - 1) //获取第pos-1节点的指针p{p->pNext = p->pNext->pNext;p->pNext->pNext->pPrior = p;break;}p = p->pNext;}}else{printf("删除位置错误");return ;}}
0 0
- C语言:循环双链表的创建,插入,删除
- C语言实现循环列表【创建、插入、删除】
- c语言单链表的创建、插入、删除
- C语言:循环单链表的创建,遍历,插入
- C/C++学习(九)循环双链表的操作之创建,插入、删除
- c语言链表的创建、插入、删除、排序
- C语言单链表的创建,插入,删除,逆致
- C语言实现单链表的创建、插入、删除
- C语言单链表创建,插入,删除
- 双链表的创建,求长,插入,删除,打印,释放(循环和非循环)
- C语言中单向非循环链表的生成,遍历,排序,插入和删除
- 双链表的创建、插入、删除
- 双链表的创建、插入、删除
- 双链表的创建、删除、插入
- c语言 单链表的插入与删除
- 关于c语言编写 顺序表 的创建、插入、修改、删除、显示、退出 的程序案例
- C语言实现带头结点的链表的创建、查找、插入、删除
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- 南邮 OJ 1202 字典序问题
- 数据结构——各类排序算法总结
- 如何在Outlook Express中使用MathType
- AsyncTask我来给你扯会蛋
- OpenStack Ceilometer 简介
- C语言:循环双链表的创建,插入,删除
- Android 实时监听网络状态
- POJ1011 Sticks(dfs)
- Microsoft Office Outlook 2007 数据文件位置修改
- 广告轮播效果的javascript实现
- 图片切圆,label文字底部加一条线,自定义view的透明度渐变效果
- CSS3练习总结——RGBA
- QTP的退出函数
- 通过IP地址和子网掩码计算相关地址