qq_45947498 2022-03-11 21:44 采纳率: 100%
浏览 39
已结题

链表插入,在输入要插入值后,一直输出不停,具体看图

主要问题在链表插入那一块;具体代码如下


//链表
#include<stdio.h>
#include<stdlib.h>
struct Data{
    int num;
    struct Data *next;
};
int icount;//记录链表的长度 
//创建链表
struct Data *create()
{
    struct Data *head,*tail,*pn;
    icount=0; 
    pn=head=(struct Data *)malloc(sizeof(struct Data));
    head->next=NULL;
    tail=head;
    while(1)
    {
        pn=(struct Data *)malloc(sizeof(struct Data));
        printf("please input a num:");
        scanf("%d",&pn->num);
        if(pn->num==-1)
        {
            free(pn);//释放内存
            pn=NULL;
            break;//退出while循环
        }
        tail->next=pn;
        tail=pn;
        icount++; 
    }
    tail->next=NULL;
    return head;
}

//插入链表
struct Data *insert(struct Data *head)
{
    int i;
    struct Data *pn,*temp,*f;//f上一个
    //pn要插入的新节点 
    pn=(struct Data *)malloc(sizeof(struct Data));
    printf("please input a num :");
    scanf("%d",&pn->num);
    //第一种情况只有头节点存在
    temp=head;

    if(head==NULL)
    {
        
            head=pn;
            pn->next=NULL; 
    }
    //在链表 中插入 
    else 
    {
        //找到要插入的位置
        while((pn->num>temp->num)&&(temp->next!=NULL))
        {
            f=temp;
            temp=temp->next;
        }
        if(pn->num<=temp->num)
        {
            if(head==temp)//在表头
                head=pn;
            else
            //表中间
            {
                f->next=pn;
                pn->next=temp;
                
            }
        }
        //表尾
        else
        {
            temp->next=pn;
            pn->next=NULL;
        }
    }
    
    return head;
}
//删除节点
void Delete(struct Data *head,int  num)
{
    struct Data *temp,*del;
    int i;
    temp=head;
    del=temp;//del和temp同时指向一个位置
    for(i=0;i<num;i++)//使得del指向要删除的节点 
    {
        temp=del;
        del=del->next;    
    } 
    temp->next=del->next;
    free(del);

} 
//打印链表
void print(struct Data *head)
{
    printf("-----------共有%d个节点-----------\n",icount);
    while(head!=NULL)
    {
        printf("num:%d\n",head->num);
        head=head->next;    
    }     
}
int main()
{
    int num;
    struct Data *head;
    head=create();
    print(head);
    printf("请输入要删除的节点");
    scanf("%d",&num) ;
    Delete(head,num);
    print(head);
    printf("请插入节点");
    head=insert(head);
    printf("插入节点后 :"); 
    print(head); 
    return 0;
}

错误如下:

img

  • 写回答

2条回答 默认 最新

  • qzjhjxj 2022-03-12 11:33
    关注

    修改处见注释,供参考:

    
    //链表
    #include<stdio.h>
    #include<stdlib.h>
    struct Data{
        int num;
        struct Data *next;
    };
    int icount;//记录链表的长度
    //创建链表
    struct Data *create()
    {
        struct Data *head,*tail,*pn;
        icount=0;
        pn=head=(struct Data *)malloc(sizeof(struct Data));
        head->next=NULL;
        tail=head;
        while(1)
        {
            pn=(struct Data *)malloc(sizeof(struct Data));
            pn->next = NULL;    //修改
            printf("please input a num:");
            scanf("%d",&pn->num);
            if(pn->num==-1)
            {
                free(pn);//释放内存
                pn=NULL;
                break;//退出while循环
            }
            tail->next=pn;
            tail=pn;
            icount++;
        }
        //tail->next=NULL;  //修改
        return head;
    }
     
    //插入链表
    struct Data *insert(struct Data *head)
    {
        int i;
        struct Data *pn,*temp,*f;//f上一个
        if(head == NULL)  return NULL;   //修改
        //pn要插入的新节点 
        pn=(struct Data *)malloc(sizeof(struct Data));
        pn->next=NULL;
        printf("please input a num :");
        scanf("%d",&pn->num);
        
        if(head->next == NULL){ //第一种情况只有头节点存在
             head->next = pn;   //修改
        }
        //在链表 中插入
        else{
             temp = head;   //修改
             while(temp->next && (pn->num > temp->next->num))//找到要插入的位置  修改
                  temp=temp->next;
    
             pn->next = temp->next;  //修改
             temp->next = pn;        //修改
             //}
             //if(pn->num<=temp->num)
             //{
             //    if(head==temp)//在表头
             //       head=pn;
             //    else
                    //表中间
             //    {
                    //f->next=pn;
                    //pn->next=temp;
             //    }
             //}
                   //表尾
             //else
             //{
             //   
             //    pn->next=NULL;
             //}
        }
        icount++;   //修改
        return head;
    }
    //删除节点
    struct Data * Delete(struct Data *head,int  num) //void Delete(struct Data *head,int  num)
    {
        struct Data *temp,*del;
        int i;
        temp=head;
        del=temp;//del和temp同时指向一个位置
        for(i=0;i<num;i++)//使得del指向要删除的节点
        {
            temp=del;
            del=del->next;
        } 
        temp->next=del->next;
        free(del);
        icount--;  //修改
        return head;//修改
    } 
    //打印链表
    void print(struct Data *head)
    {
        printf("-----------共有%d个节点-----------\n",icount);
        while(head->next!=NULL)  //修改
        {
            printf("num:%d\n",head->next->num);//修改
            head=head->next;    
        }     
    }
    int main()
    {
        int num;
        struct Data *head;
        head=create();
        print(head);
        printf("请输入要删除的节点");
        scanf("%d",&num) ;
        head=Delete(head,num);//修改
        print(head);
        printf("请插入节点");
        head=insert(head);
        printf("插入节点后 :");
        print(head);
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥30 vmware exsi重置后登不上
  • ¥15 易盾点选的cb参数怎么解啊
  • ¥15 MATLAB运行显示错误,如何解决?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题
  • ¥20 yolov5自定义Prune报错,如何解决?
  • ¥15 电磁场的matlab仿真
  • ¥15 mars2d在vue3中的引入问题
  • ¥50 h5唤醒支付宝并跳转至向小荷包转账界面