c语言链表插入问题,pta提交有个段错误,请各位大佬帮忙找找茬,感激!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言链表插入问题,pta提交有个段错误,请各位大佬帮忙找找茬,感激!相关的知识,希望对你有一定的参考价值。

#include <stdio.h>#include <stdlib.h>struct date int num; struct date *next;;int main() int i=0,n,m,cnt=0,num; struct date *head,*p,*q,*k,*x,*g; scanf("%d",&n); scanf("%d",&num); while(cnt<n) p=(struct date *)malloc(sizeof(struct date)); p->num=num; cnt++; if(cnt==1) head=p; q=p; else q->next=p; q=p; if(cnt<n) scanf("%d",&num); p->next=NULL; scanf("%d",&m); x=(struct date *)malloc(sizeof(struct date)); x->num=m; k=head; while(k->next!=NULL&&k->next->num<m) k=k->next; if(k->next!=NULL&&head->num>m) x->next=head; for(g=x;g!=NULL;g=g->next) printf(" %d",g->num); else if(k->next!=NULL&&head->num<=m) x->next=k->next; k->next=x; for(g=head;g!=NULL;g=g->next) printf(" %d",g->num); else k->next=x; x->next=NULL; for(g=head;g!=NULL;g=g->next) printf(" %d",g->num); return 0;

看到你这问题,你时间快到了吧。

你变量命名很随意,没有备注,逻辑读起来很费时间,另外i变量没使用,所有指针变量都没有初值,建议都给初值NULL否则会有野指针。

直接模仿你的结构写一个吧。

#include <stdio.h>
#include <stdlib.h>
struct date
    int num;
    struct date *next;
;
int main()

    int n,m,num;
    struct date *head=NULL,*hSave=NULL,*tail=NULL,*newDate=NULL;
    scanf("%d",&n);//第一行有序输入
    while(n--)//根据第二行输入生成链表
    
        scanf("%d",&m);
        newDate=(struct date *)malloc(sizeof(struct date));
        newDate->num=m;
        newDate->next=NULL;
        if(!newDate)
            return 1;
        if(head==NULL)
        
            head=(struct date *)malloc(sizeof(struct date));
            if(!head)
                return 1;
            head->next=newDate;
        
        else
            tail->next=newDate;
        tail=newDate;
    

    scanf("%d",&num);//第三行输入 插入
    newDate=(struct date *)malloc(sizeof(struct date));
    newDate->num=num;
    newDate->next=NULL;
    hSave=head;
    while(hSave->next)//遍历链表
    
        if(hSave->next->num<=num && (hSave->next->next==NULL || hSave->next->next->num>=num))//当前节点数值小于等于输入并且(下一节点为空或下一个节点数值大于等于输入)
        
            newDate->next=hSave->next->next;
            hSave->next->next=newDate;
            break;
        
        hSave=hSave->next;
    
    while(head->next)//最终输出打印
    
        printf("%d ",head->next->num);
        head=head->next;
    
    return 0;

参考技术A 你变量命名很随意,没有备注,逻辑读起来很费时间,另外i变量没使用,所有指针变量都没有初值,建议都给初值NULL否则会有野指针。

结构体和链表

一,PTA实验作业

题目1:7-2 通讯录排序

1.PTA提交列表

技术分享图片

2.设计思路

定义一个包含姓名,生日,电话号码的结构体,再循环输入姓名生日和电话号码,用冒泡法找出年龄最小值并从大到小排序,最后循环输出。

技术分享图片

3.本题调试过程碰到问题及PTA提交列表情况说明

错误一:char name[ ]时,定义的长度不够大,导致运行错误,加大字符串的内存即可。

技术分享图片

错误二:struct friends 的x[10]定义的太小了,把内存改大就行。

技术分享图片

 

 

题目2:7-8 查找单价最高和最低的书籍

1.PTA提交列表

技术分享图片

2.设计思路

 定义一个结构数组存放书籍的名称和价格,先让第一个数为最大或者最小,要注意在gets时,因为它可以读入回车符,所以要手动输入一个回车符,否则会出错。接着循环判断下面的每一个数和第一个数的大小,比较完后,输出最大和最小值。

技术分享图片

3..本题调试过程碰到问题及PTA提交列表情况说明

错误一:输入name和price时,两个变量之间用\\n,应该用\\0才行。

技术分享图片

 

 

 

题目三:7-12 单向链表4

定义单向链表:输入若干个正整数(输入-1为结束标志),要求按输入数据的逆序并输出。

1.PTA提交列表

技术分享图片

2、设计思路

定义结构体,头结点、中间节点。先将头结点赋0,使用头插法,将数字直接倒序输出,用循环,当i为-1的时候跳出循环,循环中将p指向的值赋值为i,p->next=head->next,count++。

技术分享图片

3、调试过程碰到问题及PTA提交列表情况说明

技术分享图片

本题思路较简单,但还是有一些不懂的地方问的同学,链表运用不够熟悉

 

 

二、同学代码互评

依琳:

技术分享图片

我:

技术分享图片

依琳的代码跟我的总体思路差不多,差别在于在输入时,她加了一个getchar(),免去了我用scanf,还要手动输入一个字符来代替的麻烦;

其余的大致一样,更喜欢依琳的代码。

三、PTA最后排名

技术分享图片

 

四、本周学习总结

我学会了:

1、结构体定义并不是定义一个变量,而是定义了一种数据类型。

 2.用结构体能很好的把一些相关联的变量封装起来,看得较为清楚。

3.知道链表的新建和增删改查等功能,可以在一些复杂的程序中简化运算

4.输出用链表代替数组,可以更省内存并且方便删改 

还不会:

链表的增和删的功能运用不熟悉,结构体和链表的结合在具体题目中也还不会用

以上是关于c语言链表插入问题,pta提交有个段错误,请各位大佬帮忙找找茬,感激!的主要内容,如果未能解决你的问题,请参考以下文章

结构体和链表

pta结构体链表作业

结构体链表

结构体和链表

求C语言 数据结构中的链表创建,插入和删除代码

链表不插入新值“C语言”