一个关于C语言结构体链表的问题。

struct node {
char * name;
struct node * next;
};

struct node *head = NULL, *tail = NULL;

void push(const char *a) {
struct node* newgirl;
newgirl = (struct node*)malloc(sizeof(struct node));
if (newgirl != NULL) {
if (head == NULL) head = newgirl;
if (tail == NULL) tail = newgirl;
else tail->next = newgirl;
newgirl->next = NULL;
newgirl->name = (char*)a;
tail = newgirl;
}
}

代码如上 为什么每次执行push函数是都会把head更新一次。。。。 如图:

链表创建的没问题,问题出在了给

结点name 赋值上。name是个指针,指向你传入的一个地址。

而这个地址可以肯定,每次传入值是一样的,那么每个结点的name都指向了同一地址。换句话说,只要你改变以 传入地址处的 字符串的 内容,所有结点的 指针指向的内容都同时变了。


处理:

    修改node 定义

struct node {

    char  name[20];          //<<<<<<<<<<<<<<<<<<<

    struct node * next;  

};


 2. 改变赋值方法

void push(const char *a) {

    struct node* newgirl;

    newgirl = (struct node*)malloc(sizeof(struct node));

    if (newgirl != NULL) {

        if (head == NULL) head = newgirl;

        if (tail == NULL) tail = newgirl;

        else tail->next = newgirl;

        newgirl->next = NULL;

        strcpy( newgirl->name ,a ) ; //<<<<<<<<<<<<<<<<<<<

        tail = newgirl;

    }

}

温馨提示:答案为网友推荐,仅供参考
相似回答