鱼C论坛

 找回密码
 立即注册
查看: 2458|回复: 1

链表没初始化就报错

[复制链接]
发表于 2011-12-23 11:06:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
struct Student
{
      int  num;
      char name[10];
      char sex;
      char subject[10];
      float score;
      struct Student * pNext;
};
void insert_list(struct Student *,int);
bool del_node(struct Student * ,int);
struct Student * initialize(struct Student *);

//bool teavrse_list();
//bool find_node();
int nodes(struct Student *);
int main(void)
{
      struct Student  * pHead;
      
      int Num;
      int val,n;
      printf("%d",sizeof(struct Student ));

      do
      {  
            printf("\n                请选择功能键:\n\n");
            printf("          ☆☆☆☆☆☆☆☆☆☆☆☆☆");
            printf("\n\n            ---1.新建学生信息\n");
            printf("                ---2.建立数据链表\n");
            printf("                ---3.删除一个学生的信息\n");
            printf("                ---4.查找一个学生的信息\n");
            printf("                ---5.输出所有学生的信息\n");
            printf("                ---6.查找一个学生的信息\n");
            printf("                ---7.推出\n\n");
            printf("          ☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
            scanf("%d",&val);
            switch(val)
            {
            case 1 :
                  printf("Please enter you want insert number:\n");
                  scanf("%d",&n);
                  insert_list(pHead,n);
                  break;
            case 2:
                  pHead=initialize(pHead);
                  break;
                  
            case 3 :
                  printf("请输入要删除的学生的学号:\n number=");
                  scanf("%d",&Num);
                  if(del_node(pHead,Num))
                        printf("删除学生信息成功!\n");
                  else
                        printf("删除失败\n");
                  break;
                  /*case 3 : find_node();
                  break;
                  case 4 : teavrse_list();
                  break;*/
            case 6 : break;
            default : printf("Enter error!Please enter it again!");
                  break;
            }
            
      }while(val != 6);
      
      return 0;
}
struct Student  *initialize(struct Student  * phead)
{
      int a,count;
      struct Student  *p,*q=phead;
      printf("Please enter the students' a number of:\n");
      scanf("%d",&count);
      for(a=0;a<count;a++)
      {
            p=(struct Student  *)malloc(sizeof(struct Student));
            if(NULL==p)
            {
                  printf("动态分配内存失败");
                  exit(-1);
            }
            printf("Please enter the students' information:\n");
            printf("students' number:");
            scanf("%d",&p->num);
            printf("students' name:");
            scanf("%s",p->name);
            printf("students' sex:");
            scanf("%c",&p->sex);
            printf("students' subject:");
            scanf("%s",p->subject);
            printf("students' score:");
            scanf("%f",&p->score);
            q->pNext=p;
            q=p;
      }
      
      p->pNext=NULL;
      return phead;
}
void insert_list(struct Student *phead ,int locat)
{
      int j=0;
      struct Student *p,*q;
      q = phead;
      while(j<locat&&(q->pNext!=NULL))
      {
            j++;
            q=q->pNext;
      }
      if(j>locat&&!q) exit(0);
      p =(struct Student  *)malloc(sizeof(struct Student));
      if(NULL == p)
      {
            printf("动态分配内存失败");
            exit(-1);
      }
      
      printf("Please enter the students' node information:\n");
      printf("students' number:");
      scanf("%d",&p->num);
      printf("students' name:");
      scanf("%s",p->name);
      printf("students' sex:");
      scanf("%c",&p->sex);
      printf("students' subject:");
      scanf("%s",p->subject);
      printf("students' score:");
      scanf("%f",&p->score);
      p->pNext=q->pNext;
      q->pNext = p;
      
}
bool del_node(struct Student  * phead,int num)
{
      int i;
      struct Student  * p,*temp;
      p = phead;
      while(NULL != p && i < num-1)//执行完后p执行了num-1个节点
      {
            p = p->pNext;
            ++i;
      }
      if(i > num-1 || NULL == p)
            return false;
      else
      {
            temp = p->pNext;
            p->pNext = temp->pNext;
            free(temp);
            temp = NULL;
            return true;
      }
}
/*int nodes(pStu phead)
{
      int i=0;
      pStu p = phead;
      if(NULL == phead->pNext)
            return 0;
      else
      {
            while(NULL != p)
            {
                  p = p->pNext;
                  ++i;
            }
            return i;
      }
} */

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-12-23 22:37:08 | 显示全部楼层
case 1 :
                  printf("Please enter you want insert number:\n");
                  scanf("%d",&n);
                  insert_list(pHead,n);
这里的 insert_list(pHead,n);函数调用由于参数是值传递,所以不可能改变实参pHead的值。但函数内部确实改变了pHead的形参(因为malloc了一个空间让pHead的形参指向它),所以当你不初始化链表的时候insert_list从实际意义上说是要改变实参pHead,但实际上没改变所以报错
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-10 10:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表