gpt4 book ai didi

c - 堆栈的链表,head->next 不断变为 null

转载 作者:太空宇宙 更新时间:2023-11-04 02:00:02 24 4
gpt4 key购买 nike

//Colin James P. Naranjo
//CMSC123 CD-1L
//This program demonstrates postfix evaluation through pop and push functions

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct node{ //Uses a combination of typedef and tagged structure for the singly linked list
char value;
struct node *next;
}stack;


char evaluate(char a, char b, char c){
int ans;
if(c == '*'){
ans = (int)a * (int)b;
}
if(c == '+'){
ans = (int)a + (int)b;
}
if(c == '-'){
ans = (int)a - (int)b;
}
if(c == '/'){
ans = (int)a / (int)b;
}
if(c == '%'){
ans = (int)a % (int)b;
}
return (char)ans;
}

char pop(stack *head){ //For popping a value in the stack, create a temporary variable to take over the head
stack *temp;
char x;
printf("Your sequence is mostly likely not in order.\n");
temp = head; //Then the new head will be the value next to it. Save its value in x then free the temporary variable and return x
printf("Your sequence is mostly likely not in order.\n");
head = head->next;

x = temp->value;
free(temp);
return x;
}

void push(stack *head, char op){ //For pushing a value to the stack, create a temporary variable to store the new value
stack *temp, *h;
temp=(stack*)malloc(sizeof(stack));
temp->value = op; //Tthe temporary value will be the new head, and the previous head will be placed next to it
if (head == NULL){
head=temp;
head->next=NULL;
}else{
temp->next=head;
head=temp;
}
h = head;
while(h!=NULL){
printf("%c-->",h->value);
h = h->next;
}
printf("\n");
}

main(){
int i = 0;
char op[50], a, b, c, answer;

stack *head = NULL;

printf("Enter the operators and operands: \n"); //Asks for the sequence and checks if there's an invalid character
scanf("%s", op);
while(op[i] != 0){
printf("%c\n", op[i]);
if(op[i] < 48 || op[i] > 57){
if(op[i] != '*' && op[i] != '+' && op[i] != '-' && op[i] != '/' && op[i] != '%'){
printf("You may have entered an invalid character.\n");
exit(0);
}
}
i++;
}
i = 0;

while(op[i] != 0){
if(op[i] >= 48 && op[i] <= 57){
printf("test: %c \n", op[i]);
push (head, op[i]);
printf("\n");
}else if(op[i] == '*' || op[i] == '+' || op[i] == '-' || op[i] == '/' || op[i] == '%'){
push (head, op[i]);
if((op[i-1] >= 48 && op[i-1] <= 57) && (op[i-2] >= 48 && op[i-2] <= 57)){
printf("test: %c \n", op[i]);
c = pop (head);
b = pop (head);
a = pop (head);
answer = evaluate (a, b, c);
printf("test: %d + %d = %d\n", a, b, answer);
push (head, answer);
}else{
printf("Your sequence is mostly likely not in order or is missing something.\n");
}
}
i++;
}
answer = pop(head);
printf("%d\n", answer);
}

这是一个栈的程序,其功能是使用链表在头部进行插入和删除。我的问题是它一直存在状态访问冲突,我发现我的程序一直在删除我输入的先前节点。我以前做过这个,我不知道这个是怎么回事。

void push(stack *head, char op){        //For pushing a value to the stack,       create a temporary variable to store the new value
stack *temp, *h;
temp=(stack*)malloc(sizeof(stack));
temp->value = op; //Tthe temporary value will be the new head, and the previous head will be placed next to it
h = head;
if (h == NULL){
h=temp;
h->next=NULL;
}else{
temp->next=h;
h=temp;
}
h = head;
while(h!=NULL){
printf("%c-->",h->value);
h = h->next;
}
printf("\n");
}

这是编辑过的部分,还是不行。唯一被打印的是我添加的最后一个节点,其余的都没有了。

编辑:我不能在 90 分钟内发布另一个问题,所以我要在这里提问。在评估部分,我需要对字符变量做一个算术方程式。将它们设为整数并暂时将它们更改为 char 还是相反更好?上面的代码,在评估部分

最佳答案

您在编写 pushpop 时遇到了 C 的按值传递函数调用。函数内部的参数是您传入的外部变量的副本。这意味着...

char pop(stack *head) {
//...
head = head->next; // The original pointer is not modified !
//...
}

... 并且由于您 free() 之前的第一个节点,main() 中的 head 指针现在悬空,并且当您尝试访问现已消失的节点时,最终会出现段错误。

要修复它,只需通过地址传递它,以便函数可以从内部更新它:

char pop(stack **head) {
stack *oldHead = *head;

char x = oldHead->value;
*head = oldHead->next;

free(oldHead);
return x;
}

push() 做同样的事情并相应地修改调用点。

关于c - 堆栈的链表,head->next 不断变为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28498069/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com