我正在尝试学习链表,而我只是将此程序用于练习。它包含由两个结构组成的几个链接列表。 struct letterLink中的所有内容都可以正常工作(typedef ss) 该链表只需要一串用户输入的字符, 向后打印它们,然后按字母顺序对其进行排序。
一切正常。
给我带来麻烦的是另一个名为struct wordLink(typedef sw)的链接列表。我正在尝试根据字母字符串中的空格来分析已经输入到单词链接列表中的字母字符串。
通过调用函数createWordList和appendWord来创建。
然后使用printWord打印。
现在,您不必担心在主要功能中按字母顺序对单词进行排序的说法,因为我尚未使用该功能。
我还意识到当用户在单词之间输入多个空格时,在createWordList函数中可能会发生错误,因为在离开内部while循环后,ptr-> letter将为32(ascii空间),因此不满足条件重新进入那个循环。我待会再处理。
目前,我正在尝试创建单词的链接列表,但这甚至不会打印第一个单词。
任何提示或帮助都将不胜感激,因为我刚刚学习了此内容,却无法弄清为什么它不起作用。
谢谢。 我将全文发布,以供编译之用,但 Im只是在这个程序中freeWord之前的最后三个功能。 (使用由printWord打印的appendWord的createWordList)
谢谢。
#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;
}
}
答案 0 :(得分:1)
在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'开头,因为您不会跳过它。”是我的错误,我将其删除。