2010-05-19 44 views
1

我想在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; 
    } 
} 

回答

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

还请注意,您printList线主要应printList(ptr);

0

那么,你应该写一个函数InsertAfter,这需要一个指向列表节点和新的值,然后

  • 分配一个带有值的新节点,其nextptr设置为旧列表节点的下一个列
  • 将旧列表节点的nextptr更改为指向新节点

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

1

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

例如,无论你在哪里结束插入新的节点,你总是不得不分配它并设置其number场,所以这段代码:

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

应做一次,函数的顶部。

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;