c链表程序



我希望下面的链表程序打印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;
}

main()中的局部变量head不会被add()函数修改。这意味着您调用display()时使用的参数为NULL。

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

第一次调用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.
}
add((函数正在修改q参数,但它是按值传递的。在add((调用之后,head保持为NULL。

问题在于add方法的签名,为了使程序正常运行,你应该将指针传递给NODE的指针,比如这个

void add(NODE **,int );

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

if(*q==NULL)

可以分配内存并将NULL指针替换为新的HEAD通过

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

所以它会起作用的。

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

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

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

Main应返回EXIT_SUCCESS或EXIT_FAILURE。不要对结构节点进行typedef;它对可读性有害,在这里使用它不会得到抽象。

当您调用Add时,新的头指针永远不会返回。所以它仍然指向NULL。

啊。。。你被指针绊倒了。。。本质上,如果你想修改"头",你需要发送一个引用。。。否则,您只是在修改指针。。。将您的代码更改为:

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

相关内容

  • 没有找到相关文章

最新更新