开发者社区> 问答> 正文

c语言链表问题

#include <stdio.h> 
#define NUll 0
#include <stdlib.h>
struct stu
{
    char name[6];
    int xuehao;
    int grade;
    struct stu *next;
};
typedef struct stu STU;
main()
{
   STU *p,*p_start,*p2,*p_print,*p_charu,*p_charu2;
   int i,xuehao;
   //输入 
   for (i=0;i<3;i++)
   {
    p=(STU *)malloc(sizeof(STU));
    printf("请输入学生姓名:\n");
    scanf("%s",&p->name);
    printf("请输入学生的学号:\n");
    scanf("%d",&p->xuehao);
    printf("请输入学生的成绩:\n");
    scanf("%d",&p->grade);
    if (i==0)
    p2=p_start=p;
    else
    {
    p2->next=p;
    p2=p;
    if (i==2)
    p->next=NULL;
    }
   }
 //  printf("%d",p_start->next->next->next);
  // printf("%d",p_start->next->next->xuehao);
   //链表的插入 
   p_charu=p_start;
   printf("请输入要删除的学号\n");
   scanf("%d",&xuehao);
   while (1)
   {
    p_charu2=p_charu->next;
   if (p_charu->next->xuehao==xuehao)
      {
//  if (p_charu->next->next==NULL)
 //         p_charu->next=NULL;
        else
        p_charu->next=p_charu->next->next;
       free(p_charu2);
        break;
      } 
    if (p_charu->xuehao==xuehao)
    {
      p_start=p_charu->next;
      free(p_charu);
     break; 
    }
    p_charu=p->next;
   }
   //输出
   p_print=p_start;
   /*
   for (i=0;i<2;i++)
   {
     printf("学生姓名为:%s\n",p_print->name);
     printf("学生的学号为:%d\n",p_print->xuehao);
     printf("学生的分数为:%d\n",p_print->grade);
     if (p_print->next!=NULL)
     p_print=p_print->next;
   }
   */
}

这是一个删除结点并输出的程序,
加注释的输出部分没有问题,关键应该在删除结点的循环那里,但是找不见错误啊,
错误为:当删除最后一个链表也就是3时程序发生错误,停止运行。

求解

展开
收起
a123456678 2016-06-07 19:25:28 3857 0
4 条回答
写回答
取消 提交回答
  • 专注物联网

    include define NUll 0include

    struct stu
    {

    char name[6];
    int xuehao;
    int grade;
    struct stu *next;
    };
    typedef struct stu STU;
    main()
    {
    STU p,p_start,p2,p_print,p_charu,p_charu2;
    int i,xuehao;
    //输入
    for (i=0;i<3;i++)
    {

    p=(STU *)malloc(sizeof(STU));
    printf("请输入学生姓名:n");
    scanf("%s",p->name);
    printf("请输入学生的学号:n");
    scanf("%d",&p->xuehao);
    printf("请输入学生的成绩:n");
    scanf("%d",&p->grade);
    if (i==0)
    {

    p2=p_start=p;
    }
    else
    {

    p2->next=p;
    p2=p;
    if (i==2)
    p->next=NULL;
    }
    }
    // printf("%d",p_start->next->next->next);
    // printf("%d",p_start->next->next->xuehao);
    //链表的插入
    p_charu=p_start;
    printf("请输入要删除的学号n");
    scanf("%d",&xuehao);
    while (1)
    {

    p_charu2=p_charu->next;
    if (p_charu->next->xuehao==xuehao)
    {
    // if (p_charu->next->next==NULL)
    // p_charu->next=NULL;

    }

    else

    {

    p_charu->next=p_charu->next->next;

    free(p_charu2);

    break;

    }
    if (p_charu->xuehao==xuehao)
    {
    p_start=p_charu->next;
    free(p_charu);
    break;
    }
    p_charu=p->next;
    }

    p_print=p_start;
    }
    代码格式好,花括号都缺少了

    2019-07-17 19:30:51
    赞同 展开评论 打赏
  • 乐于学习与分析

    struct stu
    {

    char name[6];
    int xuehao;
    int grade;
    struct stu *next;
    };
    typedef struct stu STU;
    main()
    {
    STU p,p_start,p2,p_print,p_charu,p_charu2;
    int i,xuehao;
    //输入
    for (i=0;i<3;i++)
    {

    p=(STU *)malloc(sizeof(STU));
    printf("请输入学生姓名:n");
    scanf("%s",p->name);
    printf("请输入学生的学号:n");
    scanf("%d",&p->xuehao);
    printf("请输入学生的成绩:n");
    scanf("%d",&p->grade);
    if (i==0)
    {

    p2=p_start=p;

    }
    else
    {

    p2->next=p;
    p2=p;
    if (i==2)
    p->next=NULL;

    }
    }
    // printf("%d",p_start->next->next->next);
    // printf("%d",p_start->next->next->xuehao);
    //链表的插入
    p_charu=p_start;
    printf("请输入要删除的学号n");
    scanf("%d",&xuehao);
    while (1)
    {

    p_charu2=p_charu->next;
      if (p_charu->next->xuehao==xuehao)
      {

    // if (p_charu->next->next==NULL)
    // p_charu->next=NULL;

      }
        else
    {
        p_charu->next=p_charu->next->next;
       free(p_charu2);
        break;
      } 
    if (p_charu->xuehao==xuehao)
    {
      p_start=p_charu->next;
      free(p_charu);
     break; 
    }

    p_charu=p->next;
    }

    p_print=p_start;
    }
    代码格式好,花括号都缺少了

    2019-07-17 19:30:50
    赞同 展开评论 打赏
  • 软件开发,安全加密

    include define NUll 0include

    struct stu
    {

    char name[6];
    int xuehao;
    int grade;
    struct stu *next;
    };
    typedef struct stu STU;
    main()
    {
    STU p,p_start,p2,p_print,p_charu,p_charu2;
    int i,xuehao;
    //输入
    for (i=0;i<3;i++)
    {

    p=(STU *)malloc(sizeof(STU));
    printf("请输入学生姓名:n");
    scanf("%s",p->name);
    printf("请输入学生的学号:n");
    scanf("%d",&p->xuehao);
    printf("请输入学生的成绩:n");
    scanf("%d",&p->grade);
    if (i==0)
    {

    p2=p_start=p;

    }
    else
    {

    p2->next=p;
    p2=p;
    if (i==2)
    p->next=NULL;

    }
    }
    // printf("%d",p_start->next->next->next);
    // printf("%d",p_start->next->next->xuehao);
    //链表的插入
    p_charu=p_start;
    printf("请输入要删除的学号n");
    scanf("%d",&xuehao);
    while (1)
    {

    p_charu2=p_charu->next;
      if (p_charu->next->xuehao==xuehao)
      {

    // if (p_charu->next->next==NULL)
    // p_charu->next=NULL;

      }
        else
    {
        p_charu->next=p_charu->next->next;
       free(p_charu2);
        break;
      } 
    if (p_charu->xuehao==xuehao)
    {
      p_start=p_charu->next;
      free(p_charu);
     break; 
    }

    p_charu=p->next;
    }

    p_print=p_start;
    }
    代码格式好,花括号都缺少了

    2019-07-17 19:30:50
    赞同 展开评论 打赏
  • stu 结构体的成员next 怎么是个结构体类型
    这里应该是个 struct stu *next的指针吧.

    2019-07-17 19:30:50
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载