尝试用两个指针在c中查找middel但程序崩溃的链表



i编写函数,Traverse使用两个指针链接列表。将一个指针移动一个,将另一个指针移两个。当快速指针到达末尾时,慢速指针将到达链表的中间。但是当我试图将临时指针移动两个时,我的代码崩溃了

#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("nttenter 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("nttenter 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("nttenter 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("nttDATA : %dn", 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;

相关内容

  • 没有找到相关文章

最新更新