C语言解决链栈

Python014

C语言解决链栈,第1张

#include <stdio.h>

//#include<stdlib.h>

#include <malloc.h>

typedef int DataType

typedef struct node {

DataType data

struct node *next

}Node,*Stack,*ps

Stack GetEmptyStack() {

Stack s = (ps)malloc(sizeof(Node))

s->next = NULL

return s

}

void InitStack(Stack &s) { //链栈初始化

s =  (ps)malloc(sizeof(Node)) // 配置头结点方便后续操作

s->next = NULL 

}

void DestroyStack(Stack s) {//销毁链栈

ps q,p = s->next

while(p) { //依次释放链栈的每一个结点

q = p

p = p->next

free(q)

//p = s

}

free(s) //最后删除头结点

}

void Push(Stack &s,DataType x) { //入栈操作

ps t = (ps)malloc(sizeof(Node)) 

t->data = x

t->next = s->next

s->next = t

}

int Empty(Stack s) {

return (s->next == NULL)

}

int Pop(Stack s,DataType *ptr) {

ps p

if(Empty(s)) {

printf("下溢错误,删除失败。\n")

ptr = NULL

return 0 // 0返回值时,ptr指向的内容不可用

}

p = s->next

*ptr = p->data // 存取要删除的栈顶元素

s->next = p->next // 头指针指向下一个数据结点

free(p)

return 1

}

int GetTop(Stack s,DataType *ptr) { //取栈顶元素

if(Empty(s)) {

printf("下溢错误。\n")

return 0

}

*ptr = s->next->data

return 1

}

int main() {

DataType x

Stack s = GetEmptyStack() // 定义链栈的栈顶指针并初始化

// InitStack(s) // 指针相当于一个地址&

printf("对15和10进行入栈操作\n")

Push(s,15)

Push(s,10)

if(GetTop(s,&x)) printf("当前栈顶元素为:%d\n",x) // 输出当前栈顶元素10

if(Pop(s,&x)) printf("执行一次出栈操作,等同于删除栈顶元素:%d\n",x) // 输出出栈元素10

if(GetTop(s,&x)) printf("现在的栈顶元素为:%d\n",x) // 输出当前栈顶元素15

printf("请输入待插元素:")

scanf("%d",&x)

Push(s,x)

if(Empty(s)) printf("栈为空。\n")

else printf("栈并不为空。\n")

return 0

}

链表就是在一个节点定义一个同类型的指针,让其指向下一个节点,比如

struct

node{

datatype

data

node*

next

}

你定义个node变量node1和node变量node2,链起来就是node1.next

=

&node2

同理,后面也可以链起来。记住要单独定义个节点变量指向第一个node,否则很可能

会丢失链表头,并且不能改变该变量的值。一般定义一个node*

head

=

&node1遍历的话,举例node*

p

=

head

while(p)

{

。。。此处可以做一些操作,然后让p

=

p->next

这样就指向下一个了}。还有一点需要注意,如果编译器不对指针初始化为0的话,就需要个人手动指向0。比如定义node1后,node1.next

=

0;这样就不会出问题了

给题主一个包含建栈、入栈、出栈的代码吧

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <string.h>

#define elemType int /*元素类型*/

#define status int

#define OVERFLOW -1

#define ERROR 0

#define OK 1

typedef struct sNode {

elemType data

struct sNode *next

} sNode

typedef struct {

sNode *top /*栈顶指针*/

int length /*栈中元素个数*/

} *SLink

/* 初始化 */

/* 操作结果:构造一个空的栈S */

void initStack (SLink *S) {

(*S) -> top = NULL /*栈顶指针的初始值为空*/

(*S) -> length = 0 /*栈中元素个数为0*/ 

}

/* 入栈 */

/* 操作结果:栈S插入元素e */

status push (SLink S, elemType e) {

sNode *p

    p = (sNode*)malloc (sizeof (struct sNode)) /*建立新节点*/

    if (!p) /*内存分配失败*/

        exit (OVERFLOW)

    p->data = e

    p->next = S->top /*链接到原来的栈顶*/ 

    S->top = p /*移动栈顶指针*/ 

    ++S->length /*栈的长度增加*/

    

    return OK

}

/*出栈*/

/* 操作结果:删除栈S栈顶元素,并由e返回其值 */

status pop (SLink S, elemType *e) {

sNode *q

if (!S->top)

        return ERROR

    else {

*e = S->top -> data /*返回栈顶元素*/ 

        q = S->top

        S->top = S->top -> next /*修改栈顶指针*/

        --S->length /*栈的长度减少*/

free (q) /*释放被删除的元素空间*/ 

return OK

    }

}

/* 输出栈 */

status stackPrint (SLink S) {

sNode *p = S->top /* p指向栈顶 */

while (p!=NULL) {

printf ("%d\t",p->data)

p = p->next

}

putchar ('\n')

return OK

}

int main (void) {

SLink S

elemType e

elemType a=1,b=2,c=3,d=4

initStack (&S)

/*入栈若干元素*/

push (S, a)

push (S, b)

push (S, c)

push (S, d)

puts ("入栈4个元素,此时栈内容为:")

stackPrint (S) 

/*出栈*/

pop (S, &e)

puts ("出栈1个元素,此时栈内容为:")

stackPrint (S)

getch () /*屏幕暂留*/

return 0 

}

运行结果