typedef的用法 单向链表的查找、增加、删除、销毁。
一:typedef的用法。
写一个数据结构(计算机存储数据的一种方式,是抽象的,可以人为组织,提高算法效率),我们需要注意:接口友好,模块化,规范命名等方面,在接口友好方面,typedef是非常好用并且标准及人性化的。
点击(此处)折叠或打开
- /*定义一个叫student的结构体*/
- struct student
- {
- int Id;
- char name[20];
- };
- /*定义成员*/
- struct stduent stu1,stu2; //定义了2个名字分别为stu1和stu2的结构体
- struct student *stu; //定义一个指向stu的4字节的指针
- typedef struct student * head; //将struct student * 定义为 head
- head h; //直接用head 就可以定义头指针
二:单向链表的查找、增加、删除、销毁。(要是只写一段查找或者增加的某程序,倒不是很好写,所以就写了个简单的学生系统,也可以练习下自己的c语言,看的客官注意注释)。
点击(此处)折叠或打开
- /*************************************************************************
- > File Name: link.c
- > Author:
- > Mail:
- > Created Time: Thu 23 Jul 2015 11:41:41 AM CST
- ************************************************************************/
- #include<stdio.h>
- #include<stdlib.h>
- #define LEN sizeof(struct student)
- struct student
- {
- int Id;
- char name[20];
- struct student *next;
- };
- typedef struct student * head; //用typedef 以后我定义指针就直接用head了。
- head Input(head h);
- head Delete();
- int Ruin(head h);
- void Print();
- head Find();
- void biaotou();
- void biaotou()
- {
- printf("\n 信息表\n");
- printf("学生编号\t学生姓名\n");
- }
- head Find(head h)
- {
- int Id;
- head p;
- printf("请输入学生编号\n");
- scanf("%d",&Id);
- for(p = h ;p->next;p = p->next) //查找过程
- {
- if(p->next->Id == Id) //为什么直接用p->next->Id ,原因是返回要找的前驱节点,以后删除和增加的时候都有好处。
- {
- biaotou();
- printf("%d\t\t%s\n",p->next->Id,p->next->name);
- break;
- }
- }
- if(p->next == NULL)
- {
- printf("没有此学号\n");
- }
- return(p);
- }
- void Print(head h)
- {
- head p;
- printf("\n 信息表\n");
- printf("学生编号\t学生姓名\n");
- for(p = h->next; p; p = p->next) //显示的时候直接显示p->next
- printf("%d\t\t%s\n",p->Id,p->name);
- }
- int Ruin(head h)
- {
- head p = NULL;
- int choice;
- printf("确定销毁整个链表?(1:销毁,2:不销毁)\n");
- scanf("%d",&choice);
- if(choice == 1)
- {
- for(p;h->next;) //传进来头结点 然后每次保存h->next
- { //改链域之后在删除第二个,然后第三个,
- p = h->next;
- h->next = p->next;
- free(p); //最后需要把最后一个也释放
- }
- free(h);
- printf("销毁成功\n");
- }
- if(choice == 2)
- {
- return 0;
- }
- }
- head Delete(head t)
- {
- head p;
- p = t->next; //保存要删除的节点
- t->next = p->next; //更改链域绕过要删除的节点
- free(p); //删除要删除的节点
- printf("删除成功\n");
- }
- void Add(head t) //在插入之前,已经查找了插入点的位置
- {
- head p ; // t:find()函数的返回值,返回查找到点的前驱节点
- p = (head) malloc (LEN);
- printf("请输入要插入学生的信息\n");
- printf("请输入学生Id\n");
- scanf("%d",&p->Id);
- printf("请输入学生姓名\n");
- scanf("%s",p->name); //准备好要插入的信息
- p->next = t->next; //将要插入的节点与后一个节点相连
- t->next = p; //将前驱节点与要插入的节点相连即可
- }
- head Input(head h)
- {
- char choice;
- head p;
- head q;
- h = (head) malloc(LEN); //整个结构要清晰 head p; 表示p是一个四字节的,指向结构体的指针
- q = h; //malloc 之后,就相当于有了空间 并且p指向它
- do
- {
- p = (head) malloc(LEN);
- printf("请输入学生Id\n");
- scanf("%d",&p->Id);
- printf("请输入学生姓名\n");
- scanf("%s",p->name);
- p->next = NULL;
- h->next = p;
- h = p;
- printf("Contine?(Y/N)\n");
- getchar();
- scanf("%c",&choice);
- }while(choice == 'Y'||choice == 'y' );
- return(q);
- }
- int main(int argc,char *agrv[])
- {
- head h = NULL;
- head t = NULL; //查找到的学生信息id所指的指针
- int choice;
- printf("学生信息\n");
- do
- {
- printf("1:输入信息\n");
- printf("2:增加信息\n");
- printf("3:删除信息\n");
- printf("4:销毁信息\n");
- printf("5:显示信息\n");
- printf("6:查找信息\n");
- printf("0:退出程序\n");
- printf("请输入:");
- scanf("%d",&choice);
- switch(choice)
- {
- case 1:h = Input(h);
- break;
- case 2:
- printf("请先确定要插入的位置学号(前插入)是否存在\n");
- printf("注意:若不存在,默认插入到最后\n");
- t = Find(h);
- Add(t);
- break;
- case 3:
- printf("请先确定要删除的学号是否存在\n");
- t = Find(h);
- Delete(t);
- break;
- case 4:Ruin(h);
- break;
- case 5:Print(h);
- break;
- case 6:Find(h);
- break;
- }
- }while(choice != 0);
- }
阅读(1) | 评论(0) | 转发(0) |
版权声明:本文为博主原创文章,未经博主允许不得转载。
typedef的用法 单向链表的查找、增加、删除、销毁。的更多相关文章
- 大杂烩 -- 查找单向链表倒数第m个元素
基础大杂烩 -- 目录 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 1.输入并查找 方案:头插法,正向查找第m个元素. ...
- C语言:将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换。-删除指针p所指字符串中的所有空白字符(包括制表符,回车符,换行符)-在带头结点的单向链表中,查找数据域中值为ch的结点,找到后通过函数值返回该结点在链表中所处的顺序号,
//将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换. #include <stdio.h> #include <string.h> void fun ...
- 复习下C 链表操作(单向循环链表、查找循环节点)
循环链表 稍复杂点. 肯能会有0 或 6 字型的单向循环链表. 接下来创建 单向循环链表 并 查找单向循环链表中的循环节点. 这里已6字型单向循环链表为例. //创建 循环链表 Student * ...
- C++异常机制的实现方式和开销分析 (大图,编译器会为每个函数增加EHDL结构,组成一个单向链表,非常著名的“内存访问违例”出错对话框就是该机制的一种体现)
白杨 http://baiy.cn 在我几年前开始写<C++编码规范与指导>一文时,就已经规划着要加入这样一篇讨论 C++ 异常机制的文章了.没想到时隔几年以后才有机会把这个尾巴补完 :- ...
- 笔试题&面试题:设计一个复杂度为n的算法找到单向链表倒数第m个元素
设计一个复杂度为n的算法找到单向链表倒数第m个元素.最后一个元素假定是倒数第0个. 提示:双指针查找 相对于双向链表来说,单向链表仅仅能从头到尾依次訪问链表的各个节点,所以假设要找链表的倒数第m个元素 ...
- C#学习单向链表和接口 IList<T>
C#学习单向链表和接口 IList<T> 作者:乌龙哈里 时间:2015-11-04 平台:Window7 64bit,Visual Studio Community 2015 参考: M ...
- 数据结构-单向链表 C和C++的实现
数据结构,一堆数据的存放方式. 今天我们学习数据结构中的 链表: 链表的结构: 链表是一种特殊的数组,它的每个元素称为节点,每个节点包括两个部分: 数据域:存放数据,此部分与数组相同 指针域:存放了下 ...
- C语言单向链表
1,为什么要用到链表 数组作为存放同类数据的集合,给我们在程序设计时带来很多的方便,增加了灵活性.但数组也同样存在一些弊病.如数组的大小在定义时要事先规定,不能在程序中进行调整,这样一来,在程序设计中 ...
- Java实现单向链表基本功能
一.前言 最近在回顾数据结构与算法,有部分的算法题用到了栈的思想,说起栈又不得不说链表了.数组和链表都是线性存储结构的基础,栈和队列都是线性存储结构的应用- 本文主要讲解单链表的基础知识点,做一个简单 ...
随机推荐
- Jmeter系列(7)- 分析源码,创建下单、用户注销接口请求
源码分析 下单 用户注销 创建请求 下单 用户注销 请求调整 将信息头管理器从[02.浏览订单]请求中抽出来就变成公用的.[03,04]请求不需要单独再加信息头管理器 DeBug取样器 添加DeBug ...
- Shell系列(28)- 条件判断之字符串判断
字符串判断 $变量时要用双引号引起来,即"$变量" 测试选项 作用 -z 字符串 判断字符串是否为空(为空返回真) -n 字符串 判断字符串是否为非空(非空返回真) 字符串1 == ...
- Linux系列(28) - 软件包简介
软件包分类 源码包(脚本安装包) 优点 开源,如果有足够的能力,可以修改源代码: 可以自由选择所需的功能: 软件是编译安装,所以更加适合自己的系统,更加稳定.效率更高: 卸载方便: 缺点 安装过程步骤 ...
- mogoose 创建数据库并增删改查
下载 npm i mongoose -s 连接数据库 const mongoose = require("mongoose"); mongoose.connect(dbURL); ...
- P3480-[POI2009]KAM-Pebbles【阶梯博弈】
正题 题目链接:https://www.luogu.com.cn/problem/P3480 题目大意 \(n\)个石头堆上进行\(\text{Nim}\)游戏,不过需要满足每次操作前后都有\(a_i ...
- asp.net core 中配合响应 html5 的音视频播放流,以及文件下载
一.asp.net core 中配合响应 html5 的音视频播放流,以及文件下载 问题描述: 目前测试了在 Windows(谷歌浏览器).Android(系统浏览器.QQ.微信).iOS 三个系统不 ...
- 基于Tesseract组件的OCR识别
基于Tesseract组件的OCR识别 背景以及介绍 欲研究C#端如何进行图像的基本OCR识别,找到一款开源的OCR识别组件.该组件当前已经已经升级到了4.0版本.和传统的版本(3.x)比,4.0时代 ...
- ArcPy获取栅格属性
获取栅格属性 (数据管理) 描述 从元数据和栅格数据集的相关描述性统计数据中检索信息. 使用方法 返回的属性将显示在结果窗口中. 此工具的 Python 结果是地理处理结果对象.要获取字符串值,请使用 ...
- 图解java 多线程模式 读书笔记
第1章"Single Threaded Execution模式--能通过这座桥的只有一个人" 该模式可以确保执行处理的线程只能是一个,这样就可以有效防止实例不一致. 第⒉章&quo ...
- PAT (Basic Level) Practice (中文)1025 反转链表 (25分)
1025 反转链表 (25分) 给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转.例如:给定 L 为 1→2→3→4→5→6,K 为 3,则输出应该为 3→2→1→6→5→ ...