很抱歉我的代码很糟糕,但是当我在mac终端上运行此代码时,我无法理解为什么此代码会导致declare const AngularUWP:any;
。我想让程序使用链表逐个完整地阅读完整的句子,但它不起作用。
我想segmentation fault 11
中的句子不会插入some.txt
。我该如何解决?
linkNode
答案 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->link
和top
都应指向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
。此外,您没有正确递减element
。 element_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;
}