c语言-关于栈的链式结构,请问以下代码问题在哪?

问题描述

关于栈的链式结构,请问以下代码问题在哪?

#include
#include
struct node
{
int data;
struct node next;
};
struct node *createemptystack_link(void)
{
struct node *top;
top=(struct node
)malloc(sizeof(struct node));
if(top!=NULL)
top->next=NULL;
else
printf("out of space!");
return top;
}
int isemptystack_link(struct node top)
{
return (top==NULL);
}
void push_link(struct node *top,int x)
{
struct node *p;
p=(struct node
)malloc(sizeof(struct node));
if(p==NULL)
printf("out of space!");
else
{
p->data=x;
p->next=top;
top=p;
}
}
void pop_link(struct node *top)
{
struct node *p;
if(top==NULL)
printf("empty stack pop!");
else
{
p=top;
top=top->next;
free(p);
}
}
int main()
{
struct node *createemptystack_link(void);
void push_link(struct node *top,int x);
void pop_link(struct node *top);
int isemptystack_link(struct node *top);
int i,n,x;
struct node *p;
p=createemptystack_link();
printf("请输入入栈数据的个数:");
scanf("%d",&n);
printf("请输入数据:");
for(i=0;i
{
scanf("%d",&x);
push_link(p,x);
}
while(p)
{
printf("%d",p->data);
pop_link(p);
}
return 0;
}
从测试各函数来看,是创建链表或入栈地方有错。

解决方案

用VS2013编译通过

 // ConsoleApplication1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

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

struct node
{
    int data;
    struct node *pre;
    struct node *next;
};

struct node *p = NULL;

int isemptystack_link()
{
    return p->pre == NULL;
}

void push_link(int x)
{
    if (p == NULL)
    {
        p = (struct node*)malloc(sizeof(struct node));
        p->data = x;
        p->pre = NULL;
        p->next = NULL;
    }
    else
    {
        struct node *pp = p;
        p = (struct node*)malloc(sizeof(struct node));
        p->data = x;
        p->pre = pp;
        pp->next = p;
        p->next = NULL;
    }
}
void pop_link()
{
    if (p == NULL)
        printf("empty stack pop!");
    else
    {
        p = p->pre;
        if (p != NULL)
            free(p->next);
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    int i, n, x;
    printf("num");
    scanf_s("%d", &n);
    printf("data");
    for (i = 0; i<n; i++)
    {
        scanf_s("%d", &x);
        push_link(x);
    }
    while (p != NULL)
    {
        printf("%dn", p->data);
        pop_link();
    }
    return 0;
}

解决方案二:

你的代码错得太多,你没有指向前继节点的指针,怎么能出栈呢?

解决方案三:

struct node
{
int data;
struct node next; //此处应该用指针类型
};

p=(struct node)malloc(sizeof(struct node));//强制转换应该转换为指针类型

int isemptystack_link(struct node top) //判断栈是否为空,应该是判断top->next==NULL
{
return (top==NULL);
}

p=(struct node)malloc(sizeof(struct node)); //同上

p->data=x;
p->next=top; //节点插入出错,链表的头部插入应该是插到头结点的后方
top=p;

应该改为 p->next = top->next; top->next = p;

if(top==NULL) //同上

p=top;
top=top->next;
free(p); //改为p = top->next;top->next = top->next->next;free(p);

错误太多,目测对链栈的理解太浅,多读读书在实践吧!

时间: 2024-11-03 21:09:19

c语言-关于栈的链式结构,请问以下代码问题在哪?的相关文章

数据结构的C++实现之栈的链式存储结构

当单链表限定只能在头部进行插入和删除操作的时候,即为链栈,一般我们会将单链表的头指针和栈的栈顶指针top合二 为一,通常对链栈来说,是不需要头节点的,因为我们维护了栈顶指针.对于链栈来说,基本不存在栈满的情况,除非内存 已经没有可以使用的空间,对于空栈来说,链表原定义是头指针指向空,那么链栈的空其实就是top = = NULL的时候.   示例代码:(改编自<大话数据结构>) #include <iostream> using namespace std; typedef int

C++中实现队列类链式存储与栈类链式存储的代码示例_C 语言

队列类链式存储 代码: linkqueue.hpp  // 队列类 #pragma once #include "linklist.hpp" template <typename T> class LinkQueue { public: LinkQueue(); ~LinkQueue(); public: int clear(); int append(T &t); int retieve(T &t); int header(T &t); int l

数据结构 单链表-链式结构实现任意多项式的相加

问题描述 链式结构实现任意多项式的相加 若多项式随机表达,不是升幂和降幂.以链式存储结构为存储方式,实现两式相加 解决方案 求大神解答--

数据结构Java实现05----栈:顺序栈和链式堆栈

一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除操作. 先进后出:堆栈中允许进行插入和删除操作的一端称为栈顶,另一端称为栈底.堆栈的插入和删除操作通常称为进栈或入栈,堆栈的删除操作通常称为出栈或退栈. 备注:栈本身就是一个线性表,所以我们之前讨论过线性表的顺序存储和链式存储,对于栈来说,同样适用.   二.堆栈的抽象数据类型: 数据集合: 堆栈的

JavaScript链式结构序列化详解

一.概述 在JavaScript中,链式模式代码,太多太多,如下: if_else: if(...){      //TODO  }else if(...){      //TODO  }else{      //TODO  }  switch: switch(name){      case ...:{          //TODO          break;      }      case ...:{          //TODO          break;      }   

JavaScript 链式结构序列化详解_基础知识

一.概述 在JavaScript中,链式模式代码,太多太多,如下: if_else: if(...){ //TODO }else if(...){ //TODO }else{ //TODO } switch: switch(name){ case ...:{ //TODO break; } case ...:{ //TODO break; } default:{ //TODO } } 疑问:诸如上述这些链式代码,倘若,我们想将其扁平化链式处理呢?如下: //fn1,f2,f3为处理函数 _if(

算法与数据结构之栈的链式存储

#include<stdio.h> #include<windows.h> #include<malloc.h> typedef int elemtype; typedef struct linknode //链表的定义 { elemtype data; struct linknode *next; } listack; void initstack(listack *&s) //初始化 { s=(listack *)malloc(sizeof(listack)

基本数据结构:栈的链式表示

以下为操作栈的算法,该栈为动态栈. 在该栈中,pTop指向的节点中存放该栈的栈顶数据,pBottom指向的节点的上一个节点存放该栈的栈底数据,pBottom指向的节点中不存放有效数据,这样做的目的是为了在进行入栈和出栈时方便对栈的操作,而不用考虑特殊情况 操作系统:ubuntu 编译软件:gcc 结果截图:

数据结构的C++实现之队列的链式存储结构

队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,我们把它简称为链队列.为了操作上的 方便,我们将队头指针指向链队列的头节点,而队尾指针指向终端节点.空队列时,front和rear都指向头节点. 示例程序 :(改变自<大话数据结构>) #include<iostream> using namespace std; typedef int ElemType; typedef struct Node { ElemType data; struct Node *nex