我在创建链接列表时遇到了一些问题,还有一些帮助函数正在尝试制作。我的代码如下:
#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确实有效,但如果需要的话我也可以发布。
答案 0 :(得分:5)
你正在混合两个不同的“名称空间”,struct
的“tag”名称空间和typedef
的标识符名称空间。最容易相处的是转发声明您将要使用的类型:
typedef struct node node;
然后您可以互换使用node
或struct node
。甚至在里面
struct node {
// something
node * next;
};
答案 1 :(得分:0)
typedef struct tag_node {
int counter;
char* key;
struct tag_node* next;
} node;
首发。
作为旁注,我无法想象你free()
中的words
main
如何(小心,可能会泄漏)。
编辑 - 我偶然发现了一些风格
答案 2 :(得分:0)
试试这个:
struct node {
int counter;
char* key;
struct node* next;
};
您可能需要在代码中的其他位置将node
替换为struct node
。
答案 3 :(得分:0)
多个问题:
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;
}
从不存储'words'中的字符串,您需要创建单词的副本并存储它,例如:
node->key = strdup(words);