gpt4 book ai didi

c - 尝试找到 middel 但程序崩溃了 c 中带有两个指针的链表

转载 作者:行者123 更新时间:2023-11-30 19:25:39 24 4
gpt4 key购买 nike

我编写了使用两个指针遍历链表的函数。将一个指针移动 1,将另一个指针移动 2。当快指针到达链表末尾时,慢指针将到达链表的中间。但是当我尝试将临时指针移动两次时,我的代码崩溃了

#include <stdio.h>
#include <stdlib.h>
#define MEM (struct node*) malloc(sizeof(struct node))

void addl(); //add elements at last
void print(); //print linked list
void addf(); //add element at first
void addm(); //add element at middel
struct node {

int data;
struct node* next;
};
struct node* head;

void addl()
{
struct node* new, *temp;
temp = head;

new = MEM;

printf("\n\t\tenter any number : ");
scanf("%d", &new->data);
new->next = 0;
if (temp == 0)
head = new;
else {
while ((temp->next != 0))
temp = temp->next;
temp->next = new;
}
}
void print()
{
struct node* temp = head; //
printf(" \n Elements are : ");
while (temp != 0) {
printf(" %d ", temp->data);
temp = temp->next;
}
}
void addf()
{
struct node* new;
new = MEM;
printf("\n\t\tenter any number : ");
scanf("%d", &new->data);
new->next = head;
head = new;
}
void addm()
{
struct node* new, *temp, *med;
temp = head;
med = head;
new = MEM; //MEM #define for dynamic memory allocation

printf("\n\t\tenter m any number : ");
scanf("%d", &new->data);

if (temp == 0)
head = new;
else {
while ((temp = temp->next != 0)) {
med = med->next;
temp = temp->next; //fist move
temp = temp->next; //2nd move when i add program crash
}
// new->next=med;
//med->next=new;
printf("\n\t\tDATA : %d\n", med->data);
}
}

int main()
{
head = 0;
int i = 5; //create linked list
while (i) {

system("cls");
addf();
addl();
i--;
}
addm();
print();
return 0;
}

到目前为止,addm 未在链接列表中添加任何内容,因为当我尝试找到链接列表的中间时代码崩溃

最佳答案

崩溃是由于这两行造成的 -

temp=temp->next;//for one move
temp=temp->next;//for second move when i add this program crash

让我们考虑两种情况 -

1) 列表只有一个元素。然后在 while 检查条件之后,dur 到 temp=temp->nexttemp 将指向 NULL。在下一个 temp=temp->next 行中,您尝试取消引用该 NULL。那会崩溃

2) 列表有 2 个元素。在 while 条件检查 temp 之后将指向最后一个元素。在下一个 temp=temp->next 行之后,temp 将指向 NULL。现在,在下一行中,您尝试取消引用该 NULL。这是另一个崩溃点

您需要从内部循环中删除一个 temp=temp->next ,因为它在每次循环迭代中将 temp 前进 3 个位置,这显然是一个逻辑错误。节点指出,删除其中之一后并不会消除崩溃的可能性。

还有一点是,注释的代码也是错误的。

//  new->next=med;
//med->next=new;

你可能想做 -

new->next = med->next;
med->next = new;

关于c - 尝试找到 middel 但程序崩溃了 c 中带有两个指针的链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58537789/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com