YumeNoTsuduki 2022-10-01 13:56 采纳率: 100%
浏览 28
已结题

数据结构(c语言)关于链表的运用

添加会丢失前面的数据,而删除会直接崩掉

#define NULL 0
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
typedef struct stu
{  
         int num;                 //学生的学号
char name[10];//学生的姓名
         float score;              //学生的成绩
 }STUDENT;                         //存放单个学生信息的结构体类型

typedef struct node
   { 
      STUDENT  data;       //结点的值
struct node  *next;  //指向下一个结点的地址
   }SNODE;

void showmenu()
{          //显示菜单
    printf("    欢迎使用成绩管理小软件\n");
    printf("\t1、创建学生信息\n");
    printf("\t2、插入学生信息\n");
    printf("\t3、删除学生信息\n");
    printf("\t4、显示学生信息\n");
    printf("\t5、退出程序\n");    
}

SNODE *listcreate(SNODE *head,int n)        //n为该班级的实际人数
{                                         //建立班级学生信息
    int i; 
    SNODE *p=NULL,*q=NULL;
    p=head;
    for(i=1;i<=n;i++)        //循环插入n个学生
    {
        printf("\n请输入第%d位学生的信息:\n",i);
        q=(SNODE *)malloc(sizeof(SNODE));
        printf("学号=");scanf("%d",&q->data.num);        
        printf("姓名=");scanf("%s",q->data.name);        
        printf("成绩=");scanf("%f",&q->data.score);    
        q->next=NULL;
        p->next=q;
        p=q;
        head->data.num++;
    }
    return head;
}

SNODE *listinsert(SNODE  *head,int i)            //将学生插入到班级Li_head的第i个位置。
{
    SNODE *p,*s;
    p=head->next;
    int j=0;
    printf("\n请输入插入的学生的信息:\n",i);
        s=(SNODE *)malloc(sizeof(SNODE));
        printf("学号=");scanf("%d",&s->data.num);        
        printf("姓名=");scanf("%s",&s->data.name);        
        printf("成绩=");scanf("%f",&s->data.score);    
 
while (j < i - 1 && p != NULL)//寻找第i-1个结点p
    {
        j++;
        p = p->next;
    }
    if (p == NULL)
    printf("这不是一个合法的位置\n");

    s->next=p->next;
    p->next=s; 
}
SNODE *listdel(SNODE *head,int i)    
            //删除链表Li_head中第i个学生的信息
{    
int j=0;
    SNODE *r,*p;
    p=head->next;
    while(p->next!=NULL&&j<i-1)
    {
        j++;
        p=p->next;
    }
    r=p->next;
    p->next=r->next;
    free(r);    
}

void listdisplay(SNODE *head)
{
     //显示所有学生信息
    SNODE *p;
    p=head->next;
    printf("班级学生信息如下:\n");
    printf("      学号      姓名      成绩\n");
    while(p!=NULL)
         {
         printf("%10d%10s%10.2f\n",p->data.num,p->data.name,p->data.score);
         p=p->next;
        }
}

int main()      
{
    SNODE *head=NULL;
    int no,stu_count,pos;
head=(SNODE *)malloc(sizeof(SNODE));//动态建立第一个结点,作为头结点,head指针指向它,
head->data.num=0;                  //链表为带头结点的单链表
    head->next=NULL;
    while(1)
    {
        showmenu();
        printf("    请输入你的选择:");
        scanf("%d",&no);
        switch(no)
        {
            case 1:    printf("班级信息初始化,按任意键继续……\n");
                    getch();
                    printf("请输入班级学生原始人数:");
                    scanf("%d",&stu_count);
                    head=listcreate(head,stu_count);
                    system("cls");
                    showmenu();
                    listdisplay(head);
                    printf("班级信息初始化已经完成,按任意键继续……\n");
                    getch();
                    system("cls");
                    break;
            case 2:printf("插入前班级信息:\n");
                   listdisplay(head);
                   printf("请输入插入位置:");
                   scanf("%d",&pos);                  
                   head=listinsert(head,pos);
                   printf("插入后班级信息:\n");
                   listdisplay(head);
                   printf("插入已经完成,按任意键继续……\n");
                   getch();
                   system("cls");
                   break;
            case 3:printf("删除前班级信息:\n");
                   listdisplay(head);
                   printf("请输入删除位置:");
                   scanf("%d",&pos);
                   head=listdel(head,pos);
                   printf("删除后班级信息:\n");
                   listdisplay(head);
                   printf("删除已经完成,按任意键继续……\n");
                   getch();
                   system("cls");
                   break;
            case 4:listdisplay(head);
                   printf("显示结果如上所示,按任意键继续……\n");
                   getch();
                   system("cls");
                   break;
            case 5:return 0;
        }
    }    
}

​
  • 写回答

3条回答 默认 最新

  • 莪是男神 2022-10-01 14:52
    关注

    我来指出一下你代码中的一些问题:

    1. 第一行代码的 #define NULL 0 是可有可无的, NULL 不需要再次进行定义,可以直接用于 if 判断,这种写法是支持的
      int * r = NULL;
      if(!r) {
       printf("r 为空");
      }
      
    2. 自定义结构体的命名不应该全部大写的,而是仅首字母大写才对,因为一般来说,常量的变量名才全部大写
      typedef struct stu
      {  
       int num;             // 学生的学号
       char name[10];       // 学生的姓名
       float score;         // 学生的成绩
      } STUDENT;            // 存放单个学生信息的结构体类型
      
    3. void showmenu()的问题:在C语言中,规定无参的函数应当在函数声明中写明为 void,即,此函数应当声明为 void showmenu(void)
    4. listcreate() 函数的问题:使用 malloc() 函数申请堆内存的时候,是有可能返回 NULL 的,函数里面你没有对这个作判断。此外,对输入也没有作容错处理,假如我在输入学号时直接输入字符串,那么程序就有问题了,
      还有一些其他的错误,太多了,我这里有个示例,你照我示例写吧
      https://gitee.com/lan-kewan/data-structure-and-algorithms/blob/master/DataStructure/List/LinkedList/LinkedList.c
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 10月18日
  • 已采纳回答 10月10日
  • 创建了问题 10月1日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改