2303_80882796 2024-02-21 19:28 采纳率: 33.3%
浏览 3
已结题

为什么在链表特定位置插入不了节点

  1. 为什么在链表特定位置插入不了节点?(求解,问题到底出在什么地方?谢谢解答)
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
typedef struct _node{
    struct _node *next;
    int data;
} Node;
Node * Makelist()
{
    Node *last,*head,*p;
    head=NULL;
    last=head;
    int x;
    do
    {
        cin>>x;
        p=(Node *)malloc(sizeof(Node*));
        p->data=x;
        if(head)
        {
            last->next=p;
            p->next=NULL;
            last=p;
        }
        else
        {
            head=p;
            p->next=NULL;
            last=p;
        }
    }while(x!=-1);
    free(p);
    return head;
 } 

Node* add_dnate(Node *L,int a,int e)//L表示链表,a表示要插入的位置,e表示插入的数字 
{
    Node *q=L;
    int i=0;
    while(q&&i<a-1){
        q=q->next;
        i++;
    }
    if(q||i>a-1)
        return 0;
    else
    {
        Node *p=(Node*)malloc(sizeof(Node*));
        p->data=e;
        p->next=q->next;
        q->next=p;
        return L;
    }
    
}
int main()
{
    Node *t = Makelist();
    
    while(t)
    {
        cout<<t->data;
        t=t->next;
    }
    int a,n;cin>>n>>a;
    Node *i=add_dnate(t,n,a);
    while(i)
    {
        cout<<i->data;
        i=i->next;
    }
    return 0;
}


  • 写回答

2条回答 默认 最新

  • GISer Liu 2024-02-21 19:29
    关注

    该回答引用自GPT-3.5,由博主GISer Liu编写:

    首先,让我们逐步分析代码中可能存在的问题:

    1. add_dnate 函数中,有一个条件判断 if(q||i>a-1),这个条件可能存在问题。应该使用 if(!q || i != a-1) 来判断是否找到了要插入位置的前一个节点。这是因为如果 q 为空或者 i 不等于 a-1,表示没有找到插入位置,此时应该返回失败,而不是直接插入节点。否则可能会导致在链表末尾插入节点,而不是指定位置。

    2. Makelist 函数中,动态分配内存时存在问题。应该是 p=(Node *)malloc(sizeof(Node));,而不是 p=(Node *)malloc(sizeof(Node*));。原因是 sizeof(Node) 表示分配一个 Node 结构体的大小,而 sizeof(Node*) 表示分配一个指向 Node 结构体的指针的大小。因为 p 是一个指向 Node 结构体的指针,所以应该分配 Node 结构体的大小。

    3. main 函数中,调用 add_dnate 函数时应该传入的是链表的头指针 t,而不是链表中的某个节点。因为我们要在链表中插入节点,需要知道链表的头指针才能进行操作。

    综上所述,可以对代码进行如下修改:

    #include <iostream>
    #include <cstdlib>
    using namespace std;
    
    typedef struct _node {
        struct _node *next;
        int data;
    } Node;
    
    Node* Makelist() {
        Node *last, *head, *p;
        head = NULL;
        last = head;
        int x;
        do {
            cin >> x;
            if (x == -1) break;
            p = (Node *)malloc(sizeof(Node));
            p->data = x;
            if (head) {
                last->next = p;
                p->next = NULL;
                last = p;
            } else {
                head = p;
                p->next = NULL;
                last = p;
            }
        } while (true);
        return head;
    }
    
    Node* add_dnate(Node *L, int a, int e) {
        Node *q = L;
        int i = 0;
        while (q && i < a - 1) {
            q = q->next;
            i++;
        }
        if (!q || i != a - 1)
            return 0;
        else {
            Node *p = (Node*)malloc(sizeof(Node));
            p->data = e;
            p->next = q->next;
            q->next = p;
            return L;
        }
    }
    
    int main() {
        Node *t = Makelist();
        Node *head = t;
        while (t) {
            cout << t->data << " ";
            t = t->next;
        }
        cout << endl;
    
        int a, n;
        cin >> n >> a;
        head = add_dnate(head, n, a);
        t = head;
        while (t) {
            cout << t->data << " ";
            t = t->next;
        }
        return 0;
    }
    

    这样修改后,应该能够在链表的特定位置插入节点了。

    如果该回答解决了您的问题,请采纳!如果没有,请参考以下方案进行修订

    用户答题指南

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

报告相同问题?

问题事件

  • 系统已结题 3月1日
  • 已采纳回答 2月22日
  • 创建了问题 2月21日

悬赏问题

  • ¥15 悬赏Python-playwright部署在centos7上
  • ¥15 psoc creator软件有没有人能远程安装啊
  • ¥15 快速扫描算法求解Eikonal方程咨询
  • ¥20 我的是道格手机,重置后屏幕右上角出现红色字的未写入tee key 和未写入google key请问怎么去掉啊
  • ¥30 关于R语言运行分区生存模型中的问题!
  • ¥15 校内二手商品转让网站
  • ¥20 高德地图聚合图层MarkerCluster聚合多个点,但是ClusterData只有其中部分数据,原因应该是有经纬度重合的地方点,现在我想让ClusterData显示所有点的信息,如何实现?
  • ¥100 求Web版SPC控制图程序包调式
  • ¥20 指导如何跑通以下两个Github代码
  • ¥15 大家知道这个后备文件怎么删吗,为啥这些文件我只看到一份,没有后备呀