数据结构作业

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。



实验五:二叉树的应用
#include
#include
#include
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree &T){
char ch;
ch=getchar();
if(ch==' ')
{
T=NULL;
}
else{
if(!(T=(BiTNode *)malloc(sizeof(BiTNode)))) exit(0);
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void PreOrder(BiTree root){
if(root==NULL) return;
printf("%c",root->data);
PreOrder(root->lchild);
PreOrder(root->rchild);
}
void InOrder(BiTree root){
if(root==NULL) return;
InOrder(root->lchild);
printf("%c",root->data);
InOrder(root->rchild);
}
void PostOrder(BiTree root){
if(root==NULL) return;
PostOrder(root->lchild);
PostOrder(root->rchild);
printf("%c",root->data);
}
void main(){
BiTree T;
cout<<"请输入一个二叉树:"<CreateBiTree(T);
cout<cout<<"前序输出这个二叉树为:"<PreOrder(T);
cout<cout<<"中序输出这个二叉树为:"<InOrder(T);
cout<cout<<"后序输出这个二叉树为:"<PostOrder(T);
cout<}


实验六:图的遍历与应用
#include
#define INFINITY 32767
#define MAX_VEX 20 //最大顶点个数
#define QUEUE_SIZE (MAX_VEX+1) //队列长度
using namespace std;
bool *visited; //访问标志数组
//图的邻接矩阵存储结构
typedef struct
{
char *vexs; //顶点向量
int arcs[MAX_VEX][MAX_VEX]; //邻接矩阵
int vexnum,arcnum; //图的当前顶点数和弧数
}Graph;
//队列类
class Queue{
public:
void InitQueue(){
base=(int *)malloc(QUEUE_SIZE*sizeof(int));
front=rear=0;
}
void EnQueue(int e)
{
base[rear]=e;
rear=(rear+1)%QUEUE_SIZE;
}
void DeQueue(int &e)
{
e=base[front];
front=(front+1)%QUEUE_SIZE;
}
public:
int *base;
int front;
int rear;
};
//图G中查找元素c的位置
int Locate(Graph G,char c)
{
for(int i=0;iif(G.vexs[i]==c) return i;
return -1;
}
//创建无向网
void CreateUDN(Graph &G){
int i,j,w,s1,s2;
char a,b,temp;
printf("输入顶点数和弧数:");
scanf("%d%d",&G.vexnum,&G.arcnum);
temp=getchar(); //接收回车
G.vexs=(char *)malloc(G.vexnum*sizeof(char)); //分配顶点数目
printf("输入%d个顶点.\n",G.vexnum);
for(i=0;iprintf("输入顶点%d:",i);
scanf("%c",&G.vexs[i]);
temp=getchar(); //接收回车
}
for(i=0;ifor(j=0;jG.arcs[i][j]=INFINITY;
printf("输入%d条弧.\n",G.arcnum);
for(i=0;iprintf("输入弧%d:",i);
scanf("%c %c %d",&a,&b,&w); //输入一条边依附的顶点和权值
temp=getchar(); //接收回车
s1=Locate(G,a);
s2=Locate(G,b);
G.arcs[s1][s2]=G.arcs[s2][s1]=w;
}
}
//

图G中顶点k的第一个邻接顶点
int FirstVex(Graph G,int k){
if(k>=0 && kfor(int i=0;iif(G.arcs[k][i]!=INFINITY) return i;
}
return -1;
}
//图G中顶点i的第j个邻接顶点的下一个邻接顶点
int NextVex(Graph G,int i,int j){
if(i>=0 && i=0 && jfor(int k=j+1;kif(G.arcs[i][k]!=INFINITY) return k;
}
return -1;
}
//深度优先遍历
void DFS(Graph G,int k){
int i;
if(k==-1){ //第一次执行DFS时,k为-1
for(i=0;iif(!visited[i]) DFS(G,i); //对尚未访问的顶点调用DFS
}
else{
visited[k]=true;
printf("%c ",G.vexs[k]); //访问第k个顶点
for(i=FirstVex(G,k);i>=0;i=NextVex(G,k,i))
if(!visited[i]) DFS(G,i); //对k的尚未访问的邻接顶点i递归调用DFS
}
}
//广度优先遍历
void BFS(Graph G){
int k;
Queue Q; //辅助队列Q
Q.InitQueue();
for(int i=0;iif(!visited[i]){ //i尚未访问
visited[i]=true;
printf("%c ",G.vexs[i]);
Q.EnQueue(i); //i入列
while(Q.front!=Q.rear){
Q.DeQueue(k); //队头元素出列并置为k
for(int w=FirstVex(G,k);w>=0;w=NextVex(G,k,w))
if(!visited[w]){ //w为k的尚未访问的邻接顶点
visited[w]=true;
printf("%c ",G.vexs[w]);
Q.EnQueue(w);
}
}
}
}

//主函数
void main(){
int i;
Graph G;
CreateUDN(G);
visited=(bool *)malloc(G.vexnum*sizeof(bool));
printf("\n广度优先遍历: ");
for(i=0;ivisited[i]=false;
DFS(G,-1);
printf("\n深度优先遍历: ");
for(i=0;ivisited[i]=false;
BFS(G);
printf("\n程序结束.\n");
}
实验七:查找技术
顺序查找:
#include

#include

#define MAXSIZE 10

typedef struct{

int *elem;

int length;

}SqList;

main()

{SqList ST;

int i,x,y;

int LocateElem_Sq(SqList L,int e);

printf("请输入顺序表的长度");

scanf("%d",&ST.length);

ST.elem=(int*)malloc(sizeof(int)*ST.length);

for(i=0;i<=ST.length-1;i++)

{ST.elem[i]=rand()%100;

printf("%d ",ST.elem[i]);

}

printf("请输入你要查找的数");

scanf("%d",&x);

y=LocateElem_Sq(ST,x);

printf("%d",y);

}

int LocateElem_Sq(SqList L,int e)

{int i,*p;

i=1;

p=L.elem;

while(i<=L.length && *p++!=e) ++i;

if(i<=L.length)return i;

else return 0;



}
折半查找:
#include"stdio.h"
#define GETDATANUM 15 //输入数据个数
void main()
{
int nData_a[GETDATANUM] = {0};
int nTgtData = 0;
int nLowIndex = 0;
int nUpIndex = GETDATANUM;
int nNowIndex = (nLowIndex + nUpIndex)/2;
int bFlag = 0;
int i = 0;
printf("Please input %d data:\n",GETDATANUM);
for( i = 0; i < GETDATANUM; i++ )
{
scanf("%d", &nData_a[i]);
}
printf("Please input target data:\n");
scanf("%d", &nTgtData);
do {
nNowIndex = (nLowIndex + nU

pIndex)/2;
if( nTgtData == nData_a[nNowIndex] )
{
bFlag = 1;
break;
}
else if( nTgtData > nData_a[nNowIndex])
{
nLowIndex = nNowIndex;
}
else if( nTgtData < nData_a[nNowIndex])
{
nUpIndex = nNowIndex;
}
}
while(nNowIndex > 0 && nNowIndex < (GETDATANUM-1));
if(bFlag)
{
printf("The target data index is %d\n", nNowIndex+1);
}
else
{
printf("The target data isn't finded\n");
}
}


实验八:内部排序
冒泡排序:
#include
int main()
{
int a[10],i,j,p;
printf("输入10个数:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);

for( i = 0 ; i < 9; i ++ )
for( j = 0 ; j < 9 - i ; j ++ )
{
if(a[j] > a[j+1] )
{
p = a[j+1] ;
a[j+1] = a[j] ;
a[j] = p ;
}
}
for(i=0;i<10;i++)
printf("%-5d",a[i]);
printf("\n") ;
return 0 ;
}
直接插入排序:
#include
#include

void insert(int *arr, int a, int n)
{
int i;
int key = a;

for(i=0; i{
if(key < arr[i]){
int j;
for(j=n-1; j>=i; j--)
{
arr[j+1] = arr[j];
}
arr[i] = key;
return;
}
}

arr[n] = key;
return;
}

void sort(int *arr, int size){
if(size<2)
return;
int i;
for(i=1; iinsert(arr, arr[i], i);
}
}

void main(){
int i, n, *arr;

printf("请输入数组的大小 n = ");
scanf("%d", &n);

arr = (int*)malloc(sizeof(int)*n);

printf("请输入%d个数组元素:\n", n);
for(i=0; iscanf("%d", &arr[i]);
}

printf("在排序前,数组为:");
for(i=0; iprintf("%d ", arr[i]);
}

printf("\n调用排序函数中...\n");
sort(arr, n);

printf("在排序后,数组变为:");
for(i=0; iprintf("%d ", arr[i]);
}
printf("\n");
free(arr);
}简单选择排序:
#include

void sort(int a[],int n)
{
int i,j,k,t;
for(i=0;i{k=i;
for(j=i+1;jif(a[k]>a[j]) k=j;
if(k!=i)
{t=a[i];
a[i]=a[k];
a[k]=t;
}
}
}
main()
{
int a[10],i;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
sort(a,10);
printf("排好序的数组是:\n");
for(i=0;i<10;i++)
printf("%d ",&a[i]);
printf("\n");
}
快速排序:#include
void sort(int a[],int s,int t)
{
int temp;
int i=s,j=t;
if(stemp=a[s];
while(i!=j)
{

while(i!=j&&a[j]>temp) j--;
if(i!=j) a[i]=a[j],i++;
while(i!=j&&a[i]if(i!=j) a[j]=a[i],j--;
}
a[i]=temp;
sort(a,s,i-1);
sort(a,i+1,t);
}
}
void main(){
int n,a[100],i;
scanf("%d",&n);
for(i=0;iscanf("%d",&a[i]);
sort(a,0,n-1);
for(i=0;iprintf("%d ",a[i]); printf("\n");
}


相关文档
最新文档