2011-04-11 109 views
2

我在期待下面的链表列表程序打印1 但它没有人可以找出原因吗?链接列表程序

#include<stdio.h> 
#include <stdlib.h> 
#include<conio.h> 

struct node 
{ 
    int data; 
    struct node * link; 
}; 

typedef struct node NODE; 
void display(NODE *); 
void add(NODE *,int); 

int main() 
{ 
    NODE *head=NULL; 
    add(head,1); 
    display(head); 
    printf("\n"); 
    getch(); 
    return 0; 
} 

void display(NODE *pt) 
{ 
    while(pt!=NULL) 
    { 
    printf("element is"); 
    printf("%d",pt->data); 
    pt=pt->link; 
    } 
} 

void add(NODE *q,int num) 
{ 
    NODE *temp; 
    temp = q; 
    if(q==NULL) 
    { 
    q=(NODE *)malloc(sizeof(struct node)); 
    temp = q; 
    } 
    else 
    { 
    while((temp=temp->link)!=NULL); 
    temp->link = (NODE *)malloc(sizeof(struct node)); 
    temp=temp->link; 
    } 

    temp->data = num; 
    temp->link = NULL; 
} 
+0

哪个是输出? – Marco 2011-04-11 12:45:24

+1

您是否尝试过使用调试器并逐步查看链接列表结构在每个步骤中的内容? – 2011-04-11 12:47:43

回答

1

您的add方法在第一次调用时(当head == NULL)应将第一个节点添加到列表中,从而将head更改为指向新分配的节点。

但是这不会发生,因为add不会将更改后的head传回给调用者。

为了解决这个问题,你可以返回从函数修改head

// call as before but assign the return value to head. 
head = add(head,1); 

..... 

// return type changed from void to NODE * 
NODE* add(NODE *q,int num) 
{ 
    // make the changes as before 

    // return the head pointer. 
    return q; 
} 

,或者您可以通过地址传递指针head的功能add为:

// pass the address of head. 
add(&head,1); 

..... 

// change type of q from NODE * to NODE ** 
void add(NODE **q,int num) 
{ 
    // same as before but change q to *q. 

    // any changes made to the list here via q will be visible in caller. 
} 
2

你的局部变量main()head不是由你add()功能修改。这意味着您使用NULL参数调用display()

您需要将NODE **q传递给add,然后在add()中更新它。

+0

即它通过值传递,而不是引用。或者,您可以返回'head'的新值,并始终使用'head = add(head,1)'。 – Rup 2011-04-11 12:50:25

1

add()函数正在修改q参数,但它是按值传递的。然后在add()调用之后head保持为NULL。

0
int main() 
{ 
    NODE *head=NULL; 
    add(head,1); 
    display(head); 

NODE *头是本地的主。它的值是NULL。你通过 NULL来添加,然后创建一个NODE并将其数据设置为1.然后,您返回到主... ...,其中头是仍然 NULL。您需要传递head的地址,以便它的实际值在add()中更改。您还需要更改add()以使用指针。

主要返回EXIT_SUCCESS或EXIT_FAILURE。不要typedef结构节点;这对可读性是有害的,并且您在使用它时没有抽象。

0

当你调用添加新头指针永远不会返回。所以它仍然指向NULL。

0

啊......你被指针绊倒了...... 实质上,如果你想修改“头”,你需要发送一个引用THAT ......否则你只是修改指针...更改代码这样:

#include<stdio.h> 
#include <stdlib.h> 
#include<conio.h> 

struct node 
{ 
    int data; 
    struct node * link; 
}; 

typedef struct node NODE; 
void display(NODE *); 
void add(NODE **,int); 

int main() 
{ 
    NODE *head=NULL; 
    add(&head,1); 
    display(head); 
    printf("\n"); 
    getch(); 
    return 0; 
} 

void display(NODE *pt) 
{ 
    while(pt!=NULL) 
    { 
     printf("element is "); 
     printf("%d",pt->data); 
     pt=pt->link; 
    } 
} 

void add(NODE **q,int num) 
{ 
    NODE *temp; 
    temp = *q; 
    if(*q==NULL) 
    { 
     *q=(NODE *)malloc(sizeof(struct node)); 
     temp = *q; 
    } 
    else 
    { 
     while((temp=temp->link)!=NULL); 
      temp->link = (NODE *)malloc(sizeof(struct node)); 
      temp=temp->link; 
    } 

    temp->data = num; 
    temp->link = NULL; 
} 
1

的问题是add方法的签名,让你的工作方案,你应该通过指针节点的指针,这样

void add(NODE **,int); 

和工作和他一起。 然后在情况

if(*q==NULL) 

可以分配内存,并通过它

*q=(NODE*)malloc(sizeof(struct node)); 

替换NULL指针,以便新的HEAD 所以它会工作。

问题是当你分配内存时,你只需要将空指针的本地副本替换为NODE,但它不会影响主函数中的头部。