#include <stdio.h>
#include <malloc.h>
#define LEN sizeof(struct student)

/*----------------数据定义----------------------*/

//定义一个学生信息的结构体,包括学号,姓名和结构体类型的指针
struct student
{
long num; //学号
char name[128]; //姓名
struct student *next; //结构体指针
};

typedef struct student * stuNode;

int n=0; //全局变量,记录链表的长度

/*---------------函数声明---------------------*/

stuNode Create(); //创建一个新的链表

void Print(stuNode head); //通过传入的链表头指针打印整个链表

stuNode Delete(stuNode head,int num); //通过传入的链表头指针和学生学号删除节点

stuNode Insert(stuNode head,stuNode newStu); //依照学生学号的顺序向链表中插入新元素

/*---------------函数定义----------------------*/

struct student *Create()
{
struct student *head,*p1,*p2;

//开辟一个LEN大小的空间,并让p1,p2指针指向它
p2=p1=(struct student *)malloc(LEN);
//将头指针置为NULL
head=NULL;

//创建链表节点并给节点的元素赋值
printf("请输入学生的学号和姓名:");
scanf("%ld %s",&p1->num,p1->name);
while(p1->num!=0)
{
n=n+1;
if(NULL==head)
{
head=p1;
}
else
{
p2->next=p1;
}
p2=p1;
p1=(struct student *)malloc(LEN);
printf("请输入学生的学号和姓名:");
scanf("%ld %s",&p1->num,p1->name);
}
//将尾节点的指针置为NULL
p2->next=NULL;
return head;
}

void Print(struct student *head)
{
struct student * p;
p=head;

//判断链表是否为空
if(NULL==head)
{
printf("链表为空!\n");
return head;
}
else
{
//循环打印链表中的元素
printf("%d 个记录分别为:\n",n);
while(p!=NULL)
{
printf("%ld %s\n",p->num,p->name);
//指针指向下一个节点
p=p->next;
}
}
}

struct student *Delete(struct student * head,int num)
{
struct student *p1;
struct student *p2;
p1=head;
//判断链表是否为空
if(NULL==head)
{
printf("链表为空!\n");
return head;
}
//遍历节点,判断当前节点是不是需要删除的节点及是否为尾节点
//如果找到相应节点,或者已经遍历到尾节点就跳出循环
while(p1->num!=num&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
//判断是否找到相应节点
if(p1->num==num)
{
//要删除的节点是不是链表的第一个节点
//如果是,就将头指针指向该节点的后一个节点
//如果不是,就将该节点的前一个节点的指针指向该节点的后一个节点
if(head==p1)
{
head=p1->next;
}
else
{
p2->next=p1->next;
}
n=n-1;
printf("%ld 节点已删除.\n",num);
}
else
{
printf("链表中没有要删除的元素.\n");
}
return head;
}

struct student *Insert(struct student * head,struct student * newStu)
{
struct student *p0;
struct student *p1;
struct student *p2;
p0=newStu;
p1=head;
//判断链表是否为空,如果是空链表,就将新节点作为第一个节点
if(NULL==head)
{
head=p0;
p0->next=NULL;
}
else
{
//遍历每一个节点中的学号,与新学号比较大小
//如果找到一个学号比新学号大,就将新学号的节点插入它之前
//如果尾节点的学号仍比新学号小,就将新节点插入到链表尾部
while((p0->num > p1->num)&&(p1->next!=NULL))
{
p2=p1;
p1=p1->next;
}
//找到一个比新学号大的节点
if(p0->num <= p1->num)
{
//判断该节点是否为头节点,如果是,则将新节点设置为头节点
if(p1==head)
{
head=p0;
}
else
{
p2->next=p0;
}
p0->next=p1;
}
else
{
p1->next=p0;
p0->next=NULL;
}
}
//链表长度加1
n=n+1;
printf("%ld 插入成功!\n",newStu->num);
return head;
}

void main()
{
struct student *head;
struct student *stu;
int num;
head=Create();
Print(head);
printf("请输入要删除的学号:");
scanf("%ld",&num);
while(num!=0)
{
head=Delete(head,num);
Print(head);
printf("请输入要删除的学号:");
scanf("%ld",&num);
}
printf("请输入要插入的节点:");
stu=(struct student *)malloc(LEN);
scanf("%ld %s",&stu->num,stu->name);
while(stu->num!=0)
{
head=Insert(head,stu);
printf("请输入要插入的节点:");
stu=(struct student *)malloc(LEN);
scanf("%ld %s",&stu->num,stu->name);
}
Print(head);
}

C语言之链表————(转载)的更多相关文章

  1. C语言之链表

    这两天在复习C语言的知识,为了给下个阶段学习OC做准备,以下的代码的编译运行环境是Xcode5.0版本,写篇博文把昨天复习的C语言有关链表的知识给大家分享一下,以下是小菜自己总结的内容,代码也是按照自 ...

  2. C语言习题 链表建立,插入,删除,输出

    Problem B: C语言习题 链表建立,插入,删除,输出 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 222  Solved: 92 [Subm ...

  3. YTU 2430: C语言习题 链表建立,插入,删除,输出

    2430: C语言习题 链表建立,插入,删除,输出 时间限制: 1 Sec  内存限制: 128 MB 提交: 576  解决: 280 题目描述 编写一个函数creatlink,用来建立一个动态链表 ...

  4. 关于c语言单项链表尾添加

    犹豫了几天,看了很多大牛写的关于c语言链表,感触很多,终于下定决心,把自己对于链表的理解随之附上,可用与否,自行裁夺.由于作者水平有限也是第一次写,不足之处,竭诚希望得到各位大神的批评指正.制作不易, ...

  5. C语言之链表list

    #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h& ...

  6. C语言:链表实现的一个实例

    问题:写一个程序输入你一年看过的所有电影以及每部电影的各种信息(简化问题:每部电影只要求输入片名和评价) 链表实现: #include<stdio.h> #include<stdli ...

  7. C语言单链表实现19个功能完全详解

    谢谢Lee.Kevin分享了这篇文章 最近在复习数据结构,想把数据结构里面涉及的都自己实现一下,完全是用C语言实现的. 自己编写的不是很好,大家可以参考,有错误希望帮忙指正,现在正处于编写阶段,一共将 ...

  8. (转)c语言_链表实例讲解(两个经典例子)

    建立一个学生成绩的线性链表,对其实现插入,删除,输出,最后销毁. #include <stdio.h>#include <stdlib.h> struct grade {    ...

  9. Javascript模仿C语言的链表实现(增删改查),并且使用控制台输入输出

    Js新手最近在研究Js数据结构,刚好看到链表实现这一块儿,觉得有些资料和自己理解的有冲突,于是借着自己以前一点点C语言的基础,用Javascript模仿了C的链表实现,并且用了process.stdi ...

随机推荐

  1. 转:exit()与_exit()的区别

    版权声明:本文为博主原创文章,未经博主允许不得转载. 从图中可以看出,_exit 函数的作用是:直接使进程停止运行,清除其使用的内存空间,并清除其在内核的各种数据结构:exit 函数则在这些基础上做了 ...

  2. Cracking the coding interview--Q2.1

    原文: Write code to remove duplicates from an unsorted linked list.FOLLOW UPHow would you solve this p ...

  3. 模糊语意变数、规则和模糊运算--AForge.NET框架的使用(二)

    原文:模糊语意变数.规则和模糊运算--AForge.NET框架的使用(二) 语意变数(Linguistic Variable) 语意变数存储了数个语意量(标签),每个语意量包含一个识别名和模糊集合.在 ...

  4. 型牌男装施春蕾:分拆让马云对淘宝定位更清晰--互联网 -- CCTIME飞象网

    型牌男装施春蕾:分拆让马云对淘宝定位更清晰--互联网 -- CCTIME飞象网 型牌男装施春蕾:分拆让马云对淘宝定位更清晰          2011年6月17日 13:16  CCTIME飞象网   ...

  5. Java 反射机制详解

    动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化.比如众所周知的ECMAScript(JavaScript)便是一个动态语言.除此之外如Ru ...

  6. vi查找

    /pattern<Enter> :向下查找pattern匹配字符串 ?pattern<Enter>:向上查找pattern匹配字符串 使用了查找命令之后,使用如下两个键快速查找 ...

  7. Highcharts 异步加载数据曲线图表

    导入 data.js 文件 异步加载数据需要引入以下js 文件: <script src="http://code.highcharts.com/modules/data.js&quo ...

  8. 使用memcached加速web应用实例

    在实际应用中,一般会把数据库查询的结果保存到memcached中,下次訪问数据库时直接从memcached中获取.而不再进行数据库操作,这样非常大的程度上减轻了数据库的负担. [演示样例]: < ...

  9. [AngularJS] Angular 1.5 $transclude with named slot

    In Angular 1.5, there is no link and compile. So use if you transclude, you cannot access the fifth ...

  10. iOS 蓝牙4.0开发

    背景: 1.iOS的蓝牙不能用来传输文件.2.iOS与iOS设备之间进行数据通信,使用gameKit.framework3.iOS与其他非iOS设备进行数据通信,使用coreBluetooth.fra ...