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

标签 c string struct linked-list

我正在尝试学习链表,我只是为了练习而制作这个程序。它包含由两个结构体组成的多个链表。 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/

相关文章:

c - 从DLL内部调用EXE函数

java - 如何使用String.hashCode生成主键

c - 如何将一个结构分配给另一个结构中已经存在的指针

c - 将二维数组复制到结构体数组的方法

c - Malloc之前的指针

c - 错误 : invalid operands to binary ^ (have ‘double’ and ‘double’ ) - I'm not trying to use ^ as a power operator

java - 让 Java 在字母之后对符号进行排序(就像 Linux 排序一样)

c - 用指针 C 填充结构

c - 带括号和不带括号的指针

android - 如何在运行时修改 strings.xml 文件