Я пытаюсь создать односвязный список, используя структуру с двумя типами данных: 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