day 6 顺序栈 以及链栈的功能

该代码实现了一个简单的C程序,用于操作顺序栈和链表。包括创建、插入、删除和遍历元素的功能。用户可以选择在顺序栈中进行push、pop和output操作,或者在链表中进行head_insert、head_delete和linklistput操作。
摘要由CSDN通过智能技术生成
#ifndef _HEAD_H
#define _HEAD_H
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef int datatype;
#define MAXSIZE 10

typedef struct
{
	int top;
	datatype data[MAXSIZE];	
}stack;
stack * create();
int push(stack*l,datatype key);
int pop (stack*l);
void output(stack * l);



typedef struct Node
{
	union
	{
	int len;
	datatype data;
	};
	struct Node *next;
}*linklist;

void head_delete(linklist l);
void head_insert(linklist l,datatype key);
linklist create1(int flag);
void linklistput(linklist l);

void menue1();
void menue2();
void menue3();










#endif
#include "head.h"
void menue1()
{
	puts("------------------------------");
	puts("\t1,顺序栈");
	puts("\t2,链栈");
	puts("\t0退出程序");
	puts("------------------------------");
}

void menue2()
{
	puts("------------------------------");
	puts("\t1,顺序栈的插入");
	puts("\t2,顺序栈的删除");
	puts("\t3,顺序栈的遍历");
	puts("\t0,返回上一级");
	puts("------------------------------");
} 
void menue3()
{
	puts("------------------------------");
	puts("\t1,链栈的插入");
	puts("\t2,链栈的删除");
	puts("\t3,链栈的遍历");
	puts("\t0,返回上一级");
	puts("------------------------------");
}


stack * create()
{
	stack* l = (stack*)malloc(sizeof(stack));
	if(l == NULL)
		return NULL;
	l->top = -1;
	return l;

}

int push(stack*l,datatype key)
{
	if(l==NULL || l->top == MAXSIZE -1)
	{   
		printf("插入失败\n");
		return -1;
	}
		l->top++;
		l->data[l->top] = key;
	    return 0;
}
int pop (stack*l)
{
	if(l==NULL || l->top == -1)
	{   
		printf("删除失败\n");
		return -1;
	
	}
	printf("%d",l->data[l->top]);
	l->top--;
	return 0;		
}


void output(stack * l)
{
	if(l==NULL || l->top == MAXSIZE -1)
	{   
		printf("插入失败\n");
		return ;
	}
	for (int i = l->top;i>=0;i--)
		{
			printf("%d\t",l->data[i]);

	     }
	puts("");
}


linklist create1(int flag)
{
	linklist l = (linklist)malloc(sizeof(struct Node));
	if (l == NULL)
	{
		printf("创建失败\n");
		return NULL;
	}
	if (flag = 1)
		l->len = 0;
	else
		l->data = 0;

	return l;
}


void head_insert(linklist l,datatype key)
{
	if (l == NULL)
	{
		printf("创建失败\n");
		return ;
	}
    linklist s = create1(0);
	if (l == NULL)
	{
		printf("创建失败\n");
		return ;
	}
	s->data = key;
	s->next = l->next;
	l->next = s;
	l->len++;
}
void head_delete(linklist l)
{
	if (l == NULL)
	{
		printf("创建失败\n");
		return ;
	}

	linklist s = l->next;
	l->next = s->next;
	free(s);
	s = NULL;
	l->len--;
}

void linklistput(linklist l)
{
	if(l==NULL || l->next == NULL)
	{   
		printf("输出失败\n");
		return ;
	}
	linklist p = l;
	while(p->next != NULL)
		{
			p=p->next;
			printf("%d\t",p->data);
	     }
	puts("");
}



 

#include "head.h"
int main(int argc, const char *argv[])
{  
	int number;
     while(1)
	 {  loop:
		 menue1();
		printf("请输入你的选择:");
		scanf("%d",&number);
		switch(number)
		{    
			case 1: 
	             { stack * l = create();   
					menue2();
					int number2;
					while(1)
					{			
						printf("请输入你的选择:");
						scanf("%d",&number2);

						switch(number2)
					 	{
						case 1:
					 	{   
						int n; datatype key;
						printf("请输入插入个数");
						scanf("%d",&n);
						for(int i = 0; i < n;i++ )
						{
							printf("请输入要插入的值");
							scanf("%d",&key);
					    	push(l, key);
						}				
						} break;
							case 2: 
							{
								pop(l);
								break;		
							}
							case 3: 
							{
								output(l);
								break;		
							}
							default : printf("输入错误\n");break;
							case 0 :printf("请返回上一级\n");goto loop;
						}				
							
		}
	}
			case 2:{ 
				 		menue3();
						linklist l = create1(1);
						int number3;datatype key;int n;
						while(1)
						{
							printf("请输入你的选择:");
							scanf("%d",&number3);
							switch(number3)
							{
								case 1: 
									{
										printf("请输入你要插入几个");
										scanf("%d",&n);
										for(int i = 0;i<n;i++)
										{
										printf("请输入你要插入的值");
										scanf("%d",&key);
										head_insert(l,key);
										}break;
									case 2:
										{
										 head_delete(l);   
										 }break;
									 case 3:
										{
										linklistput(l);
										} break;
							default : printf("输入错误\n");break;
							case 0 :printf("请返回上一级\n");goto loop;

									}
							
							
							}
						
						}
					
						}
	
		}
		}
return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值