按升序接受链表中的元素,然后我想打印整个链表,但它只打印第一个数字并给出运行时错误。在c中的数据结构中可以使用类似的代码。 这里t = start,这样当输入小于起始节点的元素时,起始节点的地址保存在t指针中。
#include<stdio.h>
#include<stdlib.h>
//creation of a linked list
struct node
{
int data;
struct node *next;
};
void display(struct node *start); //function to display Linked list
int main()
{
struct node *start,*t,*r;
start=NULL;
t=start;
int n,num,i;
print("\n enter the number of elements");
scanf("%d",&num);
for(i=0;i<num;i++)
{
printf("\n enter the %d element",i);
scanf("%d",&n);
r=(struct node *)malloc(sizeof(struct node));//
r->data=n;
if(start==NULL || start->data>n)//if the element id the first element or the element is less than the current element
{
start=r;
start->next=t;
}
else
{
t=start;
while(t!=NULL)
{
if(t->data<n && (t->next==NULL || t->next->data>n))//element has to added in the end or else it should be added between the following elements
{
r->next=t->next;
t->next=r;
}
t=t->next;
}
}
}
display(start);
}
void display(struct node *start)
{
struct node *display;
display=start;
while(display!=NULL)
{
print("%d ",display->data);
display=display->next;
}
}
答案 0 :(得分:0)
正如您的描述所示,当输入值低于列表头值时,您会遇到问题,您希望将分配的节点放在列表的开头并验证此节点现在指向前一个头:
if( start == NULL || start->data > n )//if the element id the first element or the element is less than the current element
{
r->next = start; //1
start=r; //2
//start->next=t; //3
}
r
现在应指向您之前start
start
指针移动到列表的头部r
你的错误:
每次循环中的迭代t
总是指向NULL,因为`t = t-&gt; next;'和'while(t!= NULL)'。
在这种情况下,每次if
评估为true
时(当前值应放在列表的开头),您有效地创建了一个新的列表,其中该节点是头部。< / p>