присвоение из несовместимого типа указателя в связанном списке (C) - PullRequest
2 голосов
/ 23 февраля 2012

У меня проблемы с созданием связанного списка, а также с некоторыми вспомогательными функциями, которые я пытаюсь создать. Мой код выглядит следующим образом:

#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 given\n");
        }

    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,"%s\n",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 работает, но если это нужно для чего-то, я тоже могу опубликовать это.

Ответы [ 4 ]

5 голосов
/ 23 февраля 2012

Вы смешиваете два разных "пространства имен", пространство имен "tag" для struct, а также и пространство имен идентификатора для typedef.Проще всего справиться с этим, предварительно объявив типы, которые вы собираетесь использовать:

typedef struct node node;

Затем вы можете использовать node или struct node взаимозаменяемо.Даже внутри

struct node {
  // something
  node * next;
};
0 голосов
/ 23 февраля 2012

Попробуйте это:

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

Возможно, вам придется заменить node на struct node в других местах кода.

0 голосов
/ 23 февраля 2012

несколько проблем:

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;
}

theСтрока, которая входит в «слова», никогда не сохраняется, вам нужно создать копию слов и сохранить ее, например:

node->key = strdup(words);
0 голосов
/ 23 февраля 2012
typedef struct tag_node {
    int counter;
    char* key;
    struct tag_node* next;
} node;

для начинающих.

Как примечание, я не могу представить, как вы free() words в пределах main (осторожно, это может протечь).

редактировать - я случайно некоторые стили

...