c++在链表末尾添加节点,为什么不能输出???

#include<iostream>
#include<cstring>
using namespace std;
struct phonebook{
    char Name[20];
    char Number[20];
    struct phonebook *next;
};
typedef struct phonebook pbook;
void addmember(pbook *head);
void print_list(pbook *head);
int main()
{
    pbook *head=NULL;
    for(int i=0;i<2;i++)
        addmember(head);
    print_list(head);
    return 0;
}

void addmember(pbook *head)
{
    pbook *curr=NULL,*tmp=NULL;
    char name[20],num[20];
    cout<<"input Name and number:"<<endl;
    cin.getline(name,sizeof(name));
    cin.getline(num,sizeof(num));
    
    curr=(pbook *)new(pbook);
    curr->next=NULL;
    strcpy(curr->Name,name);
    strcpy(curr->Number,num);
    if(head==NULL)
    {
        head=curr;
        cout<<"save succeed in head"<<endl;
    }    
    else
    {
        tmp=head;
        while(tmp!=NULL)
            tmp=tmp->next;
        tmp=curr;
        cout<<"save succeed in tail"<<endl;
    }
}
void print_list(pbook *head)
{
    pbook *curr=head;
    cout<<"输出链表"<<endl;
    while(curr!=NULL)
    {
        cout<<"Name:"<<curr->Name<<"\tNUmber:"<<curr->Number<<endl;
        curr=curr->next;
    }
}
阅读 2.6k
2 个回答

额……不是很明白你为什么传参数的时候要传一个空指针进去,空指针的时候就是说head的地址还没有分配,当你进入addmember的时候,你addmember的局部参数head(为了区分,下面用head1来表示吧)的地址还是不固定,直到你将curr赋值给head1,但是由于没有固定的地址链接,此时的head1已经与全局的head断开了关联,而head1的作用范围只有在addmember生效,所以当addmember执行完成之后head1就被销毁了,而全局的head依然为NULL,所以下一次执行addmember传进去的依然是空指针。

要解决其实也很简单,只需要一开始就把head赋值了就可以,或者修改成下面这样也能实现相同的效果:

#include<iostream>
#include<cstring>

using namespace std;

struct phonebook {
    char Name[20];
    char Number[20];
    struct phonebook *next;
};
typedef struct phonebook pbook;
pbook* addmember();
void print_list(pbook *head);
int main()
{
    pbook *head = addmember();
    pbook *temp = head;
    for (int i = 0; i < 2; i++)
    {
        temp->next = addmember();
        temp = temp->next;
    }
        
    print_list(head);
    return 0;
}

pbook* addmember()
{
    pbook *curr = NULL, *tmp = NULL;
    char name[20], num[20];
    cout << "input Name and number:" << endl;
    cin.getline(name, sizeof(name));
    cin.getline(num, sizeof(num));

    curr = (pbook *)new(pbook);
    curr->next = NULL;
    strcpy(curr->Name, name);
    strcpy(curr->Number, num);

    return curr;
}
void print_list(pbook *head)
{
    pbook *curr = head;
    cout << "输出链表" << endl;
    while (curr != NULL)
    {
        cout << "Name:" << curr->Name << "\tNUmber:" << curr->Number << endl;
        curr = curr->next;
    }
}

链表不是指针吗 输出的时候加指针吧!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题