数据结构实验(六)

liqueue

#include <stdio.h>
#include <malloc.h>
typedef char ElemType;
typedef struct DataNode
{	
	ElemType data;
	struct DataNode *next;
} DataNode;				
typedef struct
{	
	DataNode *front;
	DataNode *rear;
} LinkQuNode;			
void InitQueue(LinkQuNode *&q)	
{	
	q=(LinkQuNode *)malloc(sizeof(LinkQuNode));
	q->front=q->rear=NULL;
}
void DestroyQueue(LinkQuNode *&q)	
{
	DataNode *p=q->front,*r;
	if (p!=NULL)			
	{	r=p->next;
		while (r!=NULL)
		{	free(p);
			p=r;r=p->next;
		}
	}
	free(p);
	free(q);				
}
bool QueueEmpty(LinkQuNode *q)	
{
	return(q->rear==NULL);
}
void enQueue(LinkQuNode *&q,ElemType e)	
{	DataNode *p;
	p=(DataNode *)malloc(sizeof(DataNode));
	p->data=e;
	p->next=NULL;
	if (q->rear==NULL)		
		q->front=q->rear=p;
	else
	{	q->rear->next=p;	
		q->rear=p;
	}
}
bool deQueue(LinkQuNode *&q,ElemType &e)	
{	DataNode *t;
	if (q->rear==NULL)		
		return false;
	t=q->front;				
	if (q->front==q->rear)  
		q->front=q->rear=NULL;
	else					
		q->front=q->front->next;
	e=t->data;
	free(t);
	return true;
}

exp3-4

#include "liqueue.cpp"		

int main()
{
	ElemType e;
	LinkQuNode *q;
	printf("链队的基本运算如下:\n");
	printf("  (1)初始化链队”q\n");
	InitQueue(q);
	printf("  (2)依次进链队元素a,b,c\n");
	enQueue(q,'a');
	enQueue(q,'b');
	enQueue(q,'c');
	printf("  (3)链队为%s\n",(QueueEmpty(q)?"空":"非空"));
	if (deQueue(q,e)==0) 
		printf("\t提示:对空,不能出队\n");
	else
		printf("  (4)出队一个元素%c\n",e);
	printf("  (5)依次进链队元素d,e,f\n");
	enQueue(q,'d');
	enQueue(q,'e');
	enQueue(q,'f');
	printf("  (6)出链队序列");
	while (!QueueEmpty(q))
	{	deQueue(q,e);
		printf("%c ",e);
	}
	printf("\n");
	printf("  (7)释放链队\n");
	DestroyQueue(q);
	return 1;
}

exp3-5

#include <stdio.h>
#define M 4					
#define N 4					
#define MaxSize 100			
int mg[M+2][N+2]={			
{1,1,1,1,1,1},
{1,0,0,0,1,1},
{1,0,1,0,0,1},
{1,0,0,0,1,1},
{1,1,0,0,0,1},
{1,1,1,1,1,1}
};
struct 
{
	int i,j;
	int di;
} St[MaxSize],Path[MaxSize];	
int top=-1;						
int count=1;					
int minlen=MaxSize;				
void dispapath()				
{
	int k;
	printf("%5d: ",count++);	
	for (k=0;k<=top;k++)
		printf("(%d,%d) ",St[k].i,St[k].j);
	printf("\n");
	if (top+1<minlen)			
	{
		for (k=0;k<=top;k++)	
			Path[k]=St[k];
		minlen=top+1;			
	}
}
void dispminpath()				
{
	printf("最短路径如下:\n");
	printf("长度: %d\n",minlen);
	printf("路径: ");
	for (int k=0;k<minlen;k++)
		printf("(%d,%d) ",Path[k].i,Path[k].j);
	printf("\n");
}
void mgpath(int xi,int yi,int xe,int ye) 
{
	int i,j,i1,j1,di;
	bool find;
	top++;							
	St[top].i=xi;
	St[top].j=yi;
	St[top].di=-1;mg[xi][yi]=-1;	
	while (top>-1)					
	{
		i=St[top].i;j=St[top].j;di=St[top].di;
		if (i==xe && j==ye)			
		{
			dispapath();			
			mg[i][j]=0;				
			top--;					
			i=St[top].i;j=St[top].j;
			di=St[top].di;			
		}
		find=false;					
		while (di<4 && !find)	
		{	di++;
			switch(di)
			{
			case 0:i1=i-1; j1=j;   break;
			case 1:i1=i;   j1=j+1; break;
			case 2:i1=i+1; j1=j;   break;
			case 3:i1=i,   j1=j-1; break;
			}
			if (mg[i1][j1]==0) find=true;
		}
		if (find)					
		{	St[top].di=di;			
			top++;St[top].i=i1;St[top].j=j1;
			St[top].di=-1;			
			mg[i1][j1]=-1;			
		}
		else						
		{
			mg[i][j]=0;				
			top--;
		}
	}
	dispminpath();					
}
int main()
{
	printf("迷宫所有路径如下:\n");
	mgpath(1,1,M,N);
	return 1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值