来自链表(C)中不兼容的指针类型的赋值



我在创建链表以及尝试创建的一些辅助函数时遇到了一些问题。我的代码如下:

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "getNextWord.h"
#define MAX_WORD_SIZE 256
typedef struct{
int counter;
char* key;
struct node* next;
} node;
node* createNode(char* words){
    node* head;
    if(!(head=malloc(sizeof(node)))) return NULL;
    head->key=words;
    head->next=NULL;
    return head;
}
node* addToList(node* head, char* words){
    node* newNode;
    newNode=createNode(words);
    newNode->next = head;
    return newNode;
}
int find(node* head){
    if (head->next != NULL){
        node* next = head->next;
        while(head != NULL){
            if (strcmp(head->key,next->key)==0){
                head->counter++;
                head=head->next;
                return 1;
                }
            else{
                head=head->next;
                }
            }
    }
return 0;
}
void printList(node* head){
    node* pointer = head;
    while (pointer != NULL){
        printf("%s",pointer->key);
        pointer=pointer->next;
        }
    printf("n");
}
int main(int argc, char* argv[]){
    if(argc<2){
        fprintf(stderr, "Not enough arguments givenn");
        }
    for(int i=1; i< argc; i++){
        FILE* fd=fopen(argv[i], "r");
        if(fd != NULL){
            char* words;
            node* head = NULL;
            while((words=getNextWord(fd)) != NULL){
                find(head);
                if (find(head) == 0){
                    createNode(words);
                    }
                printList(head);

                fprintf(stdout,"%sn",words);
                }
            }
        else(printf("No such file exists"));
        fclose(fd);
        }
return 0;
}

我在网上看了看,似乎我在关注大多数人对链接列表的看法。我以前没有收到任何错误,只是在以下函数中出现了一堆"警告:来自不兼容指针类型的赋值":

addtolist (the line before the return)
find (before return one and the else line)
printlist (the last line in the while loop)

我知道这不是一个伟大的代码,我不是最好的程序员,但我只是在努力学习。此外,我的getnextword确实有效,但如果需要的话,我也可以发布。

您混淆了两个不同的"名称空间"struct的"标记"名称空间和typedef的标识符名称空间。最简单的方法是转发声明要使用的类型:

typedef struct node node;

然后,您可以交替使用nodestruct node。即使在内部

struct node {
  // something
  node * next;
};
typedef struct tag_node {
    int counter;
    char* key;
    struct tag_node* next;
} node;

对于初学者来说。

顺便说一句,我无法想象你是如何在mainfree() words的(小心,它可能会泄漏)。

edit-我不小心发现了一些样式

试试这个:

struct node {
  int counter;
  char* key;
  struct node* next;
};

您可能需要将代码中其他位置的node替换为struct node

多个问题:

int find(node* node){
    node* next = node->next;  // what if next is NULL ?
    while(node != NULL){
        if (strcmp(node->key,next->key)==0){ // if next is NULL this will crash
            node->counter++;
            return 1;
            node=node->next;   // never reached since return 1 above.
            }
        else{
            node=node->next;
            }
    }
return 0;
}

将createlist重命名为createnode可能很好,因为这似乎就是函数。

node* createList(char* words){
    node* node;
    if(!(node=malloc(sizeof(node)))) return NULL;
    node->key=words;
    node->next=NULL;
    return node;
}

单词中的字符串从未存储,您需要创建单词的副本并存储它,例如:

node->key = strdup(words);

相关内容

  • 没有找到相关文章

最新更新