第一次
实验日期: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;
}