C 如何在已排序的链接列表中添加数字?
我试图在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
#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)代码>