我正在尝试在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;
}
}
答案 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,它接受一个指向列表节点和新值的指针,然后
然后你必须特殊情况'这个值小于列表开头的值'(在这种情况下你必须返回一个指向新的列表开头的指针),否则你循环直到你得到一个大于你想要插入的值或列表末尾的数字,然后在它之前插入一个数字。