gpt4 book ai didi

c - 我在链接列表方面遇到困难

转载 作者:行者123 更新时间:2023-11-30 14:34:38 27 4
gpt4 key购买 nike

我正在尝试学习链表,我只是为了练习而制作这个程序。它包含由两个结构体组成的多个链表。struct letterLink 中的所有内容都工作正常(typedef ss)该链接列表仅采用一串用户输入的字符,向后打印它们,然后按字母顺序对它们进行排序。

一切正常。

另一个名为 struct wordLink (typedef sw) 的链表给我带来了麻烦。我试图根据字母字符串中的空格来解析已经输入到单词链接列表中的字母字符串。

它是通过调用函数createWordList 和appendWord 创建的。

然后用printWord打印。

现在不用担心在主函数中按字母顺序对单词进行排序的说法,因为我还没有使用该函数。
我还知道,当用户在单词之间输入多个空格时,createWordList 函数中可能会出现一个错误,因为在离开内部 while 循环后,ptr->letter 将是 32(ascii 空格),因此不满足条件回到那个循环。我稍后会处理这个问题。

目前,我正在尝试创建单词链接列表,但这甚至不会打印第一个单词。

任何提示或帮助将不胜感激,因为我刚刚学习这个,并且不明白为什么它不起作用。

谢谢。为了编译的目的,我将完整地发布,但是我只处理这个程序中 freeWord 之前的最后三个函数。 (createWordList使用printWord打印的appendWord)

谢谢。

#include <stdio.h>
#include <stdlib.h>
typedef struct linkletter{
char letter;
struct linkletter* next;
} ss;
typedef struct linkword{
char word[20];
struct linkword* next;
} sw;
ss * createLetter(char);
sw * createWordList(ss* strt);
ss * readLetter(void);
ss * append(ss* end, ss * newLetter);
sw* appendWord(sw* endWord, sw* newWord);
void printLetter(ss*);
void printWord(sw*);
void freeLetter(ss*);
void freeWord(sw *wordStart);
ss * searchLetter(ss* start, char letter);
ss * insertAtFront(ss* start, ss* newptr);
ss * reverseLetter(ss* start);
ss * sortedCopy(ss* start);
ss * insertIntoSorted(ss* start, ss* newLet);
int main (void){
ss *start, *backwards, *sorted;
sw *wordStart;
printf("enter as many words as you wish separated by spaces:\n (Max 20 letters per word)\n");
start=readLetter();
printf("\nyou typed:");
printLetter(start);
printf("\nBackwards: ");
backwards= reverseLetter(start);
printLetter(backwards);
printf("\nSorted by Letter: ");
sorted=sortedCopy(start);
printLetter(sorted);
printf("\nYour words in alphetical order:\n");
wordStart=createWordList(start);
printWord(wordStart);
freeLetter(start);
freeLetter(backwards);
freeLetter(sorted);
freeWord(wordStart);







return 0;
}

ss *createLetter(char let){
ss *ptr;
ptr=(ss*)malloc(sizeof(ss));
ptr->letter=let;
ptr->next=NULL;
return ptr;
}
ss * readLetter(void){
char c;
ss *end, *start, *newLetter;
start=NULL;
scanf("%c",&c);
while(c!='\n'){

newLetter=createLetter(c);
if (start==NULL){
start = newLetter;
end=start;
} else {
end=append(end,newLetter);
}
scanf("%c",&c);
}
return start;
}
ss *append (ss *end, ss *newLetter){
end->next=newLetter;
return end->next;
}



void printLetter(ss *start){
ss* ptr =start;
while(ptr!=NULL){
printf("%c",ptr->letter);
ptr=ptr->next;
}
}

void freeLetter(ss *start){
ss* ptr=start;
ss *tmp;
while(ptr!=NULL){
tmp=ptr->next;
free(ptr);
ptr=tmp;
}

}
ss * searchLetter(ss* start, int number){
ss* ptr = start;
while((ptr!=NULL) && (ptr->letter!=number)){
ptr=ptr->next;
}
return(ptr);
}

ss* insertAtFront(ss* start, ss* newptr){
newptr->next=start;
return(newptr);
}

ss * reverseLetter(ss* start){
ss *ptr= start;
ss *bstart = start;
ss* newLetter;

if (start!=NULL){
bstart=createLetter(start->letter);
ptr=ptr->next;
}
while(ptr != NULL) {
newLetter=createLetter(ptr->letter);
bstart=insertAtFront(bstart, newLetter);
ptr=ptr->next;
}
return(bstart);
}

ss* insertIntoSorted(ss* start, ss* newLet){
ss* ptr = start;
ss* prev = NULL;
while((ptr!=NULL) && (ptr->letter<newLet->letter)){
prev=ptr;
ptr=ptr->next;
}
if(prev == NULL) {
start = insertAtFront(start,newLet);
} else {
prev->next = newLet;
newLet->next = ptr;
}
return(start);
}

ss* sortedCopy (ss* start){
ss* ptr = start;
ss * sortedStart= NULL;
ss* newLetter;

if(start!=NULL) {
sortedStart = createLetter(start->letter);
ptr=ptr->next;
}
while(ptr!=NULL){
newLetter = createLetter(ptr->letter);
sortedStart = insertIntoSorted(sortedStart, newLetter);
ptr = ptr->next;
}
return(sortedStart);

}

sw* createWordList(ss* start){
ss *ptr=start;
sw *ptrWord=NULL;
sw *endWord;
sw *wordStart=ptrWord;
int i=0;

while(ptr->letter!='\n'){
ptrWord=(sw*)malloc(sizeof(sw));
while(ptr->letter!=32) {
ptrWord->word[i]=ptr->letter;
ptr=ptr->next;
i++;
}

ptrWord->next=NULL;
if(wordStart==NULL){
wordStart=ptrWord;
endWord=wordStart;
} else {
appendWord(endWord,wordStart);
}
}
return wordStart;
}
sw* appendWord(sw* endWord, sw* newWord){
endWord->next=newWord;
return endWord->next;
}


void printWord(sw *wordStart){
sw* ptrWord =wordStart;
while(ptrWord!=NULL){
printf("%s",ptrWord->word);
ptrWord=ptrWord->next;
}
}


void freeWord(sw *wordStart){
ss* ptr=wordStart;
ss *tmp;
while(ptr!=NULL){
tmp=ptr->next;
free(ptr);
ptr=tmp;
}

}

最佳答案

createWordList 中,您有

    while(ptr->letter!='\n'){
ptrWord=(sw*)malloc(sizeof(sw));
while(ptr->letter!=32) {
ptrWord->word[i]=ptr->letter;
ptr=ptr->next;
i++;
}

然后

        ptrWord->next=NULL;
if(wordStart==NULL){
wordStart=ptrWord;
endWord=wordStart;
} else {
appendWord(endWord,wordStart);
}

您没有使用 appendWord 的返回值,并且附加了 wordStart 而不是 ptrWord - 也许您的意思是

            endWord = appendWord(endWord, ptrWord);

一旦您点击空格字符,您就会停止更新ptr,因为该更新位于内部

while (ptr->letter!=32) {

已编辑

添加了在空格字符后不更新 ptr 的问题。

“每个单词都以 '\n' 开头,因为您不会跳过它。”这是我的一个错误,我将其删除。

关于c - 我在链接列表方面遇到困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58897378/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com