2010-05-19 84 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;