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
相关产品推荐
相关产品推荐

