如何在已排序的链接列表中添加数字?

时间:2010-05-19 11:10:28

标签: c linked-list

我正在尝试在C中创建一个函数来将数字添加到有序链表中,但我已经得到了 感觉它可以在很少的行中完成。有一个例子吗?

此示例代码不起作用:

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

struct listNode {
    int number;
    struct listNode *nextPtr;
};

typedef struct listNode LISTNODE;
typedef LISTNODE *LISTNODEPTR;
int main ()
{
    LISTNODE a = {16,NULL};
    LISTNODEPTR ptr = &a;
    printList(&a);
    insert(&ptr,23);
    insert(&ptr,10);
    insert(&ptr,12);
    insert(&ptr,15);
    printList(&a);
    return 0;
}

void insert(LISTNODEPTR *list, int number){
    if((**list).number > number){
    printf("lol2 %d",number);
        LISTNODE *newNode =  malloc(sizeof(LISTNODE));
        (*newNode).number  = number;
        (*newNode).nextPtr  =  (*list);
        *list = newNode;
    }else if((**list).nextPtr == NULL){
    printf("lol %d",number);
        LISTNODE *newNode =  malloc(sizeof(LISTNODE));
        (*newNode).number  = number;
        (*newNode).nextPtr  =  NULL;
        (**list).nextPtr = newNode;

    }else{
    printf("other %d\n",number);
        LISTNODE *listPtr = *list;
        LISTNODE *listPtr1 = (*listPtr).nextPtr;
        while((*listPtr1).number < number && (*listPtr).nextPtr != NULL ){
            printf("%d > %d\n",(*listPtr).number , number);
            listPtr = (*listPtr).nextPtr;
            listPtr1 = (*listPtr).nextPtr;
        }
        LISTNODE *newNode =  malloc(sizeof(LISTNODE));
        (*newNode).number  = number;
        if((*listPtr).nextPtr != NULL){
            (*newNode).nextPtr  =  listPtr1;
        }else{
            (*newNode).nextPtr  =  NULL;
        }
        (*listPtr).nextPtr = newNode;
    }
}

4 个答案:

答案 0 :(得分:3)

是的,它可以做得更短:

void insert(LISTNODEPTR *list, int number)
{
    LISTNODE *newNode = malloc(sizeof *newNode);
    newNode->number = number;

    while (*list && (*list)->number < number)
    {
        list = &(*list)->nextPtr;
    }

    newNode->nextPtr = *list;
    *list = newNode;
}

另请注意,main中的printList行应为printList(ptr);

答案 1 :(得分:1)

开始缩短此代码的一个地方是寻找重复:你在多个地方做的事情。

例如,无论您最终在何处插入新节点,您始终都必须分配它并设置其number字段,因此此代码:

    LISTNODE *newNode =  malloc(sizeof(LISTNODE));
    (*newNode).number  = number;

应该在你的函数顶部完成一次。

答案 2 :(得分:1)

插入的一些伪代码:

listNode *curNode = *list,*prevNode = 0, *newNode= 0;
while (curNode->nextPtr && number <= curNode->number)
{
   prevNode = curNode;
   curNode = curNode->nextPtr;
}
newNode = CreateNode(number);
newNode->nextPtr = curNode;

if (prevNode)
   prevNode->nextNode = newNode;
else
   *list = newNode;

答案 3 :(得分:0)

好吧,你应该写一个函数InsertAfter,它接受一个指向列表节点和新值的指针,然后

  • 使用其中的值分配一个新节点,并将其nextptr设置为旧列表节点的nextptr
  • 将旧列表节点的nextptr更改为指向新节点

然后你必须特殊情况'这个值小于列表开头的值'(在这种情况下你必须返回一个指向新的列表开头的指针),否则你循环直到你得到一个大于你想要插入的值或列表末尾的数字,然后在它之前插入一个数字。