标题:C语言单链表的问题 为什么不能一下删除所有节点,同时switch语句的case1,3, ...
只看楼主
slongg
Rank: 1
等 级:新手上路
帖 子:7
专家分:4
注 册:2014-3-24
结帖率:100%
已结贴  问题点数:20 回复次数:10 
C语言单链表的问题 为什么不能一下删除所有节点,同时switch语句的case1,3,4哪里错了,求指点
//源代码如下
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Student
{
  int number;
  char *name;
  char *addr;
  int math;
  int computer;
  struct Student *next;
};


struct Student *create_head(struct Student *head)
{
    head=NULL;
    return head;
}



//增加学生
 void add_stu(struct Student **head,int number,char *name,char *addr,int math,int computer)
 {
     struct Student *p=(struct Student *)malloc(sizeof(struct Student));
   struct Student *p2=*head;
   if(p==NULL)
   {
     printf("内存空间分配失败!\n");
     exit(0);
   }
   p->number=number;
   p->name=(char *)malloc(strlen(name)+1);
   strcpy(p->name,name);
   p->addr=(char *)malloc(strlen(addr)+1);
   strcpy(p->addr,addr);
   p->math=math;
   p->computer=computer;
   p->next=NULL;

  if(*head==NULL)
  {
     *head=p;
     return;
  }
  else
  {
    while(p2->next!=NULL)
    {
       p2=p2->next;
    }
    p2->next=p;
  }
  return;
 }

//打印学生
 void print_stu(struct Student *head)
 {
    struct Student *p=head;
   if(head==NULL)
   {
     printf("还未添加一个学生!\n");
     return;
   }
  else
  {
       while(p!=NULL)
       {
         
         printf("学号:%d\t姓名:%s\t地址:%s\t数学成绩:%d\t计算机成绩:%d\n",p->number,p->name,p->addr,p->math,p->computer);
         p=p->next;
       }
  }
  return;
 }



//根据姓名删除
void delete_by_name(struct Student *head,char *name)
{
    struct Student *p=head;
    struct Student *p2;
    if(head==NULL)
    {
      return;
    }
     while(p!=NULL)
     {
          if(strcmp(p->name,name)==0)
          {
            p2->next=p->next;
            free(p->addr);
            free(p->name);
            free(p);

            break;
          }
         else
         {
            p2=p;
           p=p->next;
         }
   }
   return;
}



//删除所有
void delete_all(struct Student **head)
{
   struct Student *p=*head;
  
   if(*head==NULL)
   {
      return;
   }
   while((*head)->next!=NULL)
   {  
       p=(*head)->next;
       (*head)->next=p->next;
            free(p->addr);
            free(p->name);
            free(p);
               
   }
  
   return;
}


//根据姓名打印
void print_name(struct Student *head,char *name)
{
   
  struct Student *p=head;
  if(head==NULL)
  {
    return;
  }
 
    while(p!=NULL)
    {
      if(strcmp(p->name,name)==0)
      {
         printf("学号:%d\t姓名:%s\t地址:%s\t数学成绩:%d\t计算机成绩:%d\n",p->number,p->name,p->addr,p->math,p->computer);
         break;
      }
      else
      {
        p=p->next;
      }
    }
   if(p==NULL)
   {
    printf("没有 %s 的信息!\n",name);
   }
}

int main()
{
    int j=0;
    int snum,smath,scomputer;
    char *sname;
    char *saddr;
 int number1=1111;
 char *name1="zhangsan";
 char *addr1="yinchuan";
 int math1=88;
 int computer1=73;
 struct Student *head=create_head(head);

 add_stu(&head,number1,name1,addr1,math1,computer1);
 add_stu(&head,1112,"lisi","shanghai",92,83);
 add_stu(&head,1113,"wangwu","beijing",85,91);

  print_stu(head);
   // delete_by_name(head,"lisi");
   //print_stu(head);

  //delete_all(&head);
  print_stu(head);
  //print_name(head,"lisiwww");
 printf("输入1增加学生,输入2打印学生,输入3 根据姓名打印学生,输入4根据姓名删除学生,输入5删除所有学生,输入其他数字退出:\n");
 scanf("%d",&j);
  switch(j)
  {
  case 1:
           scanf("%d,%s,%s,%d,%d",&snum,sname,saddr,&smath,&scomputer);
           add_stu(&head,snum,sname,saddr,smath,scomputer);
           break;
  case 2:
           print_stu(head);       //打印学生
           break;
  case 3:
           scanf("%s",sname);
           print_name(head,sname);
           break;
  case 4:
          scanf("%s",sname);
          delete_by_name(head,sname);
          break;
  case 5:
           delete_all(&head);
           break;
  default:
          exit(0);
          break;
  }   
  print_stu(head);     
  return 0;
}
搜索更多相关主题的帖子: computer include 源代码 number return 
2014-03-24 20:11
slongg
Rank: 1
等 级:新手上路
帖 子:7
专家分:4
注 册:2014-3-24
得分:0 
除了delete_all()函数不能删除第一个节点外,其他几个函数都没有问题
2014-03-24 20:14
ying8501
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:1092
专家分:1446
注 册:2008-11-24
得分:10 
//删除所有   ---  你试试
void delete_all(struct Student *head)
{
   struct Student *p=head;
     while(head!=NULL)
   {  
       p=head->next;

       free(head->addr);
       free(head->name);
       free(head);
       head=p;
   }
  
   return;
}
2014-03-24 20:33
slongg
Rank: 1
等 级:新手上路
帖 子:7
专家分:4
注 册:2014-3-24
得分:0 
回复 3楼 ying8501
不行 运行后的结果是这样的
2014-03-24 21:42
ying8501
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:1092
专家分:1446
注 册:2008-11-24
得分:0 
你建立链表的函数有问题,你先修改一下。
2014-03-25 19:50
ying8501
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:1092
专家分:1446
注 册:2008-11-24
得分:0 
另外,放学生信息的结构体中姓名地址最好设置成静态数组,否则三次申请空间更容易出错。
2014-03-25 19:55
ying8501
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:1092
专家分:1446
注 册:2008-11-24
得分:0 
char *sname;
   char *saddr;

   ...
  scanf("%d,%s,%s,%d,%d",&snum,sname,saddr,&smath,&scomputer);
这是不允许的,就会出现前边你所说的内存错误。你把字符数组和字符指针用混了。
2014-03-25 20:18
slongg
Rank: 1
等 级:新手上路
帖 子:7
专家分:4
注 册:2014-3-24
得分:0 
回复 7楼 ying8501
这个今天改了  可以用 malloc()函数继续申请动态内存空间
同时多谢指导

[ 本帖最后由 slongg 于 2014-3-25 21:45 编辑 ]
2014-03-25 21:36
slongg
Rank: 1
等 级:新手上路
帖 子:7
专家分:4
注 册:2014-3-24
得分:0 
回复 5楼 ying8501
静态数组容易越界 并且我想的是可以一直添加学生,数组的话个数就固定了


单链表除了删除节点的函数有点问题外,其它函数应该没问题吧
另外,这个程序正在完善中,欢迎多提意见

[ 本帖最后由 slongg 于 2014-3-25 21:42 编辑 ]
2014-03-25 21:39
C_lscll
Rank: 2
等 级:论坛游民
帖 子:22
专家分:18
注 册:2014-2-6
得分:10 
struct Student
 {
   int number;
   char *name;
   char *addr;
   int math;
   int computer;
   struct Student *next;
 };
// char *name; 是字符型指针,除非你的名字是单字符,建议建一个数组char name[40];
// 然后用指针指向改数组 char * addr = name;
2014-03-25 21:53



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-429099-1-1.html




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

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