c-将节点插入该链表的最佳方式



所以这是我的链表程序代码。我知道它没有那么好,但它有效。我想更改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: nn%p,%pnn", &llist, &root);
    FILE *file;
    file = fopen("a3data.txt", "r");
    if (file == NULL)
    {
        printf("n----------------------------------------n");
        printf("| Error.  Did not read file.  Exiting. |n");
        printf("----------------------------------------nn");
        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);
}

在中修改的函数

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

您的插入只是在尾部添加元素。您必须编写代码来将节点(列表->编号)的当前值与要插入的编号进行比较。如果当前值大于要插入的数字,则必须在当前节点之前插入该数字。为此,您还必须保留以前的指针。我写的代码只是为了理解逻辑,没有检查正确性。

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

ins()函数中,而不是

while(llist->next != NULL)

使用

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

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

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

最新更新