直接上源码,C语言的链表.....注释都写好了...
本菜鸟只为交流学习..........
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
struct student //定义student结构体
{ int num;
float score;
struct student *next;
};
typedef struct student person; // 将student 结构体转换为 person
person *head; //定义 head 指针
#define len sizeof(person) //len 的大小为 person的长度
int Myhwnd; //定义Myhwnd ,用来保存控制台窗口句柄
void main()
{
char a[100]; //用于保存控制台窗口标题
int i,item; //定义循环变量 i ,选择的项目 item
void Create(); //定义创建链表函数
void print(); //定义输出函数
void Delete(); //定义删除函数
void Insert(); //定义插入函数
GetConsoleTitle(a,sizeof(a)); //获取控制台窗口标题,并保存在字符数组 a 里面
Myhwnd=FindWindow(0,a); //将获取的控制台窗口句柄保存在Myhwnd变量里面
Create(); //调用创建链表函数
for(;;) //循环执行以下代码
{
printf("=========链表管理系统:========== \n");
printf("\n");
printf("请选择: 1.插入链表\n");
printf("\n");
printf(" 2.删除链表\n");
printf("\n");
printf(" 3.输出链表\n");
printf("\n");
printf(" 4.退出系统\n");
printf("\n");
printf(" 5.清空屏幕\n");
printf("\n");
printf("请输入你选择的项目:");
scanf("%d",&item);
switch (item)
{
case 1:Insert();break;
case 2:Delete();break;
case 3:print();break;
case 4:SendMessage(Myhwnd,16,0,1);break; //调用SendMessage函数关闭自己
case 5:system("cls");break; //清除控制台屏幕
default :SendMessage(Myhwnd,16,0,1); //调用SendMessage函数关闭自己
}
}
}
void Create()
{
int i,personnum; //定义循环变量,定义学生人数;
person *p1,*p2; //定义2个指向person结构体变量的指针
for(;;) //循环执行以下代码
{
printf("请输入学生人数!\n");
scanf("%d",&personnum); //获取人数,并保存在personnum里面
if(personnum<1) MessageBox(Myhwnd,"输入人数错误!","请重新输入",MB_ICONERROR);//输入人数错误,则提示
else break; //输入人数成功则跳出循环
}
for(i=0;i<personnum;i++)
{
printf("请用空格作为分隔符,按学号从小到大输入第%d个人数的 学号 分数\n",i+1);
if(i==0) //判断是否是第一个人
{
head=(person *)malloc(len);//是第一个人则分配内存
head->score=0; //必须将浮点型变量初始化
scanf("%d %f",&head->num,&head->score);//将获取的学号 和 分数 保存在 head变量里面
head->next=p1=(person *)malloc(len);//head的next 保存P1分配的内存地址
}
else
{
p1->score=0; //初始化
scanf("%d %f",&p1->num,&p1->score); //p1保存输入的 学号 和 分数
if((i+1)==personnum) p1->next=NULL; //p1是否是最后输入的person,是则将p1的next设置为0
else //反之
{
p2=(person *)malloc(len); //用P2保存分配的地址
p1->next=p2; //P1的next保存P2的地址
p1=p2; //P2的地址赋值给P1
}
}
}
}
void print()
{
person *p1;
p1=head; //把链表首地址给P1
for(;;)
{
printf("学号:%d ===== 分数:%f\n",p1->num,p1->score);
if((p1->next)==NULL) //判断P1的next是不是0(是不是最后一个person)
{
printf("\n");
printf("~~~~~~~~输出完毕!~~~~~~~~\n");
printf("\n");
break; //是则提示,并跳出循环
}
else p1=p1->next; //不是则用p1保存p1的next
}
}
void Delete()
{
int a,b,i;
person *p1,*p2;
printf("请输入删除个数:");
scanf("%d",&a); //用a保存删除个数
for(i=0;i<a;i++)
{
printf("请输入第%d个学生的学号:",i+1);
scanf("%d",&b); //用b保存学号
if(b==(head->num)) {head=head->next;} //先判断要删除的是不是第一个,是则head保存head的next
else //反之
{
p1=head; //p1保存head
for(;;)
{
p2=p1->next; //p2保存p1的next
if(b==(p2->num)) { (p1->next)=(p2->next);break;} //判断要删除的是不是p2的num,是则p1保存P2的next,跳出循环
else p1=p2; //反之 p1保存p2
}
}
}
}
void Insert()
{
int a,b,i;
person *p1,*p,*p2;
printf("请输入插入个数:");
scanf("%d",&a);//用a保存插入的个数
for(i=0;i<a;i++) //循环a-1次
{
printf("请以空格作为分隔符,输入第%d个学生的学号 分数\n",i+1);
p=(person *)malloc(len); //变量P分配地址
scanf("%d %f",&p->num,&p->score);//p来保存输入的num 和 score
if((p->num)<=(head->num)) {p->next=head;head=p;} //如果输入的num比head的num小,则把p弄成head
else //反之
{
p1=head; //令 p1为head
p2=p1->next;//p2为 p1的next
for(;;)
{
if((p->num)<=(p2->num)) {p->next=p2;p1->next=p;break;}//如果输入的num小于等于 p2的num, 则把p插到p1和p2之间,跳出循环
else { //反之
if(p2->next==NULL) {p->next=NULL;p2->next=p;break;}//判断p2是不是最后一个person,是则 把p放在结尾,p2的next指向p,p的next则为NULL,跳出循环
else {p1=p1->next;p2=p1->next;}//反之,将p1 p2往后移动一个单位
}
}
}
}
}
只求转为正式会员...........
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法