嘿伙计们,我需要你的帮助。我正在学习两天后的 C 考试。为此,我为一个简单的列表编写了一些代码。 我的问题是我每次都会遇到同样的错误:“函数‘copyString’的隐式声明”。你能告诉我我犯了什么错误吗?
在德国我们说:“Liebe Grüße”
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct listen{
int id;
int wert;
char *namen;
char *strasse;
int plz;
struct listen *next;
};
typedef struct listen elem;
elem *createElem(int id, int wert){
elem* newElem = (elem*)malloc(sizeof(elem));
if(newElem == NULL) printf("War nischt!");
newElem->id = id;
newElem->wert = wert;
newElem->namen = NULL;
newElem->strasse = NULL;
newElem->plz = 0;
return newElem;
}
int stringLen(char* len){
int d=0;
while(*len++) d++;
return d;
}
char *createStr(char* st)
{
char* newSt;
newSt = (char*)malloc(stringLen(st)+1);
if(newSt == NULL) {printf("Fehler");};
copyString(st, newSt);
return newSt;
}
void copyString(char *von, char *nach)
{
while(*von!='\0')
{
*nach=*von;
*von++;
*nach++;
}
*nach = '\0';
}
elem* addToList(elem *list, int wert, char* namen, char* strasse, int plz)
{
elem* p = createElem(list->id, wert);
p->namen = createStr(namen);
p->strasse = createStr(strasse);
p->plz = plz;
list->id++;
p->next = list->next;
list->next = p;
return list;
}
elem* createList(){
elem* liste = createElem(0, 0);
return liste;
}
void PrintElem(Elem *E)
{
printf("ID: %d | Wert: %d | Name : %s | Strasse: %s | PLZ: %d", E->id, E->wert, E->namen, E->strasse, E->plz);
}
void printList(elem* list){
printf("Liste:");
while(list->next != NULL)
{
printElem(list->next);
list = list->next;
}
}
int main(){
elem* Liste01 = createList();
Liste01 = addToList(Liste01, 4, "Peter", "Lustigweg", 15834);
printList(Liste01);
return 0;
}
我尝试重新排列声明的函数。
我试过你的代码,正如上面好的评论中所指出的,“copyString”函数需要在“createStr”函数中使用之前移动。一旦我执行了那一点重构,我就能够编译程序并执行程序。但是,查看代码时,我对它遍历列表结构有一些疑问。很明显,这个链表中有两个元素;但是,只打印了第二个列表元素。而且,元素 ID 似乎没有转到其预期的列表元素。然后我在链表打印函数中添加了一些额外的代码,以便可以查看初始链表元素。以下是您的代码的重构版本。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct listen
{
int id;
int wert;
char *namen;
char *strasse;
int plz;
struct listen *next;
};
typedef struct listen elem;
void copyString(char *von, char *nach)
{
while(*von!='\0')
{
*nach=*von;
*von++;
*nach++;
}
*nach = '\0';
}
elem *createElem(int id, int wert)
{
elem* newElem = (elem*)malloc(sizeof(elem));
if(newElem == NULL) printf("War nischt!\n");
newElem->id = id;
newElem->wert = wert;
newElem->namen = NULL;
newElem->strasse = NULL;
newElem->plz = 0;
return newElem;
}
int stringLen(char* len)
{
int d=0;
while(*len++) d++;
return d;
}
char *createStr(char* st)
{
char* newSt;
newSt = (char*)malloc(stringLen(st)+1);
if(newSt == NULL)
{
printf("Fehler\n");
}
copyString(st, newSt);
return newSt;
}
void addToList(elem *list, int wert, char* namen, char* strasse, int plz) /* FYI - made this a void function as the linked list pointer is already known and doesn't change */
{
elem* p = createElem(list->id, wert);
p->namen = createStr(namen);
p->strasse = createStr(strasse);
p->plz = plz;
list->id++;
p->next = list->next;
list->next = p;
return;
}
elem* createList()
{
elem* liste = createElem(0, 0);
return liste;
}
void printElem(elem *E)
{
printf("ID: %d | Wert: %d | Name : %s | Strasse: %s | PLZ: %d\n", E->id, E->wert, E->namen, E->strasse, E->plz);
}
void printList(elem* list)
{
printf("Liste:");
printf("Data within initial list element\n"); /* Just to illustrate that the initial list element is not used */
printElem(list);
while(list->next != NULL)
{
printElem(list->next);
list = list->next;
}
}
int main()
{
elem* Liste01 = createList();
addToList(Liste01, 4, "Peter", "Lustigweg", 15834);
printList(Liste01);
return 0;
}
有了额外的打印信息,以下是终端的输出。
@Vera:~/C_Programs/Console/DeutschList/bin/Release$ ./DeutschList
Liste:Data within initial list element
ID: 1 | Wert: 0 | Name : (null) | Strasse: (null) | PLZ: 0
ID: 0 | Wert: 4 | Name : Peter | Strasse: Lustigweg | PLZ: 15834
可以看出,添加第二个链表元素时,ID值存储在初始链表元素内;然而,其他数据元素进入下一个链表元素。
我将留给您改进代码,以便初始链表元素包含初始数据,但看看这是否会推动您本着项目的精神前进。