我正在努力学习链表,我只是为了练习而制作这个程序。它包含几个由两个结构组成的链表。结构letterLink中的所有内容都运行良好(typedef ss(该链接列表仅采用用户输入的字符串,向后打印,然后按字母顺序排序。
这一切都很好。
另一个名为struct-wordLink(typedef-sw(的链表给我带来了麻烦。我试图根据字母串中的空格来解析已经输入到单词链表中的字母串。
它是通过调用函数createWordList和appendWord创建的。
然后用printWord打印。
现在,不要担心在主函数中按字母顺序对单词进行排序的说法,因为我还没有了解该函数
我还意识到,当用户在单词之间输入多个空格时,createWordList函数可能会出现一个错误,因为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'开头,因为你不会跳过它。"这是我的一个错误,我删除了它。