markreisen 2022-12-20 18:23 采纳率: 100%
浏览 31
已结题

C语言链表插入的问题

一道链表题目:
建立单向 int 链表,连续输入 5 个结点创建链表,并实现在原链表中插入数字、删
除数字的功能。

#include <stdio.h>
#include <stdlib.h>
typedef struct i//结构体的定义 
{
    int num;
    struct i *next;
}def;

def *create()//头链表输入 
{
    def *head=NULL;//头指针 防止野指针 
    def *tail,*n;//*tail尾指针,*n新插入的指针 
    printf("输入五个数据:\n");
    int i=0;
    while(1)
    {
        n=(def *)malloc(sizeof(def)); //为n指针开辟一个指针 
        scanf("%d",&n->num);
        
        if(i==0)
        {
            head=n;
            tail=n;
        }
        else
        {
            tail->next=n;
            tail=n;
        }
        i++;
        if(i==5)
            break;
     } 
     tail->next=NULL;//防止野指针 
     return head;
}

void print(def *head)//输出链表 
{
    printf("现在的数有:\n");
    def *s;//移动链表 
    s=head;
    while(s!=NULL)
    {
        printf("%d\n",s->num);
        s=s->next;
     } 
 } 

void BubbleSort(def *L)
{
    int i,count =0,num;//count记录链表结点的个数,num进行内层循环,
    def *p,*q,*tail;//创建三个指针,进行冒泡排序
    p=L;
    while(p->next!=NULL)//计算出结点的个数
    {
        count++;
        p=p->next;
    }
    for(i=0;i<count-1;i++)//外层循环,跟数组冒泡排序一样
    {
        num=count-i-1;//记录内层循环需要的次数,跟数组冒泡排序一样,
        q =L->next;//令q指向第一个结点
        p=q->next;//令p指向后一个结点
        tail=L;//让tail始终指向q前一个结点,方便交换,也方便与进行下一步操作
        while(num--)//内层循环 次数跟数组冒泡排序一样
        {
            if(q->num>p->num)//如果该结点的值大于后一个结点,则交换
            {
                q->next=p->next;
                p->next=q;
                tail->next=p;
            }
            tail=tail->next;
            q=tail->next;
            p=q->next;
         } 
    } 
}





def *insert(def *head,def *n)//插入数 
{
    def *s0,*s1;
    s0=head;
    if(n->num<=head->num)//首项 
    {
        n->next=head;
        head=n;
    }
    else
    {
        while(n->num>=s0->num)
        {
            s1=s0;
            if(s1->next==NULL)//最后一项 
                break;
            s0=s0->next;
        }
        if(s1->next!=NULL)
        {
            n->next=s0;
            s1->next=n;
        }
        else
        {
            n=s1->next;
            n->next=NULL; 
        }
        
     } 
     return head;
  }  

def *del(def *head,int num) //删除数字 
{
    def *s0,*s1=NULL;
    s0=head;
    if(head->num==num)
    {
        head=head->next;
        free(s0);
    }
    else
    {
    
        s0=head;
        while(s0->num!=num&&s0->next!=NULL)
        {
            s1=s0;
            s0=s0->next;
        }
        if(s0->num==num)
        {
            s1->next=s0->next;
            free(s0);
        }
        else
            printf("没有这个数字!\n"); 
        
    }
    return head;
 } 


int main()
{
    def *head=NULL;
    head=create();//存数 
    BubbleSort(head);//升序排序 
    print(head);
    def *n;
    n=(def *)malloc(sizeof(def));//指针输入要开辟空间。 
    printf("输入插入的数:");//插入数字 
    scanf("%d",&n->num);
    n->next=NULL;
    head=insert(head,n); 
    print(head);
    printf("输入要删除的数:");//删除数字 
    int num;
    scanf("%d",&num);
    head=del(head,num);
    print(head);
    return 0; 
 } 

其中有一个问题。
在我输入5个数之后要插入一个数,如果这个数大于这5个数,这个程序会崩溃。
像这样

img


不知道有什么问题,有没有人解答一下,谢谢!
其实只要看insert的那一段

  • 写回答

2条回答 默认 最新

  • markreisen 2022-12-20 19:25
    关注

    是s1->next=n我傻了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月28日
  • 已采纳回答 12月20日
  • 创建了问题 12月20日

悬赏问题

  • ¥15 cocos的点击事件 怎么穿透到 原生fragment上。
  • ¥20 基于相关估计的TDOA算法中的加权最小二乘拟合法matlab仿真
  • ¥20 基于相关估计的TDOA算法中的自适应加权广义互相关法。
  • ¥15 abaqus CAE 2024软件启动问题
  • ¥20 基于相关估计的TDOA算法中的局部互相关函数滤波matlab仿真
  • ¥15 CDH6.0.1 hue报错
  • ¥15 javaFX利用scene builder的fxml文件进行开发时的label setText方法未生效问题
  • ¥15 notepad++ 自动补全提示,如输入汉字"人名",就会出现"张三","李四"
  • ¥15 如何用matlab实现PSO算法与两种智能优化算法在30维和50维问题上的性能比较?
  • ¥15 在qt的QGraphicsView和QGraphicsScene中遇到的问题