【问题标题】:How do I add a number in a sorted linklist?如何在排序的链表中添加数字?
【发布时间】:2010-05-19 11:10:27
【问题描述】:

我正在尝试在 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;
    }
}

【问题讨论】:

    标签: c linked-list


    【解决方案1】:

    是的,它可以做得更短:

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

    【讨论】:

      【解决方案2】:

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

      例如,无论你最终在哪里插入新节点,你总是必须分配它并设置它的number 字段,所以这段代码:

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

      应该在函数顶部执行一次。

      【讨论】:

        【解决方案3】:

        一些用于插入的伪代码:

        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;
        

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-04-20
            • 1970-01-01
            • 2011-06-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多