用单链表做学生管理系统,第一个学生的学生的信息删不了,求教!


/*************************************************************************
  > File Name:    student.c
  > Author:       SunTeng
  > Description: 
  > Created Time: 2018年10月24日 星期三 19时16分59秒
 ************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


typedef struct student
{
    char name[20];
    int num;
    int grade;
    char tel[20];
    struct student* next;
}STU;

STU* creatstu()
{
    STU* head = NULL;
    head = (STU*)malloc(sizeof(STU));
    if(NULL == head)
    {
        return NULL;
    }
    printf("学号\t姓名\t成绩\t电话\n");
    scanf("%d%s%d%s",&head->num,head->name,&head->grade,head->tel);
    //getchar();
 
 head->next = NULL;
      STU* tmp = head;
       
while(1)
    {
     
      
        STU* st = (STU*)malloc(sizeof(STU));
        if(st == NULL)
        {
            return NULL;
        }

        printf("学号\t姓名\t成绩\t电话\n");
        scanf("%d%s%d%s",&st->num,st->name,&st->grade,st->tel);
        getchar();
       
        tmp->next = st;
        tmp = st;
       printf("按空格退出,按其他键继续录入学生信息!!\n");
        if(getchar() == ' ')
        {
            break;
        }
    }

    tmp->next = NULL;

   
        return head;
}


void Print(STU* head)
{
    STU* temp = head;
    printf("name\t num\t grade\t tel\n");
    while(temp != NULL)
    {
      printf("%d\t %s\t %d\t %s\n",temp->num,temp->name,temp->grade,temp->tel);
        temp = temp->next;
    }
    printf("\n");
   
}

int stuCount(STU* head)
{
    STU* tmp = head;
    int nCount = 0;
    while(NULL != tmp)
    {
        nCount++;
        tmp = tmp->next;
    }

    return nCount;
}

STU* add(STU* head)
{
    STU* stu = (STU*)malloc(sizeof(STU));
    if(NULL == stu)
    {
        return head;
    }

    if(NULL == head)
    {
        head = stu;
        head->next = NULL;

        return head;
    }

        printf("学号\t姓名\t成绩\t电话\n");
        scanf("%d%s%d%s",&stu->num,stu->name,&stu->grade,stu->tel);
    int i = 0;
    STU* tmp = head;
    for(i = 1 ; i < stuCount(head);i++)
    {
        tmp = tmp->next;
    }

    tmp->next = stu;
    stu->next = NULL;
    return head;

}


STU* Delete(STU* head)
{
    int num3;
    printf("输入你要删除学生的学号:");
    scanf("%d",&num3);

    STU* temp1 = head;
 
 

   // printf("%d\n",head->num);
    if(temp1->num == num3)                         //这里的第一个学生的信息删不了,其他都好着。 求教!!
    {                                                               // 删除第一个结点
                                                                    //
        head = temp1->next;                          //
                                                                   //
        return head;                                        //
    }                                                               //

    while(temp1->next->num != num3)
    {
   
        temp1 = temp1->next;
    }
   
    if(temp1->next == NULL)
    {
        temp1->next = NULL;
        free(temp1);
        return head;
    }
   
    STU* ss = temp1->next;
    temp1->next = ss->next;
    free(ss);
    ss->next = NULL;
    return head;
}

STU* Modify(STU* head)
{
 STU* Modstu = head;
 
 int modnum,chose = 0,i;
 printf("输入要修改的学生学号:");
     scanf("%d",&modnum);
 
  for(i = 0;i < stuCount(head);i++)
  {
   if(Modstu->num == modnum)
   {
     printf("name\t num\t grade\t tel\n");
           printf("%d\t %s\t %d\t %s\n", Modstu->num, Modstu->name, Modstu->grade, Modstu->tel);
     break;
   }
   Modstu = Modstu->next;
  }
 
  if(i == stuCount(head))
  {
   printf("NOT FOUND!");
   return head;
  }
 
 else
 {

 
   
   while(chose!=5)                 // 选择要修改的信息
   {
            printf("1.modify name\n2. Modify num\n3. modify grade\n4. modify tel\n5. Exit \nInput Select Function:");
               scanf("%d",&chose);
 
                switch(chose)
    {
                  case 1:printf("enter after updata name:");
                            scanf("%s",Modstu->name);
                       
              break;
                     case 2:printf("enter after updata num:");
                            scanf("%d",&Modstu->num);
                 
                    break;
                     case 3:printf("enter after updata grade:");
                            scanf("%d",&Modstu->grade);
                            
                   break;
                     case 4:printf("enter after updata tel:");
                            scanf("%s",Modstu->tel);
               
                break;
                     default: break;
 
  
                }
    
              if(chose==5)
             break;
              else
                  {
                        printf("name\t num\t grade\t tel\n");
                        printf("%s\t %d\t %d\t %s\n",Modstu->name,Modstu->num,Modstu->grade,Modstu->tel);
            }
   }
 }
}

STU* find(STU* head)
{
 int i = 0,findnum;
 printf("输入要查找的学生学号:");
 scanf("%d",&findnum);
 STU* findstu = head;
  for(i = 0;i < stuCount(head);i++)
  {
   if(findstu->num == findnum)
   {
     printf("name\t num\t grade\t tel\n");
           printf("%d\t %s\t %d\t %s\n", findstu->num, findstu->name, findstu->grade, findstu->tel);
     break;
   }
   findstu = findstu->next;
  }
 
  if(i == stuCount(head))
  {
   printf("NOT FOUND!");
   return head;
  }
}

int main(int argc,char *argv[])
{

    int choose;
    STU* head = creatstu();
    while(1)
    {
        printf("\n");
        printf("*************GEC Live System**************\n");
        printf("*************ACCOINT OPERATE**************\n");
        printf("*           1: add Item                  *\n");
        printf("*           2: Delete Item               *\n");
        printf("*           3: Modify Item               *\n");
        printf("*           4: Print Item                *\n");
        printf("*           5: Find Item                 *\n");
        printf("*           其他:Exit                   *\n");
        printf("******************************************\n");
        printf("Input Select Function:");

        scanf("%d",&choose);
        switch(choose)
        {
            case 1:add(head); continue;
            case 2:Delete(head); continue;
            case 3:Modify(head); continue;
            case 4:Print(head); continue;
            case 5:find(head); continue;
            default: exit(0);
        }

        return 0;
    }

    return 0;
}


#悬赏#
全部评论
你delete,改不了head的值,改完后还是原来的值 你返回了新的head值,要在函数外面进行一次赋值
点赞
送花
回复
分享
发布于 2018-11-12 18:42
 case 2:head=Delete(head); continue;
点赞
送花
回复
分享
发布于 2018-11-12 18:44
秋招专场
校招火热招聘中
官网直投

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务