//#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
}
运行结果