栈的基本操作的实现(初始化、赋值、取值、插入、删除等)顺序存储结构

#include<stdio.h>
#include<stdlib.h>
#define maxsize 64
typedef int datatype;


//定义结构体
typedef struct
{
	datatype data[maxsize];
	int top;
} seqstack;


//建立顺序栈
seqstack *SET(seqstack *s)
{
	int i;
	s=(seqstack*)malloc(sizeof(seqstack));
	s->top=-1;
	printf("请输入顺序栈元素(整型,以0结束):");
	scanf("%d",&i);
	do
	{
		s->top++;
		s->data[s->top]=i;
		scanf("%d",&i);
	}
	while(i!=0);
	printf("顺序栈建立成功\n");
	return s;
}
//清空栈
void SETNULL(seqstack *s)
{
	s->top=-1;
}
//判断栈空
int EMPTY(seqstack *s)
{
	if(s->top>=0)
		return 0;
	else return 1;
}

//进栈
seqstack *PUSH(seqstack *s)
{
	int x;
	printf("你想要插入的数字:");
	scanf("%d",&x);
	if(s->top==maxsize-1)
	{
		printf("overflow");
		return NULL;
	}
	else
	{
		s->top++;
		s->data[s->top]=x;
	}
	return s;
}

//退栈
seqstack *POP(seqstack *s)
{
	if(s->top<0)
	{
		printf("underlow");
		return s;
	}
	else
	{
		s->top--;
		printf("删除的栈顶元素是:");
		printf("%d\n",(s->data[s->top+1]));
	}
	return s;
}

//取栈顶
void TOP(seqstack *s)
{
	if(s->top<0)
	{
		printf("stack is empty");
	}
	else
	{
		printf("当前的栈顶元素是:");
		printf("%d\n",(s->data[s->top]));
	}
}

//输出栈
void print(seqstack *s)
{
	int i;
	if(s->top<0)
	{
		printf("清空栈成功!");
	}
	for(i=s->top; i>=0; i--)
		printf("%d ",s->data[i]);
}

//主函数
int main()
{
	seqstack *s;
	int i,j;
	printf("1.建立一个顺序栈\n");
	printf("2.输出栈\n");
	printf("3.进栈\n");
	printf("4.退栈\n");
	printf("5.取栈顶元素\n");
	printf("6.清空栈\n");
	printf("7.判断栈是否为空\n");
	printf("8.结束程序\n");
	do
	{
		printf("\n\n请选择想要实现的功能:");
		scanf("%d",&i);
		switch(i)
		{
			case 1:
				s=SET(s);
				break;
			case 2:
				print(s);
				printf("\n");
				break;
			case 3:
				s=PUSH(s);
				print(s);
				printf("\n");
				break;
			case 4:
				s=POP(s);
				print(s);
				printf("\n");
				break;
			case 5:
				TOP(s);
				break;
			case 6:
				SETNULL(s);
				print(s);
				printf("\n");
				break;
			case 7:
				j=EMPTY(s);
				if(j==1)
					printf("空栈\n");
				else
					printf("非空栈\n");
				break;
			case 8:
				exit (0);
		}
	}
	while(1);
	return 0;
}

 实验运行效果图

 

  • 17
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
线性表链式存储结构是由若干个节点组成的链表,每个节点包括一个数据域和一个指针域。数据域存储数据,指针域指向下一个节点。以下是基本操作实现: ### 1. 初始化 ```c #include <stdio.h> #include <stdlib.h> typedef struct LNode { int data; struct LNode *next; } LNode, *LinkList; // 初始化链表 LinkList InitList() { LinkList L = (LinkList) malloc(sizeof(LNode)); if (L == NULL) { printf("初始化失败!\n"); exit(-1); } L->next = NULL; return L; } ``` ### 2. 赋值 ```c // 赋值操作 void ListAssign(LinkList L, int i, int e) { // 找到第i个节点 int j = 1; LNode *p = L->next; while (p != NULL && j < i) { p = p->next; j++; } // 如果第i个节点不存在 if (p == NULL || j > i) { printf("赋值失败:不存在第%d个节点!\n", i); return; } // 赋值 p->data = e; } ``` ### 3. 取值 ```c // 取值操作 int ListGetElem(LinkList L, int i) { // 找到第i个节点 int j = 1; LNode *p = L->next; while (p != NULL && j < i) { p = p->next; j++; } // 如果第i个节点不存在 if (p == NULL || j > i) { printf("取值失败:不存在第%d个节点!\n", i); return -1; } // 返回第i个节点的值 return p->data; } ``` ### 4. 插入 ```c // 插入操作 void ListInsert(LinkList L, int i, int e) { // 找到第i-1个节点 int j = 0; LNode *p = L; while (p != NULL && j < i-1) { p = p->next; j++; } // 如果第i-1个节点不存在 if (p == NULL || j > i-1) { printf("插入失败:不存在第%d个节点!\n", i-1); return; } // 创建新节点并插入 LNode *newNode = (LNode*) malloc(sizeof(LNode)); if (newNode == NULL) { printf("插入失败:内存分配错误!\n"); return; } newNode->data = e; newNode->next = p->next; p->next = newNode; } ``` ### 5. 删除 ```c // 删除操作 void ListDelete(LinkList L, int i) { // 找到第i-1个节点 int j = 0; LNode *p = L; while (p != NULL && j < i-1) { p = p->next; j++; } // 如果第i-1个节点不存在 if (p == NULL || j > i-1) { printf("删除失败:不存在第%d个节点!\n", i-1); return; } // 删除第i个节点 LNode *q = p->next; p->next = q->next; free(q); } ``` ### 6. 归并 ```c // 归并操作 LinkList ListMerge(LinkList La, LinkList Lb) { LNode *pa = La->next; LNode *pb = Lb->next; LNode *pc = La; while (pa != NULL && pb != NULL) { if (pa->data <= pb->data) { pc->next = pa; pc = pa; pa = pa->next; } else { pc->next = pb; pc = pb; pb = pb->next; } } pc->next = pa ? pa : pb; free(Lb); return La; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值