数据结构中的链表

时间:2017-04-06 05:44:37

标签: linked-list

我真的在努力解决这个问题。 它是关于数据结构中的链表。

有一个名为example.txt的文件。

USA
Japan
China
Korea
Canada

我想使用链接列表

编写如下所示的新文件
Canada
Korea
China
Japan
USA

这是我的代码:

#include <stdafx.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#define MAX_LEN 1024

typedef struct _node Node;

struct _node {
    char* data;
    Node *next;
};

typedef struct _list {
    Node *cur;
    Node *head;
    Node *tail;
}List;


int createNode(List *lp, char* data);

int createNode(List *L, char* data)
{
    Node *newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;
    if (L->head == NULL && L->tail == NULL)
        L->head = L->tail = newNode;
    else {
        L->tail->next = newNode;
        L->tail = newNode;
    }

    L->cur = newNode;
}

void printNodes(List *L)
{
    Node *p = L->head;

    while (p != NULL) {
         printf("%s\n", p->data);
         p = p->next;
    }

}

int main()
{
    FILE *fp1, *fp2;
    char file_name1[128], file_name2[128];
    char line[MAX_LEN];
    //create list
    List* input_list = (List*)malloc(sizeof(List));
    input_list->cur = NULL;
    input_list->head = NULL;
    input_list->tail = NULL;

    fopen_s(&fp1,"Example.txt", "r"); //open the input file

    if (fp1 == NULL) {
        printf("file open is not successful\n");
        return -1;
    }

    fopen_s(&fp2, "Example2.txt", "w");
    int cw = 0;

    while (cw !=5) {
        fscanf_s(fp1, "%s", line,sizeof(line));
        createNode(input_list, line);
        cw++;
    }
    printf("\n\n");
    printNodes(input_list);


    fclose(fp1);
    fclose(fp2);

    system("pause");

    return 0;

}

但我不知道这段代码有什么问题。 它打印就像这样。

Canada
Canada
Canada
Canada
Canada

你能帮帮我吗?

1 个答案:

答案 0 :(得分:0)

您正在将数组(行)的相同地址分配给链表的所有节点。 这就是为什么链接列表的所有节点都指向具有从文件中读取的最后一个字的值的相同地址的原因。 为了解决这个问题,首先使用malloc分配指针(* data),然后复制数据

int createNode(List *L, char* data)
{
    Node *newNode = (Node*)malloc(sizeof(Node));
    int len = 0;
    while (*(data + len) != '\0')len++;
    newNode->data = (char*)malloc(len * sizeof(char));
    strcpy(newNode->data, data);
    newNode->next = NULL;
    if (L->head == NULL && L->tail == NULL)
        L->head = L->tail = newNode;
    else {
        L->tail->next = newNode;
        L->tail = newNode;
    }

    L->cur = newNode;
}