2015-06-21 90 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); 
}