线性表的链式存储

线性表的链式存储
实验代码:

实验目的

1.掌握栈的数据类型描述及栈的特点。
2.掌握栈的顺序和链式两种存储结构的特点及算法描述。
3.掌握栈的5种基本运算及算法在两种不同存储结构上的实现。

实验内容

1.编写链式栈进栈、出栈、显示栈中全部元素的程序。
2.用switch语句设计一个选择式菜单,以菜单方式执行上述操作。

#include<stdio.h>
#include<stdlib.h>
#define error 0
#define ok 1

typedef int elemtype;
typedef struct SNode {
	elemtype data;
	struct SNode *next;
}linkstack, *linklist;

linklist init_linklist()   //初始化
{
	linklist top;
	top = (linklist)malloc(sizeof(linklist));
	top->next = NULL;
	return top;
}

int StackEmpty(linkstack*S)  //判断是否为空栈
{
	if (S->next == NULL)
		return error;
	else
		return ok;
}

linklist Creat_LinKStack_1()//头插入法建立链栈(初始化赋值)
{
	linklist head;         //头指针
	head = (linklist)malloc(sizeof(linkstack));
	head->next = NULL;
	linkstack *s;          //定义一个待插入结点数据类型
	elemtype x;           //设待插入数据元素的类型为int
	printf("头插法创建链栈");
	printf("请输入每个结点的值域(0结束):");
	scanf_s("%d", &x);
	while (x != 0)         //当输入的值不为0时,进入循环
	{
		s = (linklist)malloc(sizeof(linkstack));      //申请新结点、
		s->data = x;          //对新结点赋值
		s->next = head->next;
		head->next = s;
		scanf_s("%d", &x);       //输入新数据     
	}
	return head;
}

int pushstack(linkstack *S, elemtype e)   //入栈
{
	linkstack *top, *P;
	top = S;
	P = (linkstack*)malloc(sizeof(linkstack));
	if (top == NULL)return 0;
	else {
		P->data = e;
		P->next = top->next;
		top->next = P;
	}
	return 1;
}

int popstack(linkstack *S, elemtype e)    //出栈
{
	linkstack *p;
	elemtype k;
	k = StackEmpty(S);
	if (k == 0)
		return error;
	else {
		p = S->next;
		S->next = p->next;
		e = p->data;
		free(p);
		return e;
	}
}

void outputnode(linkstack *L)     //输出单链表(编历)、
{
	linkstack *p;
	p = L->next;        //指向头结点后第一个结点
	while (p->next != NULL)
	{
		printf("%d->", p->data);    //输出表中非最后一个元素
		p = p->next;
	}
	printf("%d\n", p->data);       //输出表中最后一个元素
}

int main()
{
	linkstack *S;
	int e, k;
	do
	{
		printf("\n\n\n\n");
		printf("\t\t\t 链表字系统\n");
		printf("\t\t*************************\n");
		printf("\t\t*       1—初始化       *\n");
		printf("\t\t*       2—赋  值       *\n");
		printf("\t\t*       3—入  栈       *\n");
		printf("\t\t*       4—出  栈       *\n");
		printf("\t\t*       5—显  示       *\n");
		printf("\t\t*       0—返  回       *\n");
		printf("\t\t*************************\n");
		printf("\t\t 请选择菜单项(0—5):");
		scanf_s("%d", &k);  //getchar();
		switch (k)
		{
		case 1://初始化
			S = init_linklist();
			if (S == NULL) printf("初始化链栈失败\n");
			else printf("初始化链表成功\n");
			break;
		case 2://赋值
			S = Creat_LinKStack_1();
			printf("链表的存储顺序为;");
			outputnode(S);
			break;
		case 3://入栈
			printf("请输入入栈元素值:");
			scanf_s("%d", &e);
			k = pushstack(S, e);
			if (k == 1)
			{
				printf("插入操作成功!插入元素后顺序表如下\n");
				outputnode(S);
			}
			else printf("插入操作失败\n");
			break;
		case 4://出栈
			k = popstack(S, k);
			if (k == 0)
				printf("出栈失败\n");
			else
			{
				printf("出栈成功\n");
				printf("出栈元素值为%d\n", k);
				printf("出栈后链栈存储顺序为:");
				outputnode(S);
			}
			break;
		case 5://遍历
			printf("栈中的全部元素为:\n");
			return 0;
		case 6://返回
			printf("\n表的存储顺序为:");
			outputnode(S);
			break;
		}
	} while (k != 0);
	system("pause");
	return 0;
}

实验结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值