该程序比较简单,只是假设接收一个以分号分隔的值/字符串/行的文本文件,将值的顺序反转,将它们全部放回一起,然后输出到一个新文件。但是,有规范要求我们必须使用实现简单链表数据结构的堆栈。我是 C 的新手,只是在学习指针的基础知识(我来自 Java 和 .NET,这对我来说是一场噩梦,大声笑)。此外,规范明确指出 push() 函数必须接受“旧栈顶(节点)”和“要推送的值”,并将更新后的指针返回到栈顶。此外,pop() 必须将“指向当前堆栈顶部的指针的指针”作为参数,并返回弹出节点的值。
我们假设用 gcc -o progname progname.c -Wall -m32 -O 编译。源代码编译得很好,但是当尝试使用实际示例文件构建堆栈等时,我收到了段错误。然而,我已经通过 gdb 运行了我的代码,它说在我的“push((values -> head), str1);”处发生了段错误。在 main() 中调用。由于这是对 push() 的调用,我猜我在链表和/或堆栈中忽略了更基本的逻辑错误。
在这一点上,我已经用尽了我的大脑,并且终生无法弄清楚我哪里出了问题。如果有人能为我提供一些帮助,我将永远感激不已。
此外,如果某些代码看起来很丑陋,我深表歉意。我现在只使用 C 语言工作了大约 2 周
示例输入文件为:
23414;-5224;23;569;
预期的输出文件是:
569;23;-5224;23414;
这是我到目前为止开发的内容:
#include <stdio.h>
#include <assert.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdbool.h>
int STACK_ELEMENTS = 0;
typedef struct node {
char *value;
struct node *next;
} Node;
typedef struct my_stack {
Node *head;
} Stack;
Stack *values;
bool stack_isEmpty() {
if (STACK_ELEMENTS < 1)
return true;
else
return false;
}
Node *push(Node *oldHead, char *val) {
Node *newNode;
newNode = malloc(sizeof(Node));
newNode -> value = val;
if (oldHead == NULL) {
values -> head = newNode;
values -> head -> value = val;
}
else {
values -> head -> next = newNode;
values -> head = newNode;
}
free(newNode);
STACK_ELEMENTS++;
return (values -> head);
}
char *pop(Node **pHead) {
char *val;
if ((*pHead) != NULL) {
Node *tempNode;
tempNode = malloc(sizeof(Node));
tempNode = *pHead;
val = tempNode -> value;
*pHead = tempNode -> next;
free(tempNode);
STACK_ELEMENTS--;
}
else
return 0;
return val;
}
int main(int argc, char *argv[]) {
/*verify arguments*/
if (argc != 3) {
fprintf(stderr, "usage: strrev <file> <newfile>\n");
exit(1);
}
char *fileIn = argv[1];
char *fileOut = argv[2];
/*open file streams*/
FILE *in = fopen(fileIn, "r");
FILE *out = fopen(fileOut, "w");
/*scan input file and delimt on semicolon*/
/*input file is a single line of semicolon-delimited values*/
char str1[128];
while(!feof(in))
{
/*scan, delimiting on semicolon*/
/*if the scanned element does not fit format, break*/
if (fscanf(in, "%[^;];", str1) != 1) {
break;
}
push((values -> head), str1);
}
while(!stack_isEmpty()) {
fprintf(out,"%s;", pop(&(values -> head)));
}
fclose(in);
fclose(out);
return 0;
}
最佳答案
Stack *values;
这个“值”似乎没有初始化。
你需要的是:
Stack *values = malloc(sizeof(Stack ));
关于C: Segmentation Fault -- 堆栈实现链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21753669/