在中间输入一个节点以生成已排序的链接列表

时间:2014-07-14 05:31:41

标签: c singly-linked-list sortedlist

以下是我自己尝试制作的程序。我想在中间输入一个节点,使得排序的链接列表作为输出。但它不起作用。所以请帮助我一个完美的输出。让我明白这段代码出了什么问题?

#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;
    }
}

2 个答案:

答案 0 :(得分:0)

您的while (ch == 'y' || ch == 'Y')语句会在列表末尾添加数据。

永远不会评估while (temp->roll_no < tail->roll_no)语句条件,因为当您退出上一个while循环时,temp = tail。考虑一下您的算法,然后再试一次。

提示:

  1. 细分代码
  2. 创建一个创建节点node *createNode()的函数并返回指向它的指针。
  3. 制作另一个功能void insertNode( node * start, node *newNode)
  4. 然后,您可以将功能分开为

    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);
    }