使用链表存储txt的句子

时间:2018-03-26 13:39:16

标签: c data-structures linked-list

很抱歉我的代码很糟糕,但是当我在mac终端上运行此代码时,我无法理解为什么此代码会导致declare const AngularUWP:any; 。我想让程序使用链表逐个完整地阅读完整的句子,但它不起作用。 我想segmentation fault 11中的句子不会插入some.txt。我该如何解决?

linkNode

3 个答案:

答案 0 :(得分:1)

您的代码存在很多不同的问题。让我们逐一介绍它们:

  • 如果跟踪列表的最后一个节点,将更容易将新元素添加到链接列表中。因此,您应该向linkNode结构添加另一个名为bottom的{​​{1}}指针,如下所示:

    linkType

    并在typedef struct { linkNode *top; linkNode *bottom; int element_number; } linkType; 函数中初始化bottom

    init

  • void init(linkType *L) { L->top = NULL; L->bottom = NULL; L->element_number = 0; } 函数中,insert是您想要附加到列表末尾的新节点(如果我正确理解您的问题) ),因此您需要将其temp指向link而不是NULL。另外,您不应将top指向top。如果这是您要插入的第一个节点,temp->linktop都应指向bottom,否则temp将指向第一个节点并top将需要更新,以便它指向bottom

    temp

  • void insert(linkType *L, char *new_data) { linkNode *temp = createStack(); strcpy(temp->element, new_data); temp->link = NULL; L->element_number++; if (L->top == NULL) { L->top = temp; L->bottom = temp; } else { L->bottom->link = temp; L->bottom = temp; } } 函数中,您无需将整个字符串从delete复制到element;您可以将temp_element指向temp_element。此外,您没有正确递减elementelement_number函数应如下所示:

    delete

  • char *delete(linkType *L) { if (L->element_number == 0) { error("list empty\n"); } linkNode *temp = L->top; char *temp_element; temp->element = L->top->element; L->top = L->top->link; (L->element_number)--; free(temp); return temp_element; } 函数中,您没有正确读取输入文件。 main会扫描单词,但由于您要提取句子而不是单词,fscanf将是更好的方法。用于阅读的fgetc循环应如下所示:

    while

    这不是实现阅读句子的最佳方式,但它有效。此外,此代码假定句子以int isEof = 0; int isEndOfSentence = 0; int index = 0; while (!isEof) { char *buffer1 = buffer_making(); isEndOfSentence = 0; index = 0; while (!isEndOfSentence) { char c = fgetc(file_pointer); if (c == EOF) { isEndOfSentence = 1; isEof = 1; } else if (c == '.') { isEndOfSentence = 1; } // Skip leading whitespace if ((isEof || c == ' ' || c == '\n') && index == 0) { continue; } buffer1[index++] = c; } // Skip empty sentence if (index == 0) { continue; } buffer1[index] = '\0'; printf("%s\n", buffer1); insert(q, buffer1); buffer_erase(buffer1); } 结尾。您可以更新此代码,使其适用于以.?等结尾的句子。

  • 最后,您删除的!循环以及打印每个节点的while似乎都存在一些问题。您可以改为使用以下element循环:

    while

    希望这会有所帮助。我已经测试了这些变化,它们对我有用。

  • 答案 1 :(得分:0)

    来自valgrind

    ==18918== Conditional jump or move depends on uninitialised value(s)
    ==18918==    at 0x4C2E119: strlen (vg_replace_strmem.c:458)
    ==18918==    by 0x4EA4E81: puts (in /lib64/libc-2.25.so)
    ==18918==    by 0x108BE8: main (ll.c:74)
    ==18918== 
    
    ==18918== Conditional jump or move depends on uninitialised value(s)
    ==18918==    at 0x4C2E1FB: strcpy (vg_replace_strmem.c:510)
    ==18918==    by 0x108A49: insert (ll.c:31)
    ==18918==    by 0x108BFB: main (ll.c:75)
    ==18918== 
    
    ==18918== Invalid read of size 8
    ==18918==    at 0x108AB1: delete (ll.c:44)
    ==18918==    by 0x108C31: main (ll.c:82)
    ==18918==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
    

    gcc还报告了-Wall的问题:

    ll.c: In function ‘delete’:
    ll.c:44:5: warning: ‘temp_element’ is used uninitialized in this function [-Wuninitialized]
         strcpy(temp_element,L->top->element);
    

    一个问题是你在没有为目的地分配内存的情况下调用strcpy。另一个问题是,您在取消引用L->top而未验证其为非NULL时才会取消引用。

    答案 2 :(得分:0)

    与我的朋友'帮助,我可以让它在我的终端打印正确的结果!特别感谢那些回答我问题的人!谢谢!

    其实我真正想要的只是链接列表,仅由linkNode * top表示,我编辑了我的意图。 :)

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define MAX_NUMBER 1024 
    typedef struct linkNode{
        char * element;
        struct linkNode * link;
    }linkNode;
    typedef struct{
        linkNode *top;
        int element_number;
    }linkType;
    
    void error(char* message){
        fprintf(stderr,"%s", message);
    }
    void init(linkType *L){
    
        L->top=NULL;
        L->element_number = 0;
    }
    linkNode * createStack(){
        linkNode * temp = (linkNode *)malloc(sizeof(linkNode));
        temp->element = (char *)malloc(sizeof(char)*MAX_NUMBER+1);
        return temp;
    }
    
    void insert(linkType *L,char* new_data){
        linkNode *temp = createStack();
        //temp->element = new_data;
        strcpy(temp->element,new_data);
        temp -> link = NULL;
        L->element_number++;
        if(L->top ==NULL){
            L->top =temp;
        }
        else{
        temp->link = L->top;
        L->top = temp;  
        }
    }
    char * delete(linkType *L){
        if(L->element_number ==0)
        {
            error("list empty\n");
        }
        linkNode *temp = NULL;
        temp = L->top;
        char * temp_element;
        temp->element = L->top->element;
        L->top = L->top->link;
        (L->element_number)--;
        free(temp);
        return temp_element;
    }
    char * buffer_making(){
        char* buffer = (char *)malloc(sizeof(char)*MAX_NUMBER+1);
        return buffer;
    }
    char * buffer_erase(char * buffer){
        free(buffer);
        return NULL;
    }
    int main(){
        linkType q ;
        init(&q);
        FILE *file_pointer; 
        char * file1;
        file1 = (char*)malloc(sizeof(file1)+1); 
        char * file2;
        file2 = (char*)malloc(sizeof(file2)+1);
        printf("input file names:\n");
        scanf("%s",file1);
        getchar();
        file_pointer=fopen(file1,"r");
    
        while(1){
        char * buffer1 = buffer_making();
        if(fscanf(file_pointer,"%s",buffer1)==EOF) break;
        ///////////
        printf("%s\n",buffer1);
        insert(&q,buffer1);
        buffer_erase(buffer1);
        }
    
        printf("point3\n");
        while(!(q.element_number==0))
        {
            printf("%s\n", q.top->element);
            delete(&q);
        }
        free(file1);
        free(file2);
        return 0;
    }