数据结构的反转链表c语言


list* reverse(list *head)
{
    list *beg=NULL,*mid=head,*end=mid->next;
    while(mid)
    {
        mid->next=beg;
        beg=mid;
        mid=end;
        end=end->next;
    }
    
    head=beg;
    return head;
}

反转链表为什么没结果

你怎么调用的,贴出你的调用代码看看

list* reverse(list *head) {
    list *curr = head;
    list *prev = NULL;
    list *next = NULL;

    while (curr != NULL) {
        next = curr->next;
        curr->next = prev;
        prev = curr;
        curr = next;
    }

    return prev;
}

这么改,供参考:

list* reverse(list *head)
{
    list *beg=NULL,*mid=head;  //,*end=mid->next;
    head = NULL;
    while(mid)
    {
                               //mid->next=beg;
        beg = mid;
        mid = mid->next;       //mid=end;
        beg->next = head;
        head = beg;
    }
                              //head=beg;
    return head;
}

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7545789
  • 你也可以参考下这篇文章:迷宫的非递归求解 C语言 数据结构课程设计
  • 你还可以看下c语言参考手册中的 c语言-求值顺序与定序
  • 除此之外, 这篇博客: 【数据结构】C语言实现单链表中的 节点的后插操作 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • bool insertNextNode(LNode *p, int e) {
        if (p == NULL)
            return false;
        LNode *q = (LNode *)malloc(sizeof(LNode)); //创建一个新结点
        if (q == NULL) {
            return false;
        }
    
        q->data = e;
    
        //注意这两步顺序不能错
        q->next = p->next;
        p->next = q;
    
        return true;
    }
    
  • 您还可以看一下 王伟老师的C语言入门到精通课程中的 C指针的各种定义含义小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    问题解答:

    1. 我的链表反转操作的代码中有什么问题吗?

    答:需要看具体代码才能判断,可能是代码错误,也有可能是逻辑错误,需要仔细检查。以下是一个简单的单向链表反转操作的代码示例:

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef int ElemType;
    
    typedef struct LinkNode {
        ElemType data;                  // 节点数据
        struct LinkNode *next;          // 节点指针
    } LinkNode, *LinkList;
    
    // 链表反转函数
    LinkList ReverseList(LinkList head)
    {
        LinkList p = head, q = NULL;    // p用于保存当前节点的指针, q用于保存上一个节点的指针
    
        while (p != NULL) {
            LinkList r = p->next;
            p->next = q; 
            q = p; 
            p = r;
        }
    
        return q;
    }
    
    // 打印链表
    void PrintList(LinkList head)
    {
        LinkList p = head;
    
        while (p != NULL) {
            printf("%d ", p->data);
            p = p->next;
        }
    
        printf("\n");
    }
    
    // 创建链表
    LinkList CreateList(int n)
    {
        LinkList head = NULL, tail = NULL;
    
        for (int i = 0; i < n; i++) {
            LinkList p = (LinkList)malloc(sizeof(LinkNode));
            scanf("%d", &(p->data));
            p->next = NULL;
    
            if (head == NULL) {
                head = p;
                tail = p;
            } else {
                tail->next = p;
                tail = p;
            }
        }
    
        return head;
    }
    
    int main()
    {
        int n;
        scanf("%d", &n);
        LinkList list = CreateList(n);
        PrintList(list);
        list = ReverseList(list);
        PrintList(list);
        return 0;
    }
    
    1. 我的链表数据结构是否被正确地定义?

    答:需要看具体代码才能判断,如果定义不正确会导致程序出现各种错误,从代码中没有提供足够的信息识别该问题。

    1. 反转链表时,我应该如何调用我的函数?

    答:先构建好链表,然后直接调用链表反转函数,最后输出结果即可。上面的代码已经给出了一个完整示例。

    1. 我的反转链表函数是否需要一些特定的输入格式?

    答:链表反转函数只需要接收一个链表的头指针作为参数,其他的无需特定输入格式。

    1. 可能导致函数没有返回结果的一些相应问题是什么?

    答:面对这个问题,有可能是链表的头指针未被传入函数,导致无法执行反转操作;也有可能是函数本身逻辑出现问题。此外,如果在函数中有动态申请内存,而内存申请失败,同样会导致函数调用失败。