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

C 如何在已排序的链接列表中添加数字?,c,linked-list,C,Linked List,我试图在C中创建一个函数,将数字添加到有序链表中,但我得到了 感觉它可以在更少的行中完成。有没有一个例子 此示例代码不起作用: #include <stdio.h> #include <stdlib.h> struct listNode { int number; struct listNode *nextPtr; }; typedef struct listNode LISTNODE; typedef LISTNODE *LISTNODEPTR; i

我试图在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;
    }
}
#包括
#包括
结构列表节点{
整数;
结构列表节点*nextPtr;
};
类型定义结构listNode listNode;
typedef LISTNODE*LISTNODEPTR;
int main()
{
LISTNODE a={16,NULL};
LISTNODEPTR ptr=&a;
打印列表(&a);
插入(&ptr,23);
插入(&ptr,10);
插入(&ptr,12);
插入(&ptr,15);
打印列表(&a);
返回0;
}
无效插入(LISTNODEPTR*列表,整数){
如果((**列表).编号>编号){
printf(“lol2%d”,数字);
LISTNODE*newNode=malloc(sizeof(LISTNODE));
(*newNode).编号=编号;
(*newNode.nextPtr=(*list);
*列表=新节点;
}else if((**list.nextPtr==NULL){
printf(“lol%d”,数字);
LISTNODE*newNode=malloc(sizeof(LISTNODE));
(*newNode).编号=编号;
(*newNode).nextPtr=NULL;
(**列表).nextPtr=newNode;
}否则{
printf(“其他%d\n”,编号);
LISTNODE*listPtr=*list;
LISTNODE*listPtr1=(*listPtr).nextPtr;
while((*listPtr1).number%d\n”,(*listPtr).number,number);
listPtr=(*listPtr).nextPtr;
listPtr1=(*listPtr).nextpttr;
}
LISTNODE*newNode=malloc(sizeof(LISTNODE));
(*newNode).编号=编号;
if((*listPtr).nextPtr!=NULL){
(*newNode).nextPtr=listPtr1;
}否则{
(*newNode).nextPtr=NULL;
}
(*listPtr).nextPtr=newNode;
}
}

嗯,您可能应该编写一个函数InsertAfter,它获取指向列表节点的指针和一个新值,然后

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

然后您必须使用特殊情况“此值小于列表开始处的值”(在这种情况下,您必须返回指向列表新开始处的指针),否则您将一直循环,直到找到一个大于您要插入的值或列表结束处的值的数,然后在该值之前插入。

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

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

然后您必须使用特殊情况“此值小于列表开头的值”(在这种情况下,您必须返回指向列表新开头的指针),否则您将继续循环,直到找到一个大于您要插入的值或列表结尾的数字,然后在前面的代码后面插入。

缩短此代码的一个地方是查找重复:您在多个地方执行的操作

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

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

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

开始缩短此代码的一个地方是查找重复:您在多个地方执行的操作

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

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

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

一些用于插入的伪代码:

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;
listNode*curNode=*list,*prevNode=0,*newNode=0;
while(curNode->nextPtr&&number)
{
prevNode=curNode;
curNode=curNode->nextPtr;
}
newNode=CreateNode(编号);
newNode->nextPtr=curNode;
if(prevNode)
prevNode->nextNode=newNode;
其他的
*列表=新节点;

一些用于插入的伪代码:

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;
listNode*curNode=*list,*prevNode=0,*newNode=0;
while(curNode->nextPtr&&number)
{
prevNode=curNode;
curNode=curNode->nextPtr;
}
newNode=CreateNode(编号);
newNode->nextPtr=curNode;
if(prevNode)
prevNode->nextNode=newNode;
其他的
*列表=新节点;

是的,可以做得更短:

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;
}
void插入(LISTNODEPTR*列表,整数)
{
LISTNODE*newNode=malloc(sizeof*newNode);
新建节点->编号=编号;
而(*list&&(*list)->numbernextPtr;
}
newNode->nextPtr=*列表;
*列表=新节点;
}

还要注意,main中的
printList
行应该是
printList(ptr)

是的,可以做得更短:

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;
}
void插入(LISTNODEPTR*列表,整数)
{
LISTNODE*newNode=malloc(sizeof*newNode);
新建节点->编号=编号;
而(*list&&(*list)->numbernextPtr;
}
newNode->nextPtr=*列表;
*列表=新节点;
}
还要注意,main中的
printList
行应该是
printList(ptr)