c - 链表有困难
问题描述
我正在尝试学习链表,我只是在制作这个程序来练习。它包含几个由两个结构组成的链表。struct letterLink 中的所有内容都可以正常工作(typedef ss) 该链接列表只需获取用户输入的字符串,将它们向后打印,然后按字母顺序对其进行排序。
这一切都很好。
这是另一个名为 struct wordLink (typedef sw) 的链表给我带来了麻烦。我正在尝试根据字母字符串中的空格解析已经输入到单词链接列表中的字母字符串。
它是通过调用函数 createWordList 和 appendWord 创建的。
然后用 printWord 打印。
现在不用担心在 main 函数中按字母顺序对单词进行排序,因为我还没有使用该函数。
我还知道当用户在单词之间输入多个空格时,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'开头,因为你不会跳过它。” 是我的错误,我删除了它。
推荐阅读
- reactjs - Webpack/Babel/React 项目上的“当前未启用对实验语法 'jsx' 的支持”
- tensorflow - 如何在下面的代码中找到分配给验证集的每个图像的标签?
- android - Android 10 及更高版本的 Scoped Storage 应用程序崩溃,将图像上传到服务器
- javascript - 获取 URL 时如何删除“localhost:3000”
- sql-server - 无法为 .Net Core 3.1 搭建登录页面。错误:运行选择的代码生成器包还原失败时出错
- android - Kotlin:将数据传递给片段
- python - 如何在 python 中创建对象并使用用户输入定义属性?
- c++ - 有没有办法通过 ncurses 库在 C++ 中打印字符串类型的变量?
- css - 创建平移滑块 (React/CSS)
- java - Java - 计算重力加速度