C中字符串的链表



我试图在C中创建一个字符串链接列表,但在将第一个Node添加到列表中时遇到了问题。无论出于何种原因,即使我将头变量引用到newNode,程序也会打印NULL,但它不会将字符串从结构指针复制到结构指针。感谢您的帮助。谢谢

#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
typedef struct stringData {
    char *s;
    struct stringData *next;
} Node;
Node *createNode(char *s) {
    Node *newNode = (Node *)malloc(sizeof(Node));
    newNode->s = s;
    newNode->next = NULL;
    return newNode;
}

void insert(Node *head, Node *newNode) {
    if (head == NULL) {
        head->s = newNode->s;
        head = newNode;
    }
}
void printList(Node *head) {
    while (head != NULL) {
        printf("%sn", head->s);
        head = head->next;
    }
}

int main()
{
    Node *head = createNode(NULL);
    Node *a = createNode("A");
    insert(head, a);
    printList(head);
    return 0;
}

以下代码片段错误:

void insert(Node *head, Node *newNode) {...}
...
insert(head, a);

您需要通过引用传递指针。当前您正在更改本地副本(参数)。

修复
将您的insert更改为:

void insert(Node **head, Node *newNode) {...}

并调用为:

insert(&head, a);

还有什么
至少insert(可能还有)更多的函数不是傻瓜式的(保证空指针取消引用、else情况未处理等)。您需要调试和修复许多这样的情况。在编码之前,在纸上正确地处理你的方法可能会有所帮助。

这里是代码的修改版本,给出了在列表开头和末尾插入新节点的示例。事实上,insert函数可以用于在列表中的任何位置插入新节点,因为它只需要一个指向链接的指针和一个指向要插入的节点的指针。

#include <stdlib.h>
#include <stdio.h>
typedef struct stringData {
    char *s;
    struct stringData *next;
} Node;
Node *createNode(char *s) {
    Node *newNode = (Node *)malloc(sizeof(Node));
    newNode->s = s;
    newNode->next = NULL;
    return newNode;
}

void insert(Node **link, Node *newNode) {
    newNode->next = *link;
    *link = newNode;
}
void printList(Node *head) {
    while (head != NULL) {
        printf("%sn", head->s);
        head = head->next;
    }
}

int main(void)
{
    Node *head = NULL;
    Node *tail = NULL;
    Node *n;
    n = createNode("B");
    // First node at start of list - head is updated.
    insert(&head, n);
    // First node is also the tail.
    tail = n;
    n = createNode("A");
    // Insert node at start of list - head is updated.
    insert(&head, n);
    n = createNode("C");
    // Insert node at end of list.
    insert(&tail->next, n);
    // Update tail.
    tail = n;
    printList(head);
    return 0;
}

相关内容

  • 没有找到相关文章

最新更新