用链表排序(数组的初级运用链表实现)
来源:互联网 发布:ubuntu弹出强制uefi 编辑:程序博客网 时间:2024/05/17 22:26
/**
* LinkList.c
* version1.0 2006-9-20
* write by jsp
* 用链表排序
**/
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int count=0;
struct plist
{
char stuName[16];
char stuId[10];
int resoult;
struct plist * next;
};
int findD(struct plist *p, char *Id)
{
while(p != NULL )
{
if(strcmp(p ->stuId,Id) == 0 )
return 0;
p = p ->next;
}
return 1;
}
struct plist *creat(struct plist *head)
{
struct plist *pc,*pf,*p;
char yn = 'y';
char Id[10];
int idD = 1;
int stuR;
while(yn != 'n')
{
pc = (struct plist *) malloc(sizeof(struct plist));
if(pc == NULL)
{
printf("/tCREAT FAIL!!/n");
return head;
}
fflush(stdin);
printf("/t请输入学生姓名:");
scanf("%s",pc->stuName);
fflush(stdin);
printf("/t请输入学生学号:");
scanf("%s",Id);
printf("/t请输入学生成绩:");
scanf("%d",&stuR);
if((stuR > 100) || (stuR < 0))
{
printf("/n/t成绩输入不正确!!/n/n");
printf("/t请输入学生成绩:");
scanf("%d",&stuR);
}
pc->resoult = stuR;
if(count > 0)
{
p = head;
idD = findD(p,Id);
}
if(idD == 1 )
{
strcpy(pc->stuId, Id);
if(count == 0 )
head = pf =pc;
else pf->next = pc ;
count++;
pc->next = NULL;
pf = pc;
}
else
{
printf("/n/t该学号已经存在!!此记录没有被输入/n");
}
pc = NULL;
printf("/t是否要还要输入(N退出):");
fflush(stdin);
scanf("%c",&yn);
if(tolower(yn) == 'n')
return head;
}
return head;
}
void creat1(struct plist *head)
{
struct plist *pc,*pf,*p;
char yn = 'y';
char Id[10];
int idD = 1;
int stuR;
pf = head;
while(pf->next != NULL )
{
pf=pf->next;
}
while(yn != 'n')
{
pc = (struct plist *) malloc(sizeof(struct plist));
fflush(stdin);
printf("/t请输入学生姓名:");
scanf("%s",pc->stuName);
fflush(stdin);
printf("/t请输入学生学号:");
scanf("%s",Id);
printf("/t请输入学生成绩:");
scanf("%d",&stuR);
if((stuR > 100) || (stuR < 0))
{
printf("/n/t成绩输入不正确!!/n/n");
printf("/t请输入学生成绩:");
scanf("%d",&stuR);
}
pc->resoult = stuR;
p = head;
idD = findD(p,Id);
if(idD == 1 )
{
strcpy(pc->stuId, Id);
pf->next = pc ;
count++;
pc->next = NULL;
pf = pc;
}
else
{
printf("/n/t该学号已经存在!!此记录没有被输入/n");
}
pc = NULL;
printf("/t是否要还要输入(N退出):");
fflush(stdin);
scanf("%c",&yn);
}
}
struct plist * insert(struct plist *dislist)
{
struct plist *pc,*pf;
int idD,idD1;
char sId[10];
pc = (struct plist *)malloc(sizeof(struct plist));
printf("/t请输入要插入的学生姓名:");
fflush(stdin);
scanf("%s",pc->stuName);
printf("/t请输入要插入的学生学号:");
fflush(stdin);
scanf("%s",pc->stuId);
printf("/t请输入要插入的学生成绩:");
scanf("%d",&pc->resoult);
while((pc->resoult < 0) || (pc->resoult > 100))
{
printf("/t成绩输入越界,请重新输入./n");
printf("/t请输入要插入的学生成绩:");
scanf("%d",&pc->resoult);
}
pf = dislist;
idD = findD(pf,pc->stuId);
if (dislist == NULL)
{
pc->next=NULL;
dislist = pc;
printf("/n=======学号为%s的学生已经追加成功=====/n",pc->stuId);
count++;
return dislist;
}
else
{
if(idD == 0)
{
printf("/t此学号已经存在,该记录没有被增加!!/n");
}
else
{
printf("/t插入点:");
fflush(stdin);
scanf("%s",sId);
pf = dislist;
idD1 = findD(pf,sId);
if(idD1 == 1)
{
printf("/n/t没有找到插入点,该记录将被追加的末尾./n");
pf = dislist;
while(pf->next != NULL)
{
pf = pf->next;
}
pf->next = pc;
pc->next = NULL;
count++;
printf("/n=======学号为%s的学生已经追加成功=====/n",pc->stuId);
}
else
{
pf = dislist;
while(strcmp(pf->stuId,sId) != 0)
{
pf=pf->next;
}
pc->next = pf->next;
pf->next = pc;
count++;
}
}
}
return dislist;
}
void modi(struct plist *dislist)
{
struct plist *pf;
char ID[10];
int idD;
int modiResoult;
printf("/n/t请输入要修改的学生学号:");
fflush(stdin);
gets(ID);
pf = dislist;
idD = findD(pf,ID);
if(idD == 1)
{
printf("/n/t该学生不存在");
}
else
{
pf = dislist;
while(strcmp(pf->stuId,ID)!=0)
{
pf=pf->next;
}
printf("/n======修改前该学生的情况=====/n");
printf("/t学号/t姓名/t成绩/n");
printf("/t%s/t%s%/t%d/n",pf->stuId,pf->stuName,pf->resoult);
printf("/t请输入新成绩:");
scanf("%d",&modiResoult);
while((modiResoult < 0) ||(modiResoult> 100))
{
printf("/t成绩输入越界,请重新输入:");
scanf("%d",&modiResoult);
}
pf->resoult=modiResoult;
printf("/n======修改后该学生的情况=====/n");
printf("/t学号/t姓名/t成绩/n");
printf("/t%s/t%s%/t%d/n",pf->stuId,pf->stuName,pf->resoult);
}
}
struct plist *del(struct plist *slist)
{
struct plist *pc,*pb;
char id[10];
int idD;
printf("/t请输入要删除学号:");
fflush(stdin);
gets(id);
pc= slist;
idD = findD(pc,id);
if(idD == 0)
{
if(strcmp(slist->stuId,id) == 0)
{
printf("/n======要删除的学生情况=====/n");
printf("/t学号/t姓名/t成绩/n");
printf("/t%s/t%s%/t%d/n",slist->stuId,slist->stuName,slist->resoult);
count--;
return slist->next;
free(slist);
}
pb = slist;
pc= pb->next;
while(strcmp(pc->stuId,id)!=0)
{
pb = pc;
pc = pc->next;
}
printf("/n======要删除的学生情况=====/n");
printf("/t学号/t姓名/t成绩/n");
printf("/t%s/t%s%/t%d/n",pc->stuId,pc->stuName,pc->resoult);
pb->next = pc->next;
free(pc);
count--;
}
return slist;
}
void sort(struct plist *slist)
{
struct plist *pc,*pb;
char name[16];
char ID[10];
int stuR;
pc = slist;
pb = slist->next;
while( pc != NULL)
{
while(pb != NULL)
{
if(pc->resoult < pb->resoult)
{
strcpy(name,pb->stuName);
strcpy(ID, pb->stuId);
stuR = pb->resoult;
strcpy(pb->stuName,pc->stuName);
strcpy(pb->stuId,pc->stuId);
pb->resoult= pc->resoult;
strcpy(pc->stuName,name);
strcpy(pc->stuId,ID);
pc->resoult = stuR;
}
if(pb->next == NULL)
break;
pb=pb->next;
}
if(pc->next == NULL)
break;
pc=pc->next;
if(pc->next == NULL)
break;
pb= pc->next;
}
}
void main()
{
struct plist *slist=NULL;
struct plist *dislist;
int total = 0;
int i;
int choice;
while(1)
{
printf("/n/t1.建 立/n");
printf("/t2.浏 览/n");
printf("/t3.修 改/n");
printf("/t4.插 入/n");
printf("/t5.删 除/n");
printf("/t6.退 出/n/n");
printf("/t请你选择你要执行的操作的序号:");
scanf("%d",&choice);
if((choice > 6)&& (choice < 1))
{
printf("/t选择的不正确,请重新选择!/n");
}
else
{
switch(choice)
{
case 1:
if(count == 0 )
slist = creat(slist);
else
{
printf("/n/t表已经建立了,现在是插入!!/n");
dislist = slist;
creat1(dislist);
}
break;
case 2:
dislist =slist;
sort(dislist);
dislist =slist;
total = 0;
i = 1;
printf("/t排名情况如下:/n");
printf("/t名次/t学号/t姓名/t成绩/n");
while(dislist != NULL)
{
printf("/t%d/t%s/t%s%/t%d/n",i,dislist->stuId,dislist->stuName,dislist->resoult);
i++;
total+=dislist->resoult;
dislist = dislist->next;
}
printf("/n/t人数%d人/t总%1.2f分/t平均%1.2f分/n",count,(float)total,(float)total/count);
break;
case 3:
dislist = slist;
modi(dislist);
break;
case 4:
slist=insert(slist);
break;
case 5:
slist=del(slist);
break;
case 6:
return;
}
}
}
}
- 用链表排序(数组的初级运用链表实现)
- 数组的初级运用
- 初级排序算法实现
- 冒泡升序排序的数组实现和链表实现
- 桶排序的数组实现和链表实现
- 运用Python实现多种排序的方法
- 归并排序--数组和链表的实现
- 数组及链表的归并排序(C++实现)
- JAVA中运用数组的四种排序方法
- java 运用数组常用的几种排序方法
- JAVA中运用数组的四种排序方法
- JAVA中运用数组的四种排序方法
- JAVA中运用数组的四种排序方法
- JAVA中运用数组的四种排序方法
- c语言 数组的更好运用 经典冒泡排序法
- JAVA中运用数组的四种排序方法
- JAVA中运用数组的四种排序方法
- JAVA中运用数组的四种排序方法
- Subversion Windows 系统中安装方法
- 在compact framwork中add horizontal scroll to listbox
- What is SPAWN concurrent program and how to write such program?
- 世界上最贵的十幅画
- DWR初次尝试
- 用链表排序(数组的初级运用链表实现)
- CuteEditor使用指南!
- 调用消息对话框,并取得其返回值
- 把DataGrid导出到excel
- pro*c里,相对于c,c++体现的一个优点
- 11个中最大的10个数字
- 世界主要节日、纪念日和活动日
- 实现自己的“命令映射表”(下)
- 做人与做事之感悟篇