2015.12.16 doubleLinkedList-Function

  1 #include <stdio.h>
  2 #include <stdbool.h>
  3 #include <stdlib.h>
  4
  5 typedef struct node{
  6     struct node *previous;
  7     int age;
  8     struct node *next;
  9 }Node;
 10
 11 //创建一个结点
 12 Node *createNode();
 13 //初始化链表
 14 void intial(Node *const pHead);
 15 //是否继续
 16 bool isContinue();
 17 //查找index对应的结点位置
 18 Node *checkIndex(Node *pHead, int index);
 19 //输出链表
 20 void show(const Node *const pHead);
 21 //插入结点
 22 void insert(Node *pHead, int index, int element);
 23 //删除结点
 24 void delete(Node *pHead, int index);
 25
 26 int main(int argc, const char * argv[]) {
 27     //定义一个指针 指向头结点(头结点不存储数据)
 28     Node *pHead = NULL;
 29
 30     pHead = createNode();
 31     if (pHead == NULL) {
 32         exit(EXIT_FAILURE);
 33     }
 34
 35     intial(pHead);
 36
 37     show(pHead);
 38
 39     insert(pHead, 3, 99);
 40
 41     show(pHead);
 42
 43     delete(pHead, 3);
 44
 45     show(pHead);
 46
 47     return 0;
 48 }
 49
 50
 51
 52 Node *createNode(){
 53     //创建一个新的结点
 54     Node *pTemp = (Node *)malloc(sizeof(Node));
 55     if (pTemp == NULL) {
 56         return NULL;
 57     }
 58
 59     //赋初值
 60     pTemp->previous = NULL;
 61     pTemp->next = NULL;
 62
 63     //返回
 64     return pTemp;
 65 }
 66
 67 void intial(Node *const pHead){
 68     Node *pTail = pHead;
 69
 70     //添加保存数据的结点
 71     while (1) {
 72         Node *pTemp = createNode();
 73         if (pTemp == NULL) {
 74             exit(EXIT_FAILURE);
 75         }
 76         //输入数据
 77         printf("Please input age:");
 78         scanf("%d", &pTemp->age);
 79
 80         //判断需要添加的位置
 81         if (pHead->next == NULL) {
 82             //头指针指向第一个结点
 83             pHead->next = pTemp;
 84
 85             //第一个结点的previous指针指向头结点
 86             pTemp->previous = pHead;
 87
 88             //第一个结点的next指针指向头指针
 89             pTemp->next = pHead;
 90
 91             //头指针的previous指向第一个结点
 92             pHead->previous = pTemp;
 93
 94             //尾指针指向第一个结点
 95             pTail = pTemp;
 96         } else{
 97             //前面的结点已经存在了
 98             //让尾结点的next指向新建的结点
 99             pTail->next = pTemp;
100
101             //新建结点的previous指针指向尾结点
102             pTemp->previous = pTail;
103
104             //pTail指向新建的结点
105             pTail = pTemp;
106
107             //尾结点的next指针指向头结点
108             pTail->next = pHead;
109
110             //头结点的previous指针指向尾结点
111             pHead->previous = pTail;
112         }
113         //询问是否继续
114         if (isContinue() == false) {
115             break;
116         }
117     }
118
119
120 }
121
122 bool isContinue(){
123     char option;
124     do {
125         getchar();
126         printf("Is continued(y/n):");
127         option = getchar();
128     } while (option != ‘y‘ && option != ‘n‘);
129
130     if (option == ‘y‘) {
131         return true;
132     } else{
133         return false;
134     }
135 }
136
137 void show(const Node *const pHead){
138     Node *pTemp = pHead->next;
139
140     while (pTemp != NULL) {
141         printf("%d ", pTemp->age);
142         pTemp = pTemp->next;
143
144         if (pTemp == pHead) {
145             break;
146         }
147     }
148     printf("\n");
149 }
150
151 Node *checkIndex(Node *pHead, int index){
152     Node *pTemp = pHead->next;
153
154     while (index > 0) {
155         if (pTemp == pHead) {
156             //结点数少于index
157             break;
158         } else{
159             pTemp = pTemp->next;
160         }
161         index --;
162     }
163     if (index > 0) {
164         return NULL;
165     } else{
166         //让pTemp指向上一个结点(因为while循环中『指过了』)
167         pTemp = pTemp->previous;
168         return pTemp;
169     }
170 }
171
172 void insert(Node *pHead, int index, int element){
173     //首先应该获取到index对应的结点地址
174     Node *pIndex = checkIndex(pHead, index);
175
176     if (pIndex == NULL) {
177         printf("相应的元素不存在\n");
178         exit(EXIT_FAILURE);
179     } else{
180         //在index前插入一个指针,并且为这个指针分配内存
181         Node *pNew = createNode();
182
183         if (pNew == NULL) {
184             exit(EXIT_FAILURE);
185         } else{
186             pNew->age = element;
187
188             //pNew的next指针指向pIndex
189             pNew->next = pIndex;
190
191             //pNew的previous指针指向pIndex前面的那个结点的地址
192             pNew->previous = pIndex->previous;
193
194             //pIndex前面的那个结点的next指针指向pNew
195             pIndex->previous->next = pNew;
196
197             //pIndex的previous指针指向pNew
198             pIndex->previous = pNew;
199         }
200     }
201 }
202
203 void delete(Node *pHead, int index){
204     //获取到index对应的结点
205     Node *pIndex = checkIndex(pHead, index);
206
207     if (pIndex == NULL) {
208         exit(EXIT_FAILURE);
209     } else{
210         //pIndex前面结点的next指针指向pIndex后面的结点
211         pIndex->previous->next = pIndex->next;
212
213         //pIndex后面结点的previous指针指向pIndex前面的结点
214         pIndex->next->previous = pIndex->previous;
215
216         //释放pIndex结点
217         free(pIndex);
218     }
219 }
时间: 2024-10-19 10:39:12

2015.12.16 doubleLinkedList-Function的相关文章

锁和并发(一)【2015.12.16】

并发控制模型   1.悲观并发控制: A.默认冲突存在,当前进程通过获取当前数据的锁阻止其他进程的访问. B.读与写之间是相互阻塞. 2.乐观并发控制: A.使用行版本控制保持数据被操作前的状态. B.读与写之间不会相互阻塞:但是写会发生阻塞,SQL SERVER会把冲突的错误信息发送给上层的应用程序. 并发造成的数据行为   1.丢失更新 当两个进程都读取数据A并修改了数据值,就会造成某个进程修改的数据值被覆盖. 数据A=10  时间 进程1   进程2  1 SELECT A     2  

#VSTS日志# 2015/12/10 – 终于可以删除工作项了

最近的更新不少,废话少说,直接上干货 定制工作项字段 本周的更新后,所有的用户都可以在vsts上直接给工作项添加字段了,具体内容包括– 添加新字段(日期,字符串,整形,数字)– 字段显示位置配置– 过程模版继承– 过程模版安全性配置 很多人都知道,在vsts在线版上一直缺少工作项定制能力,这次的更新一定让很多人兴奋,但是我们的工作还没有完,后续我们会逐步完成字段下拉菜单,工作流配置,html字段,添加全新的工作项类型等功能.关于本功能的具体内容,请参考以下博客 http://devopshub.

【我的书】Unity Shader的书 — 文件夹(2015.12.21更新)

写在前面 感谢全部点进来看的朋友.没错.我眼下打算写一本关于Unity Shader的书. 出书的目的有以下几个: 总结我接触Unity Shader以来的历程,给其它人一个借鉴.我非常明确学Shader的艰难,在群里也见了非常多人提出的问题. 我认为学习Shader还是一件有规律可循的事情,但问题是中文资料难觅,而大家又不愿意去看英文...这对我有什么优点呢?强迫我对知识进行梳理,对细节问题把握更清楚. 第二个原因你懂的. 关于本书的定位问题: 面向Unity Shader刚開始学习的人,但要

12.16~12.23工作日志

12.16~12.23工作日志 2016.12.16 1.cick事件调用的函数中加入touchmove等事件会发生事件穿透,详情(http://www.tuicool.com/articles/6NfaUnM) 移动设备的click事件有300ms延迟,用于判断是否双击 2.ios设备会有一个默认的css样式,如input按钮在电脑上默认为方形,而在iPhone上默认为圆形,清除ipone默认样式方法: Input{-webkit-appearance:none;} 3.border-radi

【谜客帝国】第17届阳光原创联想题会(2015.3.16)

[谜客帝国]第17届阳光原创联想题会(2015.3.16)主持:瓷   计分:晴画1.此题   开始   歌曲   甲子  1   一2.双杠   愚蠢   其中   丑牛  1   二3.网开一面  玲珑曲线   一再包抄  真心团圆   3  三围4.太祖革弊强国运  政务公开除陈规日中差距从此始  发展才是硬道理   4  明治维新5.经典童话  埃及少女  刚刚上映  郑钧歌曲   3 灰姑娘6.新年快乐  狼不出没  未必高兴  南朝人名   2  羊欣7.新年雨连绵  猴头探龙宫 未

2015/12/26 十六、 八 、二 进制转十进制

十六进制41BD 转换十进制4*16^3+1*16^2+11*16^1+13*16^0=16384+256+176+13=16829 十六进制A10C.8 转换十进制10*16^3+1*16^2+0*16^1+12*16^0+8*16^-1=40960+0+16+12+0.5=41228.5 八进制146.1 转换成十进制1*8^2+4*8^1+6*8^0+1*8^-1=64+32+6+0.125=102.125 八进制5312.2 转换成十进制5*8^3+3*8^2+1*8^1+2*8^0+2

mysql练习题-2016.12.16

>>>>>>>>>> 练习时间:2016.12.16 编辑时间:2016-12-20-->22:12:08 题: 涉及:多表查询.exists.count().group by.order by 1.1 关系模式 学生student:   SNO:学号:   SNAME:姓名:   AGE:年龄 :   SEX:性别 课程course:CNO:课程代码,CNAME:课程名称,TEACHER:教师 学生成绩SC:SNO:学号,CNO:课程代码

张珺 2015/07/16 个人文档

姓名 张珺 日期 中蓝公寓蓝芳园D507,2015/07/16 主要工作及心得 今天我们开始进行文档的编写工作,对全部的文档进行了分工,我负责了概要设计说明书的编写.详细设计说明书中客户端里操作员相关内容的编写和对于操作员中相关操作的人工测试工作. 遇到的问题 报告中各项的编写要求.报告格式 解决方法 明天去找老师讨论有关报告的问题

陈嘉 2015/07/16 个人文档

姓名 陈嘉 日期 2015/7/16 主要工作及心得 1.完成报告的JUnit测试部分 2.编写测试计划文档.测试计划文档需要详尽的考虑所有正确与错误的情况. 遇到的问题 报告的有一些部分不知道具体的格式应该是什么样子以及需要包含哪些部分 解决方法 明天去找老师讨论有关报告的问题