2015-06-21 137 views
1

我正嘗試在已排序的鏈接列表中輸入新節點。我不知道這段代碼有什麼問題。將節點插入已排序的雙向鏈表中

Node* SortedInsert(Node *head,int data) 
{ 
    struct Node *temp=head,*p=NULL; 
    struct Node *newNode=(struct Node*)malloc(sizeof(struct Node)); 
    newNode->data=data; 
    newNode->next=NULL; 
    newNode->prev=NULL; 
    if(!head){ 
     return newNode; 
    } 

    while((data>=(temp->data)) && temp!=NULL){ 
     p=temp; 
     temp=temp->next; 
    } 
    if(temp==NULL){ 
     p->next=newNode; 
     newNode->prev=p; 
     return head; 
    } 
    if(p==NULL){ 
     head->prev=newNode; 
     newNode->next=head; 
     return newNode; 
    } 

    p->next=newNode; 
    newNode->prev=p; 
    newNode->next=temp; 
    temp->prev=newNode; 

    return head; 
} 
+3

女士,將描述該問題是你的輸出/行爲什麼會有所幫助你的程序 – Bob

+0

添加註釋會幫助你和他人理解代碼。 – kaylum

+1

歡迎來到Stack Overflow。請儘快閱讀[關於]頁面。請注意,代碼的一個問題是它不是MCVE([如何創建最小,完整和可驗證的示例?](http://stackoverflow.com/help/mcve))。我們無法編譯代碼,因爲它不完整,而且您沒有描述您看到的錯誤,也沒有解釋爲什麼您不能使用調試器,也沒有添加診斷打印以幫助您查看發生了什麼問題,也不會在['valgrind']下運行(http://valgrind.org/)。 –

回答

3

while((data>=(temp->data)) && temp!=NULL){ 

應該讀

while(temp!=NULL && (data>=(temp->data))){ 

您需要測試temp不爲NULL第一否則你可能會做一個無效讀這可能會導致訪問衝突。

+0

確實如此,但在不知道OP的實際問題的情況下,將其作爲答案似乎有點過早。 –

+0

是的,這是做的工作.. 這是一個短路評估的情況? –

+0

是的,當左側的測試評估爲false時,右側的測試永遠不會執行,從而無法讀取難以訪問的內存位置。 – Eelke

2

似乎埃爾克的回答是關鍵問題。下面是使用節點A的typedef消除結構節點需要一個例子,因爲它不是在示例代碼使用一致:

#include <malloc.h> 
#include <stdio.h> 

typedef struct Node_{ 
    struct Node_ *next; 
    struct Node_ *prev; 
    int data; 
}Node; 

Node* SortedInsert(Node *head,int data) 
{ 
    Node *temp=head,*p=NULL; 
    Node *newNode=(Node*)malloc(sizeof(Node)); 
    newNode->data=data; 
    newNode->next=NULL; 
    newNode->prev=NULL; 
    if(!head){ 
     return newNode; 
    } 
    while(temp!=NULL && (data>=(temp->data))){ 
     p=temp; 
     temp=temp->next; 
    } 
    if(temp==NULL){ 
     p->next=newNode; 
     newNode->prev=p; 
     return head; 
    } 
    if(p==NULL){ 
     head->prev=newNode; 
     newNode->next=head; 
     return newNode; 
    } 
    p->next=newNode; 
    newNode->prev=p; 
    newNode->next=temp; 
    temp->prev=newNode; 
    return head; 
} 

int main(int argc, char *argv[]) 
{ 
Node * head = NULL; 
Node *pNode; 
    head = SortedInsert(head, 2); 
    head = SortedInsert(head, 5); 
    head = SortedInsert(head, 3); 
    head = SortedInsert(head, 4); 
    head = SortedInsert(head, 1); 
    while(head){  /* scan to last */ 
     pNode = head; 
     head = head->next; 
    } 
    while(pNode){  /* follow last to first */ 
     printf("%d\n", pNode->data); 
     head = pNode; 
     pNode = pNode->prev; 
    } 
    printf("\n"); 
    while(head){  /* follow first to last and free */ 
     printf("%d\n", head->data); 
     pNode = head; 
     head = head->next; 
     free(pNode); 
    } 
    return(0); 
}