用链表排序(数组的初级运用链表实现)

来源:互联网 发布: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;
   }
  }
 }
}