Печать данных структуры из односвязного списка - PullRequest
1 голос
/ 07 октября 2019

Я пытаюсь создать односвязный список, используя структуру с двумя типами данных: char* и int, а также next для указания на другие узлы, конечно.

У меня есть две функции: addToList и printList, а также метод main для запуска всего.

Что мой код должен сделать, это добавить узел после head и проверить, чтобы увидетьесли другой узел с такими же данными уже был добавлен. Если это так, он не добавляет новый узел, увеличивая при этом данные count уже связанного узла.

Затем printList() печатает данные count и данные char* каждогоузел.

Первая проблема заключается в том, что мое сравнение символов не работает, поскольку дублирующие узлы все еще добавляются. Тогда моя функция printList не распечатывает данные char * правильно. Вот мой код (я обязательно прокомментировал его, чтобы было легко следовать):

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

// Struct for node. Has an extra data variable to keep track of which node is next
// in a singly-linked list.
typedef struct node {
    char *str;
    unsigned int count;
    struct node *next;
} node;

// Creates a HEAD node with NULL data.
node *head = NULL;

// Adds a new node and populates the data.
struct node* addToList(struct node* Listptr, char* word){
    struct node* new = malloc(sizeof(struct node));
    new->str = malloc(sizeof(char) * 34);

    strcpy(new->str, word);

    new->count = 1;
    new->next = Listptr;

    // If the head is NULL, sets the new node as the head.
    if(head == NULL){
        head = new;
        return new;
    }

    // Sets a node iterator "cur" to the first position.
    node *cur = head;

    // Sets a node iterator to be one place behind cur.
    node *prev;

    // Loops through the linked list, in order to count the previous words and determine
    // if it is necessary to add another node.
    // Otherwise, it sets cur to the next node, and prev to the node cur was just at.
    while(cur != NULL){
        if(cur->str == new->str){
            cur->count++;
            new = NULL;
            return new;
        } else{
            prev = cur;
            cur = cur->next;
        }
    }

    // Checks to see if cur is NULL, if so, sets the previous node.next to the one we're adding.
    if(cur == NULL){
        prev->next = new;
        return new;
    }
}

// Prints out the count and word values of each node.
void printList(){
    node* cur = head;
    while(cur != NULL){
        printf("%d %c\n", cur->count, cur->str);
        cur = cur->next;
    }
}

int main() {

    node* Z = NULL;

    char *a = "hello";
    char *b = "world.";
    char *c = "hello";

    addToList(Z, a);
    addToList(Z, b);
    addToList(Z, c);

    printList(Z);

    return 0;
}

Я ожидаю получить:

2 hello
1 world

Но в консоли я получаю:

1 l
1 (weird symbol)
1 

1 Ответ

2 голосов
/ 07 октября 2019

Не используйте == для сравнения строк, используйте strcmp().

Измените if (cur->str == new->str) на это:

if (strcmp(cur->str, new->str) == 0)

Прочитайте это дляузнать больше о сравнении строк: Как правильно сравнить строки?

...