以下是我自己尝试制作的程序。我想在中间输入一个节点,使得排序的链接列表作为输出。但它不起作用。所以请帮助我一个完美的输出。让我明白这段代码出了什么问题?
#include<stdio.h>
#include<stdlib.h>
typedef struct node_type
{
int roll_no;
char name[10];
float marks;
struct node_type *next;
} node;
typedef node *list;
void show_list (list);
main ()
{
list head, temp, tail;
char ch;
int n;
head = NULL;
printf ("Do you want to add?(y/n)");
scanf ("%c", &ch);
if (ch == 'y' || ch == 'Y')
{
tail = (list) malloc (sizeof (node));
printf ("Enter the value for roll number:-\n");
scanf ("%d", &(tail->roll_no));
printf ("Enter name:-\n");
scanf ("%s", tail->name);
printf ("Enter marks:-\n");
scanf ("%f", &(tail->marks));
tail->next = head;
head = tail;
printf ("Enter more data?(y/n)\n");
scanf ("\n%c", &ch);
}
while (ch == 'y' || ch == 'Y')
{
tail->next = (list) malloc (sizeof (node));
printf ("Enter the value for roll number:-\n");
scanf ("%d", &(tail->next->roll_no));
printf ("Enter name:-\n");
scanf ("%s", tail->next->name);
printf ("Enter marks:-\n");
scanf ("%f", &(tail->next->marks));
temp = tail;
printf ("Enter more data?(y/n)\n");
scanf ("\n%c", &ch);
}
while (temp->roll_no < tail->roll_no)
{
head = tail;
tail = tail->next;
temp->next = tail;
head->next = temp;
}
show_list (head);
}
void
show_list (list start)
{
while (start != NULL)
{
printf ("%d \t %s \t %f \n", start->roll_no, start->name,
start->marks);
start = start->next;
}
}
答案 0 :(得分:0)
您的while (ch == 'y' || ch == 'Y')
语句会在列表末尾添加数据。
永远不会评估while (temp->roll_no < tail->roll_no)
语句条件,因为当您退出上一个while循环时,temp = tail
。考虑一下您的算法,然后再试一次。
提示:
node *createNode()
的函数并返回指向它的指针。void insertNode( node * start, node *newNode)
然后,您可以将功能分开为
while( 1 ) {
/* <
code that checks if you want to continue
and breaks out of the loop otherwise
>*/
insertNode(head, createNode())
}
你完成了。
你已经完成createNode()
了。只需再做一点另一个。
答案 1 :(得分:0)
您的插入机制有误。它总是在第二个位置添加/覆盖。 在第1个while循环的末尾添加以下两个语句来纠正这个:
尾= tail-&gt;接下来;
tail-&gt;接着= NULL;
然后丢弃第二个while循环,这完全没有意义。
然后尝试遍历并对列表进行排序。
否则,您可以在添加节点时对列表进行排序。 为此,请使用以下代码替换程序中的两个while循环:
while (ch == 'y' || ch == 'Y')
{
list T;
temp = (list) malloc (sizeof (node));
printf ("Enter the value for roll number:-\n");
scanf ("%d", &(temp->roll_no));
printf ("Enter name:-\n");
scanf ("%s", temp->name);
printf ("Enter marks:-\n");
scanf ("%f", &(temp->marks));
temp->next=NULL;
if(temp->roll_no<head->roll_no)
{
temp->next=head;
head=temp;
}
else{
for(T=head;;T=T->next)
{
if(T->next==NULL)
{
T->next=temp;
break;
}
if(temp->roll_no<T->next->roll_no)
{
temp->next=T->next;
T->next=temp;
break;
}
}
}
printf ("Enter more data?(y/n)\n");
scanf ("\n%c", &ch);
}