Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
278 changes: 255 additions & 23 deletions BIGHOMEWORKS/1/第一次作业参考答案.md
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
### ��һ���
### 第一题答案
```c++
#include "LinKList.h"
bool Intersect_Arr(SqList &La,SqList Lb) //��˳���ʵ��
bool Intersect_Arr(SqList &La,SqList Lb) //用顺序表实现
{
ElemType temp;
while(!ListEmpty_Sq(La)) //La����Ԫ����δ��δ������
while(!ListEmpty_Sq(La)) //La表的元素尚未处未处理完
{
GetElem_Sq(La,0,temp); //��La��ɾ����һ������Ԫ�ظ�ֵ��temp
if(LocateElem_Sq(Lb,temp)==-1) //��Lb�в�����ֵ��temp��ȵ�����Ԫ��
ListDelete_Sq(La,0,e); //����������La�����һ������Ԫ��֮��
GetElem_Sq(La,0,temp); //从La中删除第一个数据元素赋值给temp
if(LocateElem_Sq(Lb,temp)==-1) //若Lb中不存在值和temp相等的数据元素
ListDelete_Sq(La,0,e); //则将它插入在La中最后一个数据元素之后
}
DestroyList_Sq(Lb); //�������Ա�
DestroyList_Sq(Lb); //撤销线性表
}

bool Intersect_L(LinkList &La,LinkList Lb){ //������ʵ��
bool Intersect_L(LinkList &La,LinkList Lb){ //用链表实现
ElemType temp;
LinkList p,q;
p=La->next;
Expand All @@ -32,8 +32,8 @@ bool Intersect_L(LinkList &La,LinkList Lb){ //
```


### �ڶ���𰸣�
- ������㷨˼���ǣ����ҵ����������ı�βָ�룬����һ�������ı�βָ����ڶ���������ͷ���������������ʹ֮��Ϊѭ���ġ�ʵ�ֱ��⹦�ܵĺ�������:
### 第二题答案:
- 本题的算法思想是:先找到两个链表的表尾指针,将第一个链表的表尾指针域第二个链表的头结点链接起来,再使之成为循环的。实现本题功能的函数如下:
```c++
#include "LinkList.h"

Expand All @@ -47,11 +47,11 @@ void link(LinkList La, LinkList Lb)
}
```

### ������𰸣�
- ����������ͷ�������ͬ���ַ�����Ϊ�����ġ������硰abba���͡�abcba���ǻ��ģ�����abcde���͡�ababab�����ǻ��ġ��ٱȽ����Ա�����ջ�Ͷ��еȷ�ʽ��
- 1.�������ַ�ʽʵ�ֻ��ĵ��жϺ��ʣ�
- 2.��д���㷨�б�����һ���ԡ�@��Ϊ���������ַ������Ƿ��ǻ��ġ�
- ����Ȼ���ö�ջ�Ͷ��н�ϵķ�ʽʵ�ֺ���
### 第三题答案:
- 假设称正读和反读都相同的字符序列为“回文”,例如“abba”和“abcba”是回文,而“abcde”和“ababab”则不是回文。①比较线性表、堆栈和队列等方式,
- 1.解释哪种方式实现回文的判断合适?
- 2.试写出算法判别读入的一个以“@”为结束符的字符序列是否是回文。
- 答:显然是用堆栈和队列结合的方式实现合适
```c++
#include "SqQueue.h"
#include "SqStack.h"
Expand All @@ -72,27 +72,27 @@ bool IsHuiWen(char *str)
{
if(DeQueue_Sq(Q,x)&&Pop_Sq(S,y)&&x!=y)
{
cout<<str<<"���ǻ��ģ�"<<endl;
cout<<str<<"不是回文!"<<endl;
return false;
}
}
if(!QueueEmpty_Sq(Q)||!StackEmpty_Sq(S))
{
cout<<str<<"���ǻ��ģ�"<<endl;
cout<<str<<"不是回文!"<<endl;
return false;
}
else
{
cout<<str<<"�ǻ��ģ�"<<endl;
cout<<str<<"是回文!"<<endl;
return true;
}
}
```

������𰸣�
- ��֪Q��һ��������ͷ���ģ��ǿն��У�S��һ��������ͷ���ģ���ջ
- ��д�㷨ʵ�֣�������Q�е�����Ԫ�����á�Ҫ�󣺵���ͷ�ļ���������ʵ�֡�
- ��Ԫ�����γ����У�������ջ�������ջ�������˶���
第四题答案:
- 已知Q是一个(不带头结点的)非空队列,S是一个(不带头结点的)空栈
- 编写算法实现:将队列Q中的所有元素逆置。要求:调用头文件操作函数实现。
- 答:元素依次出队列,依次入栈,逆序出栈,依次人队列
```c++
#include "SqQueue.h"
#include "SqStack.h"
Expand All @@ -110,4 +110,236 @@ void Inverse(SqQueue &Q, SqQueue &S){
}
}
```
������𰸣�
第五题答案:
```
typedef struct
{
ElemType *queue;
int front;
int rear;
int Count;
int queuesize;
int incrementsize;
} SqQueue;

//初始化操作
void InitQueue_Sq(SqQueue &Q,int maxsize=QUENU_INIT_SIZE,int incresize=QUENUINCREMENT)
{
Q.queue=(ElemType*)malloc(maxsize*sizeof(ElemType));
if(!Q.queue)
exit(1);
Q.front=Q.rear=Q.Count=0;
Q.queuesize=maxsize;
Q.incrementsize=incresize;
}

//求队列的长度
int QueueLength_Sq(SqQueue Q)
{
return (Q.rear-Q.front+Q.queuesize)%Q.queuesize;
}

//进队操作
bool EnQueue_Sq(SqQueue &Q,ElemType e)
{
//cout<<"未满";
//从队尾插入元素,成功则返回true
if(Q.Count==Q.queuesize) //队满给顺序队列增补空间
{
cout<<"队满";
Q.queue=(ElemType*)realloc(Q.queue,(Q.queuesize+Q.incrementsize)*sizeof(ElemType));
if(!Q.queue)
return false;
if(Q.front>=Q.rear) //队首指针在队尾指针后面,重新确定位置
{
for(int i=Q.queuesize; i>=Q.front; i--)
{
Q.queue[i+Q.incrementsize]=Q.queue[i];
}
Q.front+=Q.incrementsize;
}
Q.queuesize+=Q.incrementsize;
}
Q.queue[Q.rear]=e;
Q.rear=(Q.rear+1)%Q.queuesize;
Q.Count++;
return true;
}

//出队操作
bool DeQueue_Sq(SqQueue &Q,ElemType &e)
{
if(Q.Count==0)
{
return false;
}
e=Q.queue[Q.front];
Q.front=(Q.front+1)%Q.queuesize;
Q.Count--;
return true;
}
```
第六题:
```
typedef struct{
short x;
short y;
}ElemType;
#include "SqStack.h"

void TraveseMap(int map[][10]){
int i,j;
for(i=0;i<10;i++){
for(j=0;j<10;j++){
if(map[i][j]==0){
cout<<"##";
}else if(map[i][j]==1){
cout<<" ";
}else if(map[i][j]==3){
cout<<" ";
}else if(map[i][j]==4){
cout<<"〇";
}
}
cout<<endl;
}

}

int look_around(int map[][10],ElemType &e){
//·µ»Ø0±íʾÎÞ·¿É×ߣ¬1±íʾÕÒµ½Â·
if(map[e.x-1][e.y]==1){
e.x=e.x-1;
return 1;
}else if(map[e.x+1][e.y]==1){
e.x=e.x+1;
return 1;
}else if(map[e.x][e.y-1]==1){
e.y=e.y-1;
return 1;
}else if(map[e.x][e.y+1]==1){
e.y=e.y+1;
return 1;
}else {
return 0;
}

}

void findroad(int map[][10],ElemType start,ElemType end){
SqStack mystack;
InitStack_Sq(mystack);
ElemType temp=start;
map[start.x][start.y]=3;
Push_Sq(mystack,temp);
int counts=1;
while(true){
//cout<<counts++<<endl;
int result=look_around(map,temp);
if(result==1){
if(temp.x==end.x&&temp.y==end.y){
Push_Sq(mystack,end);
break;
}
map[temp.x][temp.y]=3;
Push_Sq(mystack,temp);
}else if(result==0){
Pop_Sq(mystack,temp);
GetTop_Sq(mystack,temp);
}
//TraveseMap(map);
}

while(!StackEmpty_Sq(mystack)){
Pop_Sq(mystack,temp);
map[temp.x][temp.y]=4;
}
}


int main()
{
int Map[10][10] =
{ {0,0,0,0,0,0,0,0,0,0}, //0ÐÐ
{0,1,1,0,1,1,1,0,1,0}, //1ÐÐ
{0,1,1,0,1,1,1,0,1,0}, //2ÐÐ
{0,1,1,1,1,0,0,1,1,0}, //3ÐÐ
{0,1,0,0,0,1,1,1,1,0}, //4ÐÐ
{0,1,1,1,0,1,1,1,1,0}, //5ÐÐ
{0,1,0,1,1,1,0,1,1,0}, //6ÐÐ
{0,1,0,0,0,1,0,0,1,0}, //7ÐÐ
{0,0,1,1,1,1,1,1,1,0}, //8ÐÐ
{0,0,0,0,0,0,0,0,0,0} //9 ÐÐ
};
ElemType start={1,1};
ElemType end={8,8};
findroad(Map,start,end);
TraveseMap(Map);
return 0;
}
```
第七题
```
void wait_in_line(SqQueue &Q){
cout<<"请输入病历号";
ElemType i;
cin>>i;
EnQueue_Sq(Q,i);
}

void see_a_doctor(SqQueue &Q){
ElemType e;
DeQueue_Sq(Q,e);
cout<<e<<"号病人就诊"<<endl;;
}

void see_queue(SqQueue &Q){
for(int i=Q.front;i!=Q.rear;i=(i+Q.queuesize+1)%Q.queuesize){
cout<<setw(5)<<Q.queue[i];
}
cout<<endl;
}

void exit_line(SqQueue &Q){
while(!QueueEmpty_Sq(Q)){
ElemType e;
DeQueue_Sq(Q,e);
cout<<setw(5)<<e;
}
cout<<endl;
exit(0);
}

void get_off_work(){
exit(0);
}

int main()
{
SqQueue myqueue;
InitQueue_Sq(myqueue);
bool working=true;
while(working){
cout<<"\n**********************************************************"<<endl;
cout<<"* 欢迎来到黑诊所\n";
cout<<"* 1、排队"<<endl;
cout<<"* 2、就诊"<<endl;
cout<<"* 3、查看排队"<<endl;
cout<<"* 4、不再排队"<<endl;
cout<<"* 5、下班"<<endl;
cout<<"* 请选择操作"<<endl;
int iOperator;
cin>>iOperator;
switch(iOperator){
case 1:wait_in_line(myqueue);break;
case 2:see_a_doctor(myqueue);break;
case 3:see_queue(myqueue);break;
case 4:exit_line(myqueue);break;
case 5:get_off_work();break;
default:cout<<"错误";break;
}
}
return 0;
}
```

Loading