数据结构上机实验

第一次

实验日期:2019年10月24、25日
实验要求: Status initlist(sqlist &L)
Status listinsert( sqlist &L, int i, int e )
Status listindele( sqlist &L, int i, int &e )
Status listinprint( sqlist L)
void MergeList(sqlist La, sqlist Lb, sqlist &Lc)
void inverse(sqlist &Lc)
完成以上几个函数,实现手工创建两个非递减序列存放于La和 Lb中,并调用MergeList实现数据的合并。合并之后用inverse把Lc中的数据就地逆置(不占用太多额外辅助空间,空间复杂度为常数级别)
关于程序健壮性的内容:
1、对于插入与删除位置若不合法请给出适当提醒
2、若输入的数据不是非递减排列可通过自己写的
sort()函数排序后再进行后续操作

#include<bits/stdc++.h>
using namespace std;
#define MAXSIZE 100
#define OK 1
#define ERROR 0
typedef int Status;
typedef struct{
	int *elem;
	int length;
}SqList;

SqList L;

Status initlist(SqList &L)
{
	L.elem=new int[MAXSIZE];
	if(!L.elem) exit(OVERFLOW);
	L.length=0;
	return OK;
}

Status listinsert(SqList &L,int i,int e){//在顺序表l中第i个位置插入新的元素e,i值的合法范围是1<<i<<L.length+1
	if((i<1)||(i>L.length+1)) return ERROR;
	if(L.length==MAXSIZE) return ERROR;
	for(int j=L.length-1;j>=i-1;j--){
		L.elem[j+1]=L.elem[j];
	}
	L.elem[i-1]=e;
	++L.length;
	return OK;
}

void MergeList_Sq(SqList LA,SqList LB,SqList &LC){
	//已知顺序有序表LA和LB的元素按值非递减排列
	//归并LA和LB得到新的顺序有序表LC,LC的元素也按值非递减排序
	LC.length=LA.length+LB.length;
	LC.elem=new int[LC.length];
	int *pc=LC.elem;
	int *pa=LA.elem; int *pb=LB.elem;
	int *pa_last=LA.elem+LA.length-1;
	int *pb_last=LB.elem+LB.length-1;
	while((pa<=pa_last)&&(pb<=pb_last)){
		if(*pa<=*pb) *pc++=*pa++;
		else *pc++=*pb++;
	}
	while(pa<=pa_last) *pc++=*pa++;
	while(pb<=pb_last) *pc++=*pb++;
}

void inverse(SqList &Lc){
	int a;
	int j=Lc.length;
	for(int i=0;i<j;i++,j--){
		a=Lc.elem[i];
		Lc.elem[i]=Lc.elem[j-1];
		Lc.elem[j-1]=a;
	}
	printf("***倒序输出合并好的序列***\n");
	for(int i=0;i<Lc.length;i++){
		printf("%d ",Lc.elem[i]);
	}
}
void kaishi(){
	printf("**********************************\n欢迎来老师来测试第二组上机实验成果\n");
}
Status ListDelete(SqList &L,int i){
	//在顺序表L中删除第i个元素,i值的合法范围是1<<i<<L.length
	if((i<1)||(i>L.length))  return ERROR;
	for(int j=i;j<=L.length-1;j++){
		L.elem[j-1]=L.elem[j];
	}
	--L.length;
	return OK;
}
int main()
{
	SqList Lb; 
	if(!initlist(L)) printf("创建失败\n");
	kaishi();
	printf("******输入La长度******\n\n");
	scanf("%d",&L.length);
	printf("\n**输入数据用空格隔开**\n\n"); 
	for(int i=0;i<L.length;i++){
		int a;
		scanf("%d",&a);
		L.elem[i]=a;
	}
	printf("\n***输入成功***\n");
	for(int i=0;i<L.length;i++){
		printf("%d ",L.elem[i]);
	}
	printf("\n***输入插入的位置1~%d***\n",L.length+1);
	int i,e;
	scanf("%d",&i);
	while((i<1)&&i>(L.length+1)){
		printf("***输入位置不符合***\n请在1~%d上输入\n",L.length+1);
		scanf("%d",&i);
	}
	printf("****输入成功****\n请输入插入的数据\n");
	scanf("%d",&e);
	if(listinsert(L,i,e)) printf("****插入成功****\n");
	for(int i=0;i<L.length;i++){
		printf("%d ",L.elem[i]);
	}
	sort(L.elem,L.elem+L.length);
	if(!initlist(Lb)) printf("创建失败\n");
	printf("\n*****输入Lb长度*****\n");
	scanf("%d",&Lb.length);
	printf("*****输入数据用空格隔开*****\n"); 
	for(int i=0;i<Lb.length;i++){
		int a;
		scanf("%d",&a);
		Lb.elem[i]=a;
	}
	sort(Lb.elem,Lb.elem+Lb.length);
	SqList Lc;
	printf("****开始合并La和Lb序列****\n\n****输出合并好的序列****\n");
	MergeList_Sq(L,Lb,Lc);
	
	for(int i=0;i<Lc.length;i++){
		printf("%d ",Lc.elem[i]);
	}
	printf("\n***请输入要删除数据的位置***\n");
	int weizhi;
	scanf("%d",&weizhi);
	while((weizhi<1)||(weizhi>Lc.length)){
		printf("***输入位置不合法***\n请重新输入\n");
		scanf("%d",&weizhi);
	}
	printf("*****输入成功*****\n");
	if(ListDelete(Lc,weizhi)) printf("******删除成功*****\n");
	for(int i=0;i<Lc.length;i++){
		printf("%d ",Lc.elem[i]);
	}
	printf("\n");
	inverse(Lc);
	printf("\n***老师辛苦了***\n");
	 
	return 0;
}

第二次

实验日期:2019年10月31日

实验目的:
根据所给的一元多项式相加的程序,写出一元多项式相乘的程序并调试通过。

实验要求:

1、写出一元多项式的横向输出方式,当系数为零时,要求重新输入数据。
2、把加法改写成Lc=La+Lb,方便进行 Lc=La*Lb

#include<bits/stdc++.h>
using namespace std;
typedef int Status;
int w=0;
typedef struct PNode{
	int coef;
	int expn;
	struct PNode *next;
}PNode,*Polynomial;
const int maxn=1e3+10;
struct node{
	int x,y;
}vis[maxn],check[maxn];
int sss=0;
int cmp(node x,node y){
	return x.y<y.y;
}
void CreatePolyn(Polynomial &P,int n){
	P=new PNode;
	P->next=NULL;
	printf("输入每一项的系数和指数用空格隔开\n");
	
	for(int i=1;i<=n;i++){
		PNode *s=new PNode;
		cin>>s->coef>>s->expn;
		while(s->coef==0){
			printf("重新输入\n");
			cin>>s->coef>>s->expn;
		}
		PNode *pre=P;
		PNode *q=P->next;
		while(q&&q->expn<s->expn){
			pre=q;
			q=q->next;
		}
		s->next=q;
		pre->next=s;
	}
}
void shuchu(Polynomial P){
//	printf("系数 指数\n");
	printf("F%d(x)=",++w);
	int q=0;
	while(P->next!=NULL){
		P=P->next;
		if(q==0){
			if(P->coef==1){
				printf("X%d",P->expn);
			}
			else{
				printf("%dX%d",P->coef,P->expn);
			}
			q=1;
		}
		else{
			if(P->coef==1){
				printf("+X%d",P->expn);
			}
			else{
				printf("+%dX%d",P->coef,P->expn);
			}
		}
//		printf("%d    %d\n",P->coef,P->expn);	
	}
}
void chengPolyn(Polynomial &P1,Polynomial &P2,Polynomial &P3){
	PNode *p1,*p2,*p3,*p4,*p5;
	p1=P1->next; p2=p5=P2->next;
	P3=new PNode;
	P3->next=NULL;
	p3=p4=P3;
	while(p1){
		while(p2){
			int sum=0,ans=0;
			sum=p1->coef*p2->coef;
			ans=p1->expn+p2->expn;
			if(sum!=0){
				PNode *p=new PNode;
				p->coef=sum;
				p->expn=ans;
				p->next=NULL;
				p4->next=p;
				p4=p4->next;
			}
			p2=p2->next;
		}
		p1=p1->next;
		p2=p5;
	}
}
void addPolyn(Polynomial P){
	int i=0;
	while(P->next!=NULL){
		P=P->next;
		vis[i].x=P->coef;
		vis[i].y=P->expn;
		i++;
	}
	int n=i;
	int e=0;
	for(int j=0;j<=n;j++){
		int flag=0;
		for(int i=j+1;i<=n;i++){
			if(vis[j].y==vis[i].y&&vis[i].x!=0){
				int sum=0;
				sum=vis[j].x+vis[i].x;
				check[e].x=sum;
				check[e].y=vis[j].y;
				e++;
				flag=1;
				vis[i].x=0;
			}
		}
		if(flag==0&&vis[j].x!=0){
			check[e].x=vis[j].x;
			check[e].y=vis[j].y;
			e++;
		}
	}
	sss=e;
}
int main(){
	printf("输入第一个多项式的项数\n");
	int n,m;
	cin>>n;
	Polynomial P1,P2,P3;
	CreatePolyn(P1,n);
	shuchu(P1);
	printf("\n输入第二个多项式的项数\n");
	cin>>m;
	CreatePolyn(P2,m);
	shuchu(P2);
	chengPolyn(P1,P2,P3);
	printf("\n");
//	shuchu(P3);
	addPolyn(P3);
	printf("\n");
	sort(check,check+sss,cmp);
	printf("F(x)=F1(x)*F2(x)\n");
	printf("F(x)=");int g=0;
	for(int i=0;i<sss;i++){
		
		if(g==0){
			if(check[i].x==1){
				printf("X%d",check[i].y);
			}
			else{
				printf("%dX%d",check[i].x,check[i].y);
			}
			g=1;
		}
		else{
			if(check[i].x==1){
				printf("+X%d",check[i].y);
			}
			else{
				printf("+%dX%d",check[i].x,check[i].y);
			}
		}
	}
	return 0;
}

第三次

···
在这里插入图片描述

#include <bits/stdc++.h> //第一问
using namespace std;

//-------链栈的存储结构------
typedef struct StackNode
{
	char data;
	struct StackNode *next;
 } StackNode,*LinkStack;
 
int InitStack (LinkStack &S)
{//构造一个空栈S,栈顶指针置空 
S=NULL;
return 1; 
}
int Push(LinkStack &S, char e)
{//在栈顶插入元素e 
LinkStack p=new StackNode;
p->data=e;
p->next=S;
S=p;
return 1;
 } 
 
int Pop(LinkStack &S,char &e)
{//删除S的栈顶元素,用e返回其值
if(S==NULL) return 0;
e=S->data;
LinkStack p=S;
S=S->next;
delete p;
return 1; 
}

int GetTop(LinkStack S)
{//返回S的栈顶元素,不修改栈顶指针
if(S!=NULL)
return S->data;
}
int StackEmpty(LinkStack S){
	if(S==NULL) return 1;
	else return 0;
} 
int Matching(){
	LinkStack S;
	InitStack(S);
	int flag=1;
	char ch,x;
	cin>>ch;
	while(ch!='#'&&flag){
		switch(ch){
			case '[':
			case '(':
				Push(S,ch);
				break;
			case ')':
				if(!StackEmpty(S)&&GetTop(S)=='(')
					Pop(S,x);
				else flag=0;
				break;
			case ']':
				if(!StackEmpty(S)&&GetTop(S)=='[')
					Pop(S,x);
				else flag=0;
				break;
		}
		cin>>ch;
	}
	if(StackEmpty(S)&&flag) return 1;
	else return 0;
}
int main(){
	LinkStack S;
	printf("请输入一系列括号以#结束:\n");
	if(Matching())
	printf("匹配成功\n");
	else printf("匹配失败\n"); 
	return 0;
}

#include<bits/stdc++.h>//第二问
using namespace std;
typedef long long ll;
const ll inf = 0x3f3f3f3f;
const int OK = 1;

typedef struct StackNode{
	char data;
	struct StackNode *next;
}StackNode,*LinkStack;


int InitStack(LinkStack &S){
	S=NULL;
	return OK;
}
int Push(LinkStack &S,unsigned char e){
	LinkStack p = new StackNode;
	p->data=e;
	p->next=S;
	S=p;
	return OK;
}
int Pop(LinkStack &S,unsigned char &e){
	if(S==NULL) return 0;
	e=S->data;
	LinkStack p=S;
	S=S->next;
	delete p;
	return 1;
}
unsigned char GetTop(LinkStack S){
	if(S!=NULL)
	return S->data;
}
int check(unsigned char aa){
	if(aa=='+'||aa=='-'||aa=='*'||aa=='/'){
		return 1;
	}
	return 0;
}
int tis(unsigned char ch){
	if(ch=='+') return 1;
	if(ch=='-') return 2;
	if(ch=='*') return 3;
	if(ch=='/') return 4;
}
unsigned char Operate(unsigned char x,unsigned char ch,unsigned char y){
	int a=x-'0';
	int b=y-'0';
	int c=0;
	if(tis(ch)==1)  c = b+a;
	if(tis(ch)==2)  c = b-a;
	if(tis(ch)==3)  c = b*a;
	if(tis(ch)==4)  c = b/a;
	unsigned char ss=c+'0';
	return ss;
}
int main(){
	LinkStack S;
	InitStack(S);
	cout<<"请输入后缀表达式:"<<endl;
	while(1){
		unsigned char ch;	
		cin>>ch;
		if(ch=='#')
		break;
		if(!check(ch)){
			Push(S,ch);
		}else{
			unsigned char x,y;
			Pop(S,x);
			Pop(S,y);
			unsigned char t;
			t=Operate(x,ch,y);
			Push(S,t);
		}	
	}
	int a=GetTop(S)-'0';
		cout<<a<<" ";
	return 0;
}

#include<bits/stdc++.h>//第三问
using namespace std;
typedef long long ll;
const ll inf = 0x3f3f3f3f;
const int MAXQSIZE =10;
typedef struct{
	int *base;
	int front;
	int rear;
}SqQueue;

typedef struct StackNode{
	int data;
	struct StackNode *next;
}StackNode,*LinkStack;

int InitQueue(SqQueue &Q){
	Q.base=new int[MAXQSIZE];
	if(!Q.base) exit(OVERFLOW);
	Q.front=Q.rear=0;
	return 1; 
} 

int QueueLength(SqQueue Q){
	return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}
int EnQueue(SqQueue &Q,int e){//插入元素e为Q的新的队尾元素 
	if((Q.rear+1)%MAXQSIZE==Q.front)
	return 0;
	Q.base [Q.rear]=e;
	Q.rear=(Q.rear+1)%MAXQSIZE;
	return 1;
}
int DeQueue(SqQueue &Q,int &e){//删除Q的队头元素,用e返回其值 
	if(Q.front==Q.rear) return 0;
	e=Q.base[Q.front];
	Q.front=(Q.front+1)%MAXQSIZE;
	return 1;
}
int GetHead(SqQueue Q){
	if(Q.front!=Q.rear)
	return Q.base[Q.front];
}

int InitStack(LinkStack &S){
	S=NULL;
	return 1;
}
int Push(LinkStack &S,int e){
	LinkStack p =new StackNode;
	p->data=e;
	p->next=S;
	S=p;
	return 1;
}
int Pop(LinkStack &S,int &e){
	if(S==NULL) return 0;
	e=S->data;
	LinkStack p=S;
	S=S->next;
	delete p;
	return 1;
}
int GetTop(LinkStack S){
	if(S!=NULL)
	return S->data;
}

int main(){
	LinkStack S;
	InitStack(S);
	int n;
	printf("输入数据项数\n");
	cin>>n;
	int qq=n;
	printf("输入数据\n");
	while(n--){
		int x;
		cin>>x;
		Push(S,x);
	}
	SqQueue que;
	InitQueue(que);
	printf("输入要删除的数字\n");
	int ss;
	cin>>ss;
	for(int i=0;i<qq;i++){
		if(GetTop(S)==ss){
			int y;
			Pop(S,y);
		}else{
			int ww; 
			Pop(S,ww);
			EnQueue(que,ww); 
		}
	}
	int yy=0;
	while(DeQueue(que,yy)){
		printf("%d ",yy);
	}
	return 0;
}
  • 11
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值