一:typedef的用法。

   写一个数据结构(计算机存储数据的一种方式,是抽象的,可以人为组织,提高算法效率),我们需要注意:接口友好,模块化,规范命名等方面,在接口友好方面,typedef是非常好用并且标准及人性化的。

点击(此处)折叠或打开

  1. /*定义一个叫student的结构体*/
  2. struct student
  3. {
  4. int Id;
  5. char name[20];
  6. };
  7. /*定义成员*/
  8. struct stduent stu1,stu2;   //定义了2个名字分别为stu1和stu2的结构体
  9. struct student *stu;         //定义一个指向stu的4字节的指针
  10. typedef struct student * head;  //将struct student * 定义为 head
  11. head h;                     //直接用head 就可以定义头指针

二:单向链表的查找、增加、删除、销毁。(要是只写一段查找或者增加的某程序,倒不是很好写,所以就写了个简单的学生系统,也可以练习下自己的c语言,看的客官注意注释)。

点击(此处)折叠或打开

  1. /*************************************************************************
  2. > File Name: link.c
  3. > Author:
  4. > Mail:
  5. > Created Time: Thu 23 Jul 2015 11:41:41 AM CST
  6. ************************************************************************/
  7. #include<stdio.h>
  8. #include<stdlib.h>
  9. #define LEN sizeof(struct student)
  10. struct student
  11. {
  12. int Id;
  13. char name[20];
  14. struct student *next;
  15. };
  16. typedef struct student * head;                        //用typedef 以后我定义指针就直接用head了。
  17. head Input(head h);
  18. head Delete();
  19. int Ruin(head h);
  20. void Print();
  21. head Find();
  22. void biaotou();
  23. void biaotou()
  24. {
  25. printf("\n 信息表\n");
  26. printf("学生编号\t学生姓名\n");
  27. }
  28. head Find(head h)
  29. {
  30. int Id;
  31. head p;
  32. printf("请输入学生编号\n");
  33. scanf("%d",&Id);
  34. for(p = h ;p->next;p = p->next)                     //查找过程
  35. {
  36. if(p->next->Id == Id)                           //为什么直接用p->next->Id ,原因是返回要找的前驱节点,以后删除和增加的时候都有好处。
  37. {
  38. biaotou();
  39. printf("%d\t\t%s\n",p->next->Id,p->next->name);
  40. break;
  41. }
  42. }
  43. if(p->next == NULL)
  44. {
  45. printf("没有此学号\n");
  46. }
  47. return(p);
  48. }
  49. void Print(head h)
  50. {
  51. head p;
  52. printf("\n 信息表\n");
  53. printf("学生编号\t学生姓名\n");
  54. for(p = h->next; p; p = p->next)                     //显示的时候直接显示p->next
  55. printf("%d\t\t%s\n",p->Id,p->name);
  56. }
  57. int Ruin(head h)
  58. {
  59. head p = NULL;
  60. int choice;
  61. printf("确定销毁整个链表?(1:销毁,2:不销毁)\n");
  62. scanf("%d",&choice);
  63. if(choice == 1)
  64. {
  65. for(p;h->next;)                                      //传进来头结点 然后每次保存h->next
  66. {                                                    //改链域之后在删除第二个,然后第三个,
  67. p = h->next;
  68. h->next = p->next;
  69. free(p);                                         //最后需要把最后一个也释放
  70. }
  71. free(h);
  72. printf("销毁成功\n");
  73. }
  74. if(choice == 2)
  75. {
  76. return 0;
  77. }
  78. }
  79. head Delete(head t)
  80. {
  81. head p;
  82. p = t->next;                                             //保存要删除的节点
  83. t->next = p->next;                                       //更改链域绕过要删除的节点
  84. free(p);                                                 //删除要删除的节点
  85. printf("删除成功\n");
  86. }
  87. void Add(head t)                                            //在插入之前,已经查找了插入点的位置
  88. {
  89. head p ;                                                 // t:find()函数的返回值,返回查找到点的前驱节点
  90. p = (head) malloc (LEN);
  91. printf("请输入要插入学生的信息\n");
  92. printf("请输入学生Id\n");
  93. scanf("%d",&p->Id);
  94. printf("请输入学生姓名\n");
  95. scanf("%s",p->name);                                       //准备好要插入的信息
  96. p->next = t->next;                                           //将要插入的节点与后一个节点相连
  97. t->next = p;                                                 //将前驱节点与要插入的节点相连即可
  98. }
  99. head Input(head h)
  100. {
  101. char choice;
  102. head p;
  103. head q;
  104. h = (head) malloc(LEN);                                     //整个结构要清晰  head p; 表示p是一个四字节的,指向结构体的指针
  105. q = h;                                                      //malloc 之后,就相当于有了空间 并且p指向它
  106. do
  107. {
  108. p = (head) malloc(LEN);
  109. printf("请输入学生Id\n");
  110. scanf("%d",&p->Id);
  111. printf("请输入学生姓名\n");
  112. scanf("%s",p->name);
  113. p->next = NULL;
  114. h->next = p;
  115. h = p;
  116. printf("Contine?(Y/N)\n");
  117. getchar();
  118. scanf("%c",&choice);
  119. }while(choice == 'Y'||choice == 'y' );
  120. return(q);
  121. }
  122. int main(int argc,char *agrv[])
  123. {
  124. head h = NULL;
  125. head t = NULL; //查找到的学生信息id所指的指针
  126. int choice;
  127. printf("学生信息\n");
  128. do
  129. {
  130. printf("1:输入信息\n");
  131. printf("2:增加信息\n");
  132. printf("3:删除信息\n");
  133. printf("4:销毁信息\n");
  134. printf("5:显示信息\n");
  135. printf("6:查找信息\n");
  136. printf("0:退出程序\n");
  137. printf("请输入:");
  138. scanf("%d",&choice);
  139. switch(choice)
  140. {
  141. case 1:h = Input(h);
  142. break;
  143. case 2:
  144. printf("请先确定要插入的位置学号(前插入)是否存在\n");
  145. printf("注意:若不存在,默认插入到最后\n");
  146. t = Find(h);
  147. Add(t);
  148. break;
  149. case 3:
  150. printf("请先确定要删除的学号是否存在\n");
  151. t = Find(h);
  152. Delete(t);
  153. break;
  154. case 4:Ruin(h);
  155. break;
  156. case 5:Print(h);
  157. break;
  158. case 6:Find(h);
  159. break;
  160. }
  161. }while(choice != 0);
  162. }

阅读(1) | 评论(0) | 转发(0) |

给主人留下些什么吧!~~
评论热议

版权声明:本文为博主原创文章,未经博主允许不得转载。

typedef的用法 单向链表的查找、增加、删除、销毁。的更多相关文章

  1. 大杂烩 -- 查找单向链表倒数第m个元素

    基础大杂烩 -- 目录 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 1.输入并查找 方案:头插法,正向查找第m个元素. ...

  2. C语言:将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换。-删除指针p所指字符串中的所有空白字符(包括制表符,回车符,换行符)-在带头结点的单向链表中,查找数据域中值为ch的结点,找到后通过函数值返回该结点在链表中所处的顺序号,

    //将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换. #include <stdio.h> #include <string.h> void fun ...

  3. 复习下C 链表操作(单向循环链表、查找循环节点)

    循环链表 稍复杂点. 肯能会有0 或 6 字型的单向循环链表.  接下来创建 单向循环链表 并 查找单向循环链表中的循环节点. 这里已6字型单向循环链表为例. //创建 循环链表 Student * ...

  4. C++异常机制的实现方式和开销分析 (大图,编译器会为每个函数增加EHDL结构,组成一个单向链表,非常著名的“内存访问违例”出错对话框就是该机制的一种体现)

    白杨 http://baiy.cn 在我几年前开始写<C++编码规范与指导>一文时,就已经规划着要加入这样一篇讨论 C++ 异常机制的文章了.没想到时隔几年以后才有机会把这个尾巴补完 :- ...

  5. 笔试题&amp;面试题:设计一个复杂度为n的算法找到单向链表倒数第m个元素

    设计一个复杂度为n的算法找到单向链表倒数第m个元素.最后一个元素假定是倒数第0个. 提示:双指针查找 相对于双向链表来说,单向链表仅仅能从头到尾依次訪问链表的各个节点,所以假设要找链表的倒数第m个元素 ...

  6. C#学习单向链表和接口 IList<T>

    C#学习单向链表和接口 IList<T> 作者:乌龙哈里 时间:2015-11-04 平台:Window7 64bit,Visual Studio Community 2015 参考: M ...

  7. 数据结构-单向链表 C和C++的实现

    数据结构,一堆数据的存放方式. 今天我们学习数据结构中的 链表: 链表的结构: 链表是一种特殊的数组,它的每个元素称为节点,每个节点包括两个部分: 数据域:存放数据,此部分与数组相同 指针域:存放了下 ...

  8. C语言单向链表

    1,为什么要用到链表 数组作为存放同类数据的集合,给我们在程序设计时带来很多的方便,增加了灵活性.但数组也同样存在一些弊病.如数组的大小在定义时要事先规定,不能在程序中进行调整,这样一来,在程序设计中 ...

  9. Java实现单向链表基本功能

    一.前言 最近在回顾数据结构与算法,有部分的算法题用到了栈的思想,说起栈又不得不说链表了.数组和链表都是线性存储结构的基础,栈和队列都是线性存储结构的应用- 本文主要讲解单链表的基础知识点,做一个简单 ...

随机推荐

  1. Java基础系列(38)- 数组的使用

    数组的使用 For-Each循环 数组作方法入参 数组作返回值 For-Each循环 普通型 package array; import sun.security.util.Length; publi ...

  2. Linux系列(38) - 源码包安装(2)

    安装前准备 安装C语言编译器"gcc" yum -y install gcc --c 源码包语言编译器 下载源码包 安装注意事项 源代码保存位置:/usr/local/src/ 软 ...

  3. jmeter之聚合报告(Aggregate Report)

    jmeter最常用的listener--聚合报告Aggregate Report,每一个字段的具体含义是什么? Label:每个请求的名称.每个 JMeter 的 element(例如 HTTP Re ...

  4. thinkphp5自带workerman应用

    1.在vendor/workerman/文件夹下建立server.php文件,内容如下: <?php use Workerman\Worker; require_once __DIR__ . ' ...

  5. CF1446F-Line Distance【计算几何,树状数组,二分】

    正题 题目链接:https://www.luogu.com.cn/problem/CF1446F 题目大意 给出\(n\)个点,求所有点对构成的直线中与原点距离第\(k\)小的距离 \(2\leq n ...

  6. C++ostringstream用法

    ostringstream用法 1.类型转换 要求包含头文件; 字符串和int之间的互相转换: int num = 100; string str = ""; std::ostri ...

  7. 改头换面为哪般,最像Android的Windows——Win11升级安装体验

    在过完了十一小长假之后,各位打工人.学僧党可期待的不仅仅是新一轮的工作,Windows11也在10月5日悄悄正式发布,正式版已经面向MSDN订阅用户开放下载. 作为微软金牌合作伙伴,本葡萄已在第一时间 ...

  8. mysql-router-MIC-8.0.26集群部署

    1.具体部署详情请看视频 https://space.bilibili.com/677825194 2.mysql主要配置如下 cat > /etc/my.cnf <<EOF [cl ...

  9. SpringCloud升级之路2020.0.x版-27.OpenFeign的生命周期-创建代理

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 接下来,我们开始分析 OpenFeign 的生命周期,结合 OpenFeign 本身的源代 ...

  10. CAD/DWG图Web网页可视化技术之栅格和矢量瓦片

    背景 在上一篇博文中CAD图DWG解析WebGIS可视化技术分析总结提到,实现CAD/DWG图形Web展示的思路一般为解析AutoCAD图形格式,然后转成html5所能绘制的格式如svg,geojso ...