将节点插入此链表的最佳方法是什么?

时间:2013-07-19 06:44:26

标签: c linked-list

所以这是我的链表计划的代码。我知道它不是那么好,但它有效。我想更改ins()函数,以便按大小将新元素插入到列表中。即,列表中的最后一个节点将包含最大整数,并且第一个节点最小。从文本文件中读取整数,正如您在main()中看到的那样,文本文件中的INSERT和REMOVE命令被解释为在列表中插入(下一行的下一个整数)的命令,或者从列表中删除元素。如何使用现有代码执行此操作?我尝试修改我的ins()函数,但无法正确订购我的列表。

#include <stdio.h>
#include <stdlib.h>

struct node {
    int number;
    struct node *next;
};

/* prototypes */

void ins(struct node *llist, int number);
void rem(struct node *llist);
void sho(struct node *llist);

int main(void)
{
    int number;
    char command[6];
    struct node *llist;
    struct node *root;

    llist = (struct node *)malloc(sizeof(struct node));
    llist->number = 0;
    llist->next = NULL;

    root = llist;

    printf("addr: \n\n%p,%p\n\n", &llist, &root);

    FILE *file;
    file = fopen("a3data.txt", "r");

    if (file == NULL)
    {
        printf("\n----------------------------------------\n");
        printf("| Error.  Did not read file.  Exiting. |\n");
        printf("----------------------------------------\n\n");
        exit(1);
    }
    else
    {
        while ((fscanf(file, "%s", command)) != EOF)
        {
            if((strcmp(command, "INSERT"))==0)
                {
                    fscanf(file, "%d", &number);
                    printf("\nINSERT            ", number);
                    ins(llist, number);
                    sho(llist);
                }
            else if((strcmp(command, "REMOVE"))==0)
                {
                    printf("\n         REMOVE   ");                
                    rem(llist);
                    sho(llist);
                }
        }
    }

    printf("\n");
    free(llist);
    return(0);
}

void ins(struct node *llist, int number) 
{
    while(llist->next != NULL)
    {
        llist = llist->next;
    }

    llist->next = (struct node *)malloc(sizeof(struct node));
    llist->next->number = number;
    llist->next->next = NULL;
}

void rem(struct node *llist)
{
    while(llist->next->next != NULL)
    {
        llist = llist->next;
    }

    llist->next = NULL;
}

void sho(struct node *llist)
{
    while(llist->next != NULL)
    {
        printf("%d ", llist->number);
        llist = llist->next;
    }

    printf("%d", llist->number);
}

3 个答案:

答案 0 :(得分:0)

ins()函数中,而不是

while(llist->next != NULL)

使用

while((llist->next != NULL) && (llist->number < number))

这将帮助您在插入时进行排序。

同样在rem()函数中,您必须释放动态分配的内存。

答案 1 :(得分:0)

您的插入只是在尾部添加元素。您必须编写代码来比较节点(list-&gt; number)的当前值与要插入的数字。如果当前值大于要插入的数字,则必须在当前节点之前插入该数字。为此,您还必须保留前一个指针。我写的代码只是为了理解逻辑,没有检查是否正确。

if(llist->number > innumber) {
    node *newNode = (struct node *)malloc(sizeof(struct node);
    newNode->number = innumber; 
    prevPointer->next = newNode;
    newNode->next = llist;
}

答案 2 :(得分:0)

您案例中的修改功能

void ins(struct node *llist, int number) 
{
  struct node *llist1;
  while(llist->next != NULL)
  {
    if (llist->next->number > number)
       break;
    llist = llist->next;
  }

  llist1 = (struct node *)malloc(sizeof(struct node));
  llist1->number = number;
  llist1->next = llist->next;
  llist->next = llist1;
}