无法从链接列表

时间:2017-03-27 14:07:28

标签: c linked-list

我试图制作一个简单的链接列表程序,当我试图从列表中弹出第一个元素时,它没有弹出,它仍然是列表中的第一个元素,请帮我解决这个错误。

以下是代码:

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

void create(stack *s){
 if(s == NULL){
    s = (stack*)malloc(sizeof(stack)*1);
    (s->next)=NULL;
 }
 else{
    stack *temp = (stack*)malloc(sizeof(stack)*1);
    (temp->next)=s;
    s=temp;
 }
}

void push(stack *s, char x){
   create(s);
   (s->value)=x;
}

void isEmpty(stack *s){
    if(s == NULL){
        printf("List is Empty!\n");
    }
    else{
        printf("List is not Empty!\n");
    }
}

char pop(stack *s){
 if(s == NULL){
    isEmpty(s);
    return -1;
 }
 char x=s->value;
 s=(s->next);
 return x;
}   

int main(int argc , char* argv[]){
stack *s;
create(s);
char choice,data;
printf("Stack Created\n\n");
do{
    printf("Choose Option: pUsh, pOp, pEek, iseMpty, getSize, eXit: \n");

    scanf(" %c",&choice);

    switch(choice){
        case 'U':{
            printf("Enter the element to be pushed: \n");

            scanf(" %c",&data);
            push(s, data);
            break;
        }
        case 'O':{
            data=pop(s);
            if(data != NULL){
                printf("Popped: %c\n", data);
            }
            break;
        }
    }
}while(1);
return 0;
}

3 个答案:

答案 0 :(得分:5)

s=s->next;无效,因为s是本地变量。您需要返回s的新值或使用指针修改调用者的版本。

答案 1 :(得分:2)

我将参数更改为pop()push()stack *更改为stack **,以便我们可以更新堆栈而不是局部变量。我删除了create(),因为它基本上是在推送期间发生的事情,我将其与之集成。 剩下的很简单,我还在free()中添加了pop()来电。看看:

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

typedef struct stack{
  int value;
  struct stack *next;
}stack;

void push(stack **s, int x){
  stack *temp = (stack*)malloc(sizeof(stack)*1);
  temp->value = x;
  temp->next = NULL;
  if(*s == NULL){
    *s = temp;
  }else{ 
    temp->next = *s;
    *s=temp;
  }
}

char pop(stack **s){
  if(*s == NULL){
    return -1;
  }
  char x=(*s)->value;
  stack *tmp = *s;
  *s=(*s)->next;
  free(tmp);
  return x;
}   

int main(int argc , char* argv[]){
  stack *s;
  char choice,data;
  printf("Stack Created\n\n");
  do{
    printf("Choose Option: pUsh, pOp, pEek, iseMpty, getSize, eXit: \n");
    scanf(" %c",&choice);

    switch(choice){
      case 'U':{
        printf("Enter the element to be pushed: \n");

        scanf(" %c",&data);
        push(&s, data);
        break;
      }
      case 'O':{
        data=pop(&s);
        if(data != -1){
            printf("Popped: %c\n", data);
        } else {
            printf("Stack is empty. nothing popped");
        }
        break;
      }
   }
 }while(1);
 return 0;
}

答案 2 :(得分:-1)

如果你想将指针作为参数传递

,你必须使用指针指针
char pop(stack **s)
{
 **s=s->next;
}

这是一个临时解决方案你还应该考虑删除你使用malloc函数分配的内存,否则会导致内存泄漏 在pop函数

中调用它时,也会传递指针s的地址