数据结构-C语言实现-双向循环链表
时间:2020-05-21
本文章向大家介绍数据结构-C语言实现-双向循环链表,主要包括数据结构-C语言实现-双向循环链表使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #include<ctype.h> 5 #define NAME 20 6 #define SEX 6 7 typedef struct item{ 8 char *name; 9 char *sex; 10 int age; 11 struct item * front;//前驱,指向上一个结点 12 struct item *rear;//后继,指向下一个结点 13 }ITEM; 14 ITEM * initList(){//返回一个初始化的头结点 15 ITEM * list=(ITEM *)malloc(sizeof(ITEM)); 16 list->front=list->rear=NULL;//头结点初始化时前驱和后继为空 17 return list; 18 } 19 char * GetName(){ 20 char *p=(char *)malloc(sizeof(char)*NAME); 21 printf("请输入名字:"); 22 scanf("%s",p); 23 printf("GetName\n"); 24 return p; 25 } 26 char * GetSex(){ 27 char *p=(char *)malloc(sizeof(char)*SEX); 28 printf("请输入性别:"); 29 scanf("%s",p); 30 printf("GetSex\n"); 31 return p; 32 } 33 int GetAge(){ 34 int age; 35 printf("请输入年龄:"); 36 scanf("%d",&age); 37 printf("GetAge\n"); 38 return age; 39 } 40 void menu(){ 41 printf("键入以下选项来操作,ctrl+z以退出!\nA:添加数据\nB:打印列表\nC:按名插入数据\nD:按名删除数据\nE:按名查找详细信息\n"); 42 } 43 void AddITEM(ITEM *p,char *name,char *sex,int age){ 44 ITEM * item=(ITEM *)malloc(sizeof(ITEM)); 45 ITEM *head=p; 46 item->name=name; 47 item->sex=sex; 48 item->age=age; 49 item->rear=NULL; 50 if(!p->front&&!p->rear){//如果添加的是第一个结点 51 p->rear=item;//头结点的后继指向第一个节点 52 p->front=item;//头结点的前驱指向第一个节点 53 item->front=p;//第一个结点的前驱指向头结点 54 printf("frist!\n"); 55 } 56 else{ 57 head->front->rear=item;//最后一个结点的后继指向新结点 58 item->front=head->front;//新结点前驱指针指向最后一个结点 59 head->front=item;//更新头结点的前驱(总是指向最后一个结点) 60 printf("second!\n"); 61 } 62 printf("姓名:%s 性别:%s 年龄:%d\n",p->rear->name,p->rear->sex,p->rear->age); 63 } 64 void ShowList(ITEM *p){ 65 while(p->rear){ 66 printf("姓名:%s 性别:%s 年龄:%d\n",p->rear->name,p->rear->sex,p->rear->age); 67 p=p->rear; 68 } 69 } 70 void InsertITEM(ITEM *p){ 71 printf("请输入要插入在哪个目标后面:\n"); 72 char *pos=GetName(); 73 ITEM *target=(ITEM *)malloc(sizeof(ITEM));//新结点 74 printf("请输入要插入的信息:\n"); 75 char *target_name=GetName(); 76 char *target_sex=GetSex(); 77 int target_age=GetAge(); 78 printf("c!\n"); 79 target->name=target_name; 80 target->sex=target_sex; 81 target->age=target_age; 82 while(p->rear){ 83 if(strcmp(p->rear->name,pos)==0){//如果匹配结果为p结点的后继结点 84 target->rear=p->rear->rear;//新结点后继指向要插入结点后的后继 85 p->rear->rear=target;//目标位置结点的后继指向新结点 86 target->front=p->rear;//新结点的前驱指向该位置 87 return; 88 } 89 else 90 p=p->rear; 91 } 92 } 93 void DeleITEM(ITEM *p){ 94 printf("请输入要删除的目标姓名:\n"); 95 char *pos=GetName(); 96 while(p->rear){ 97 if(strcmp(p->rear->name,pos)==0){//如果匹配结果为p结点的后继结点 98 if(p->rear->rear!=NULL){//如果要删除的结点不为最后一个结点 99 ITEM *ptr=p->rear->rear;//指向目标结点的后继结点 100 ptr->front=p;//目标结点的后继结点的前驱结点为目标节点的前驱即p 101 free(p->rear); 102 p->rear=ptr;//目标结点的前驱的后继指向目标结点的后继 103 } 104 else{ 105 free(p->rear);//直接释放 106 p->rear=NULL;//指向该结点置为空 107 } 108 } 109 else 110 p=p->rear; 111 } 112 } 113 void ShowSB(ITEM *p){ 114 printf("请输入目标信息:\n"); 115 char *pos=GetName(); 116 while(p->rear){ 117 if(strcmp(p->rear->name,pos)==0){//如果匹配结果为p结点的后继结点 118 printf("姓名:%s 性别:%s 年龄:%d\n",p->rear->name,p->rear->sex,p->rear->age); 119 return; 120 } 121 else 122 p=p->rear; 123 } 124 } 125 void main(){ 126 ITEM *head=initList();//指向头结点 127 char ch; 128 menu(); 129 while((ch=getchar())!=EOF){ 130 setbuf(stdin,NULL); 131 switch (toupper(ch)){ 132 case 'A': AddITEM(head,GetName(),GetSex(),GetAge());break; 133 case 'B': ShowList(head);break; 134 case 'C': InsertITEM(head);break; 135 case 'D': DeleITEM(head);break; 136 case 'E': ShowSB(head);break; 137 } 138 menu(); 139 setbuf(stdin,NULL); 140 } 141 }
原文地址:https://www.cnblogs.com/Let-us-Coding/p/12932257.html
- JS魔法堂:doctype我们应该了解的基础知识
- CentOS6.5菜鸟之旅:安装Realtek无线网卡驱动
- CentOS6.5菜鸟之旅:U盘安装CentOS64位
- 人工智能创造新型态工作 制造业受冲击
- ASP.NET Core File Providers
- JS魔法堂之实战:纯前端的图片预览
- 域名publica.com近50万交易 买家身份浮出水面
- Vim杂记:Sublime的配色方案
- Vim杂记:markdown插件
- 【手把手教你全文检索】Apache Lucene初探
- 微信小程序的“小游戏” 是什么?
- CentOS6.5菜鸟之旅:中文编辑器忍痛放弃Sublime
- JS魔法堂:Data URI Scheme介绍
- Sedo榜:域名happymath.com以3.5万美金交易居榜首
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 如何在 Linux 中查找一个命令或进程的执行时间
- Ubuntu 18.04 LTS中配置IP地址的完整步骤
- Linux系统下Nginx支持ipv6配置的方法
- 微信研发体系下的分布式配置系统设计概要
- Linux双网卡绑定脚本的方法示例
- Serverless 有一百种玩法,比好玩更好玩
- 如何在容器服务中获取客户端真实源IP
- Linux服务器间文件实时同步的实现
- centos7 设置grub密码及单用户登录实例代码
- Linux命令行快速技巧之定位一个文件的方法
- Linux低电量自动关机的实现方法
- ubuntn备份方法总结(四种)
- linux让程序开机自动运行最简单的方法
- centos克隆linux虚拟机的完整步骤分享
- CentOS7.4下MySQL5.7.28二进制方式安装的方法步骤