You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言基于指针实现链表反转:先删节点后反转输出问题求助

C语言链表操作问题排查与修正方案

现存问题

  • 核心链表反转功能未实现,仅完成等值节点删除逻辑,未满足打印前必须反转的要求
  • 主函数执行流程缺失反转步骤,删除节点后直接打印,导致输出顺序与预期不符
  • 结构体定义的next指针无实际使用,当前链表仅通过prev指针实现单向遍历

完整修正代码

#include <stdio.h>
#include <stdlib.h>
struct NODE {
    int value;
    struct NODE* prev;
    struct NODE* next;
};

struct NODE* addElement(struct NODE *tail, int val){
    struct NODE *n = malloc(sizeof(struct NODE));
    n->value =val;
    n->prev=NULL;
    if(tail==NULL){
        return n;
    }
    struct NODE* c=tail;
    while(c!=NULL && c->prev!=NULL){
        c=c->prev;
    }
    c->prev=n;
    return tail;
}

struct NODE* deleteEqualNodes(struct NODE *tail, int x){
    struct NODE *temp = tail, *prev;
    if (temp != NULL && temp->value == x) {
        tail = temp->prev;
        free(temp);
        temp = tail;
    }
    while (temp != NULL) {
        while (temp != NULL && temp->value != x) {
            prev = temp;
            temp = temp->prev;
        }
        if (temp == NULL)
            return tail;
        prev->prev = temp->prev;
        free(temp);
        temp = prev->prev;
    }
    return tail;
}

// 新增链表反转函数
struct NODE* reverseList(struct NODE* old_head) {
    struct NODE *prev = NULL, *curr = old_head, *next_node = NULL;
    while (curr != NULL) {
        next_node = curr->prev;
        curr->prev = prev;
        prev = curr;
        curr = next_node;
    }
    return prev;
}

void printList(struct NODE *tail){
    int count=0;
    while(tail!=NULL){
        if(count==0){
            printf("%d",tail->value);
            count=1;
        }
       else{
           printf(", %d",tail->value);
       }
    tail = tail->prev;
    }
    printf("\n");
}

int main(){
    int n;
    scanf("%d",&n);
    struct NODE* newList=NULL;
    for(int i=0;i<n;i++){
        int a;
        scanf("%d",&a);
        newList = addElement(newList, a);
    }
    int k;
    scanf("%d",&k);
    k = k + 1;
    struct NODE *after_delete = deleteEqualNodes(newList, k);
    // 先删再反转,符合操作顺序要求
    struct NODE *after_reverse = reverseList(after_delete);
    printList(after_reverse);
    // 实际使用时可补充内存释放逻辑避免泄漏
    return 0;
}

修正说明

  • 新增reverseList反转函数适配当前链表的单向prev遍历逻辑,完成节点指针翻转
  • 调整主函数执行顺序:先执行等值节点删除,再执行链表反转,最后打印,完全符合要求
  • 优化打印逻辑,消除了原输出首元素前多余的空格

内容的提问来源于stack exchange,提问作者Matthew Oliveira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 10:57:01