首页
社区
课程
招聘
[旧帖] 新人发帖(关于链表,自己写的).....第一次献出去了...只求正式会员 0.00雪花
发表于: 2013-6-10 19:13 1691

[旧帖] 新人发帖(关于链表,自己写的).....第一次献出去了...只求正式会员 0.00雪花

2013-6-10 19:13
1691
直接上源码,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往后移动一个单位
                          
                   }

   }

   }
  

}
}

只求转为正式会员...........

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 516
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
如果我随便输入数据  输入数字的地方  输入字符  输入其他东西会出现什么情况:)
2013-6-10 21:15
0
雪    币: 33
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
2L为什么非要那么奇葩?
2013-6-11 23:11
0
雪    币: 235
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
因为很多溢出漏洞,都是输入不按理出牌的数据。
2013-6-12 12:51
0
雪    币: 13
活跃值: (26)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
5
看不懂大神说的,先支持
2013-6-12 13:28
0
游客
登录 | 注册 方可回帖
返回
//