| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 290 人关注过本帖
标题:求大神看下这个书上的学生信息管理链表源码
只看楼主 加入收藏
lufeirider
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2014-10-5
收藏
 问题点数:0 回复次数:0 
求大神看下这个书上的学生信息管理链表源码
程序代码:
/*用链表实现学生成绩信息的管理*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct stud_node
{
    int num;
     char name[20];
    int score;
    struct stud_node *next;
};
struct stud_node *Create_Stu_Doc();/*新建链表*/
struct stud_node *InsertDoc(struct stud_node *head,struct stud_node *stud);/*插入*/
struct stud_node *DeleteDoc(struct stud_node *head,int num);/*删除*/
void Print_Stu_Doc(struct stud_node *head);/*遍历*/

int main(void)
{
     struct stud_node *head,*p;
     int choice,num,score;
     char name[20];
     int size=sizeof(struct stud_node);


 do

 {
  printf("1:添加 2:插入 3:删除 4:打印 0:退出\n");
    scanf("%d",&choice);
    switch(choice)
      {
      case 1:head=Create_Stu_Doc();break;
      case 2:printf("请输入学号,姓名和成绩:\n");
       scanf("%d%s%d",&num,name,&score);
       p=(struct stud_node *)malloc(size);
       p->num=num;
       strcpy(p->name,name);
       p->score=score;
       head=InsertDoc(head,p);
       break;
      case 3:
       printf("请输入学号:\n");
       scanf("%d",&num);
       head=DeleteDoc(head,num);
       break;
      case 4:
       Print_Stu_Doc(head);
       break;
      case 0:break;
      }
     }while(choice!=0);

     return 0;
    }

/*新建链表*/
struct stud_node *Create_Stu_Doc()
{
     struct stud_node *head,*p;
     int num,score;
     char name[20];
     int size=sizeof(struct stud_node);

     head=NULL;
     printf("请输入学号,姓名和成绩:\n");
     scanf("%d%s%d",&num,name,&score);
     while(num!=0)
     {
      p=(struct stud_node*)malloc(size);
      p->num=num;
      strcpy(p->name,name);
      p->score=score;
      head=InsertDoc(head,p);/*调用插入函数*/
      scanf("%d%s%d",&num,name,&score);
     }
     return head;
}

/*插入操作*/
struct stud_node *InsertDoc(struct stud_node *head,struct stud_node *stud)
{
     struct stud_node *ptr,*ptr1,*ptr2;

     ptr2=head;
     ptr=stud;/*ptr指向待插入的新的学生记录结点*/
     /*原链表为空时的插入*/
     if(head==NULL)
     {
      head=ptr;
      head->next=NULL;
     }
     else/*原链表不为空时的插入*/
     {
      while((ptr->num>ptr2->num)&&(ptr2->next!=NULL))
      {
       ptr1=ptr2;/*ptr1,ptr2各后移一个结点*/
       ptr2=ptr2->next;
      }
      if(ptr->num<=ptr2->num)/*在ptr1与ptr2之间插入新结点*/
      {
       if(head==ptr2)
        head=ptr;
       else ptr1->next=ptr;
       ptr->next=ptr2;
      }
      else/*新插入结点成为尾结点*/
      {
       ptr2->next=ptr;
       ptr->next=NULL;
      }
     }

 return head;
}

/*删除操作*/
struct stud_node *DeleteDoc(struct stud_node *head,int num)
{
     struct stud_node *ptr1,*ptr2;

     /*要被删除结点为表头结点*/
     while(head!=NULL && head->num==num)
     {
      ptr2=head;
      head=head->next;
      free(ptr2);
     }
     if(head==NULL)/*链表空*/
      return NULL;
     /*要被删除结点为非表头结点*/
     ptr1=head;
     ptr2=head->next;/*从表头的下一个结点搜索所有符合删除要求的结点*/
     while(ptr2!=NULL)
     {
          if(ptr2->num==num)/*ptr2所指结点符合删除要求*/
          {
           ptr1->next=ptr2->next;
           free(ptr2);
          }
          else
           ptr1=ptr2;/*ptr1后移一个结点*/
          ptr2=ptr1->next;/*ptr2指向ptr1的后一个结点*/
         }
     return head;
}

/*遍历操作*/
void Print_Stu_Doc(struct stud_node *head)
{
     struct stud_node *ptr;
     if(head==NULL)
     {
      printf("\nNo Records\n");
      return;
     }
     printf("\nThe Students' Records Are:\n");
     printf("Num\tName     Score\n");
     for(ptr=head;ptr;ptr=ptr->next)
     printf("%d\t%s\t%d \n",ptr->num,ptr->name,ptr->score);
}




编译一直运行,一直在插入数据。求帮忙,任务是要我们自学链表这章内容。
搜索更多相关主题的帖子: 信息 
2014-10-07 10:18
快速回复:求大神看下这个书上的学生信息管理链表源码
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017054 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved