数据结构学习(五)——循环双链表的操作之创建,插入、删除
来源:互联网 发布:香港有没有网络教肓 编辑:程序博客网 时间:2024/05/16 07:44
双链表的含义就是链表结构体中有两个指针域,一个指向前一个结点,另一个指向后一个结点。下面的代码是对循环双链表的操作练习。
#include <stdio.h>#include <stdlib.h>typedef struct list{char data;struct list *prior;struct list *next;}dlinklist;dlinklist *CreateLinklist_End();//尾插法创建循环双链表void ShowLinklist(dlinklist *h);//输出显示链表int DLinklist_Insert(dlinklist *h, char dat, int pos);//双链表按指定位置插入结点int DLinklist_Delete(dlinklist *h, int pos);//双链表按指定位置删除结点int main(void){dlinklist *head;int choice, pos, ans;char dat;printf("循环双链表的操作练习\n");printf("创建循环双链表,请依次输入字符数据('#'表示结束):\n");head = CreateLinklist_End();while(1){printf("对双链表操作:\n");printf("1.在指定位置插入一个结点\n");printf("2.删除指定位置的结点\n");printf("3.输出显示链表\n");printf("4.退出程序\n");printf("做出选择:\n");scanf("%d", &choice);getchar();switch(choice){//链表结点的插入case 1:printf("请输入你想插入的字符及位置,空格隔开:\n");scanf("%c %d", &dat, &pos);ans = DLinklist_Insert(head, dat, pos);if(ans)printf("插入成功!\n");elseprintf("插入失败!\n");break;//链表结点的删除case 2:printf("请输入你想删除的结点位置:");scanf("%d", &pos);ans = DLinklist_Delete(head, pos);if(ans)printf("删除结点成功!\n");elseprintf("删除结点失败!\n");break;//输出显示链表case 3:ShowLinklist(head);break;//退出程序case 4:return 0;break;default:printf("选择无效!\n");break;}}return 1;}//尾插法创建链表dlinklist *CreateLinklist_End(){dlinklist *head, *p, *e;char ch;head = (dlinklist*)malloc(sizeof(dlinklist));e = head;ch = getchar();while(ch != '#'){p = (dlinklist*)malloc(sizeof(dlinklist));p->data = ch;p->prior = e;e->next = p;e = p;ch = getchar();}e->next = head;//尾结点的后指针指向头指针head->prior = e;//头指针的前指针指向尾结点return head;}int DLinklist_Insert(dlinklist *h, char dat, int pos){dlinklist *p, *s;int i=0;p = h;while(i<pos-1 && p->next != h)//找到指定位置结点的前一个结点{i++;p = p->next;}if(i != pos-1)return 0;p = p->next;s = (dlinklist*)malloc(sizeof(dlinklist));s->data = dat;s->prior = p->prior;//核心插入结点操作代码p->prior->next = s;s->next = p;p->prior = s;return 1;}//删除指定位置结点int DLinklist_Delete(dlinklist *h, int pos){dlinklist *p;int i = 0;p = h;while(i<pos && p->next!=h)//找到指定位置结点{i++;p = p->next;}if(i != pos || i == 0)return 0;p->prior->next = p->next;//删除结点核心代码p->next->prior = p->prior;free(p);return 1;}//输出显示链表void ShowLinklist(dlinklist *h){dlinklist *p;p = h->next;while(p != h){printf("%c ", p->data);p = p->next;}printf("\n");}
下面学习的就是另外一种数据结构了——队列
- 数据结构学习(五)——循环双链表的操作之创建,插入、删除
- 写给初学数据结构的同学之(循环双链表基本操作,创建,插入,删除,排序)
- C/C++学习(九)循环双链表的操作之创建,插入、删除
- 数据结构之 双链表的创建,删除,插入
- 数据结构学习(三)——单链表的操作之查找、删除、插入。
- 数据结构——单链表的创建、删除、遍历以及节点的插入、删除等操作
- 算法学习-数据结构之链表操作,创建,插入,删除,查找。
- 数据结构之链表操作,创建,插入,删除,查找。
- 双向循环链表的创建,插入,删除操作
- 双向循环链表的创建修改插入删除操作
- C语言之数据结构的顺序单链表创建,插入和删除操作
- 数据结构之 单链表的基本操作(创建、取值、插入、删除)
- 数据结构—链表的定义、创建、遍历、插入、删除
- 数据结构之顺序表的创建、插入、删除、定位
- 数据结构之循环链表操作3-(合并,拆分,插入,删除,建立等)
- 数据结构之双向循环链表操作4-(插入,删除,建立等)
- c++实现循环单链表的相关操作(创建,插入,删除,保序插入,统计结点)
- 数据结构之单链表——带有节点的单链表的创建、插入和删除(C/C++)
- VIM用户手册学习1
- 使用 Eclipse Memory Analyzer 进行堆转储文件分析
- 韩顺平_轻松搞定网页设计(html+css+javascript)_第21讲_js运算符2_js移位运算_学习笔记_源代码图解_PPT文档整理
- js调试
- 用户体验测试
- 数据结构学习(五)——循环双链表的操作之创建,插入、删除
- 使用 Eclipse Memory Analyzer 检测内存泄漏问题
- HOJ 1696 No Brainer
- 存储过程示例
- 【STL】vector的insert方法详解
- WARN No appenders could be found for logger的解决方法
- Java字符集编码
- windows 版Tomcat 7.0的配置
- HDOJ2023 求平均成绩