【发布时间】:2021-04-10 15:24:21
【问题描述】:
我正在用 C 语言编写一个用于反转循环单链表的程序。由于某种原因,我不断遇到分段错误。我确定问题出在reverse 函数上,因为我尝试对函数调用进行注释,程序运行良好。
对于我的 reverse() 函数,我使用了 3 个指针:prev、next 和 curr。逻辑是我将运行一个循环,直到curr 获取head 的地址,因为它是一个循环链表,它将存储在最后一个节点的link 部分。我将使用prev 指针不断更新curr->link,这会将其链接从下一个节点更改为上一个节点。
当循环中断时,head->link = prev; 和head = prev; 将更新各自的地址,使它们指向反向列表的第一个节点。
//reversing CLL
#include <stdio.h>
#include <stdlib.h>
struct node {
int data;
struct node *link;
} *head;
void reverse() {
struct node *prev = NULL, *curr = head, *next;
while (curr != head) {
next = curr->link;
curr->link = prev;
prev = curr;
curr = next;
}
head->link = prev;
head = prev;
}
void createList(int n) {
int i, data;
head = (struct node *)malloc(sizeof(struct node));
struct node *ptr = head, *temp;
printf("Enter data of node 1\t");
scanf("%d", &data);
head->data = data;
head->link = NULL;
for (i = 2; i <= n; i++) {
temp = (struct node *)malloc(sizeof(struct node));
printf("Enter data of node %d\t", i);
scanf("%d", &data);
temp->data = data;
temp->link = NULL;
ptr->link = temp;
ptr = ptr->link;
}
ptr->link = head;
}
void disp() {
struct node *ptr = head;
do {
printf("%d\t", ptr->data); //gdb debugger shows problem is in this line
ptr = ptr->link;
} while (ptr != head);
}
int main() {
int n;
printf("Enter no of nodes to be created\t");
scanf("%d", &n);
createList(n);
printf("\n\nList is displayed below!\n");
disp();
printf("\n\nReversing list ...\n");
reverse(); // on commenting this call, disp() function
// works accurately showing node data non-reversed
disp();
printf("\n\nList successfully reversed!\n");
}
【问题讨论】:
-
调试器显示错误出在 printf("%d\t",ptr->data);而且我一辈子都想不通。
-
@Mohsin while(curr!=head) 的循环条件何时计算为真?
-
@VladfromMoscow 循环从指向第一个节点的 curr 开始。当curr获取head的地址时,它会一直运行到最后一个节点,因为它是一个循环链表,所以最后一个节点的“链接”部分指向第一个节点。
-
您错过了弗拉德评论的重点。
curr = head; while(curr!=head)。使用该代码,while条件总是立即为假,因此循环体永远不会运行。
标签: c reverse singly-linked-list circular-list function-definition