数据结构编程

  • 格式:doc
  • 大小:176.00 KB
  • 文档页数:35

数据结构1.八皇后问题#include<stdio.h>#define NUM 8int a[NUM+1];void main(){int i,k,flag,not_finish=1,count=0;i=1;a[1]=1;printf("The possible configuration of 8 queens are:\n");while(not_finish){while(not_finish&&i<=NUM){for(flag=1,k=1;flag&&k<i;k++)if(a[k]==a[i])flag=0;for(k=1;flag&&k<i;k++)if((a[i]==a[k]-(k-i))||(a[i]==a[k]+(k-i))) flag=0;if(!flag){if(a[i]==a[i-1]){i--;if(i>1&&a[i]==NUM)a[i]=1;else if(i==1&&a[i]==NUM)not_finish=0;else a[i]++;}else if(a[i]==NUM) a[i]=1;else a[i]++;}else if(++i<=NUM)if(a[i-1]==NUM) a[i]=1;else a[i]=a[i-1]+1;}if(not_finish){++count;printf((count-1)%3?" [%2d]: ":" \n[%2d]: ",count);for(k=1;k<=NUM;k++)printf(" %d",a[k]);if(a[NUM-1]<NUM) a[NUM-1]++;else a[NUM-1]=1;i=NUM-1;}}}2.k阶斐波那契序列,要求满足fn ≤max而fn+1 >max 。

(循环队列的容量仅为k或k+1)#include <stdio.h>#define QL 10typedef struct queue{int data[QL];int f,r;}queue,Q;void feibo(Q &q,int max){int mul=0;q.f=q.r=0;q.data[q.r]=1;q.r++;q.data[q.r]=1;while(q.data[q.r]<max){q.r++;if(q.r%QL==q.f){if(q.r==QL){mul++;q.r=q.f;}if(q.f!=QL-1)q.f++;elseq.f=0;}if(q.r>=2){q.data[q.r]=q.data[q.r-1]+q.data[q.r-2];}else{if(q.r==0)q.data[q.r]=q.data[QL+q.r-1]+q.data[QL+q.r-2];elseq.data[q.r]=q.data[q.r-1]+q.data[QL+q.r-2];}}printf("%d\n",mul);printf("n=%d\n",QL*mul+q.r-1);if(q.r>=1)printf("f(n)=%d\n",q.data[q.r-1]);elseprintf("f(n)=%d\n",q.data[QL+q.r-1]);}void main(){Q qq;int n;printf("请输入max值:");scanf("%d",&n);feibo(qq,n);}运行结果:例如:请输入max值:50n=8f(n)= 343.约瑟夫环:编号为1,2,3,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。

一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止。

报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一人开始重新从1报数,如此下去,直到所有人全部出列为止。

编程打印出列顺序。

#include<iostream.h>typedef struct strt{int num,pwd;//num为号码,pwd为密码struct strt *next;}*psp,sp;int main(){int m,n,i,j;psp head,rear,pt,pt2,p;head=new sp;rear=head;cout<<"n:";//输入人数cin>>n;cout<<"m:";//输入初始密码cin>>m;pt=head;for(i=1;i<n;i++){pt2=new sp;pt->next=pt2;pt=pt2;rear=pt2;}rear->next=head;pt=head;for(i=1;i<=n;i++){cin>>j;pt->pwd=j;pt->num=i;pt=pt->next;}pt2=pt=rear;for(j=1;j<=n;j++){for(i=1;i<=m;i++){pt2=pt;pt=pt->next;}p=pt2->next;cout<<"num:"<<p->num<<"pwd:"<<p->pwd<<endl; m=p->pwd;pt2->next=p->next;delete(p);pt=pt2;}return 0;//程序结束}程序结果n:4m:21231num:2 pwd:2num:4 pwd:1num:1 pwd:1num:3 pwd:34.按先序扩展序列建立二叉树5. 先序、中序、后序遍历的递归算法#include <stdlib.h>#include <stdio.h>#define STACK_INIT_SIZE 50#define STACKINCREMENT 10#define OK 1#define ERROR 0#define OVERFLOW 0typedef int Status;typedef char TElemType;typedef struct s_BiTNode{TElemType data;struct s_BiTNode *lchild,*rchild;} BiTNode, *BiTree;Status CreateBiTree(BiTree *T);Status InOrderTraverse(BiTree T,Status (*Fun) (TElemType e));Status PostOrderTraverse(BiTree T,Status (*Fun) (TElemType e));Status Visit(TElemType e);void main(){BiTree Tr=NULL;printf("下面以'根左右'的先序扩展顺序构造二叉树:\n");printf("\n请输入二叉树元素,(/表示空) ");if(CreateBiTree(&Tr))printf("构造二叉树成功!\n");elseprintf("构造二叉树失败!\n");printf("\n中序遍历序列为: ");InOrderTraverse(Tr,Visit);printf("\n后序遍历序列为: ");PostOrderTraverse(Tr,Visit);printf("\n");getch();}Status CreateBiTree(BiTree *Tree){TElemType ch;scanf("%c",&ch);if(ch == '/')(*Tree) = NULL;else{if(!((*Tree) = (BiTree)malloc(sizeof(BiTNode))))exit(OVERFLOW);(*Tree)->data = ch;CreateBiTree(&((*Tree)->lchild));CreateBiTree(&((*Tree)->rchild));}return (OK);}Status InOrderTraverse(BiTree T,Status (*Fun) (TElemType e)) {if(T){if(InOrderTraverse(T->lchild,Fun))if(Visit(T->data))if(InOrderTraverse(T->rchild,Fun))return OK;return ERROR;}elsereturn OK;}/*InOrderTraverse*/Status PostOrderTraverse(BiTree T,Status (*Fun) (TElemType e)) {{if(PostOrderTraverse(T->lchild,Fun))if(PostOrderTraverse(T->rchild,Fun)){Visit(T->data);return OK;}return ERROR;}elsereturn OK;}Status Visit(TElemType e){printf("%c",e);return OK;}程序结果:下面以'根左右'的先序扩展顺序构造二叉树:请输入二叉树元素,(/表示空)ABDG///EH//IK///C/F/J/构造二叉树成功!中序遍历序列为:GDBHEKIACFJ后序遍历序列为:GDHKIEBJFCA6.中序遍历的非递归算法7.先序遍历的非递归算法#include <stdio.h>#include <stdlib.h>#define STACKINITSIZE 100#define STACKINCREMENT 10#include<stdio.h>#include<stdlib.h>#include<malloc.h>typedef struct BiTNode{char data;BiTNode *lchild,*rchild;}* BiTree;typedef struct {BiTree *base;BiTree *top;int stacksize,k;int CreateBiTree(BiTree &T){char ch=' ';scanf("%c",&ch);if(ch==' ')T=NULL;else{if(!(T=(BiTree)malloc(sizeof(BiTree))))return 0;T->data=ch;CreateBiTree(T->lchild);CreateBiTree(T->rchild);}return 1;}void InitStack(SqStack &S){S.base=(BiTree *)malloc(STACKINITSIZE*sizeof(BiTree));//if(!S.base)return 0;S.top=S.base;S.stacksize=STACKINITSIZE;//return 1;}int StackEmpty(SqStack S){if(S.top==S.base)return 0;return 1;}void Push(SqStack &S,BiTree e){if(S.top-S.base>=S.stacksize){S.base=(BiTree *)realloc(S.base,(STACKINITSIZE+STACKINCREMENT)*sizeof (BiTree));//if(!S.base)return 0;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*(S.top)=e;S.top++;}int Pop(SqStack &S,BiTree *e){if(S.top==S.base)return 0;S.top--;*e=*S.top;return 1;}int GetTop(SqStack s,BiTree e){if(s.top==s.base)return 0;e=*(s.top--);return 1;}//*******************void PreOrderTraverser(BiTree T){//非递归先序遍历二叉树SqStack s;InitStack(s);BiTree p;p=T;while(p||StackEmpty(s)){if(p){printf("%c",p->data);Push(s,p);p=p->lchild;}else{Pop(s,&p);p=p->rchild;}}}void InOrderTraverse(BiTree T){//非递归中序遍历二叉树SqStack s;InitStack(s);BiTree p;p=T;while(p||StackEmpty(s)){if(p){Push(s,p);p=p->lchild;}else{Pop(s,&p);printf("%c",(*p).data);p=p->rchild;}}}void main(){BiTree T;printf("输入二叉树的先序扩展序列");CreateBiTree(T);printf("\n非递归中序遍历二叉树:");InOrderTraverse(T);printf("\n非递归先序遍列二叉树:");PreOrderTraverser(T);printf("\n");}运行结果:输入二叉树的先序扩展序列:ABDGEHIKCFJ非递归中序遍历二叉树:GDBHEKIACFJ非递归先序遍列二叉树:ABDGEHIKCFJ8.后序遍历的非递归算法#define STACKINITSIZE 100#define STACKINCREMENT 10#include<stdio.h>#include<stdlib.h>#include<malloc.h>typedef struct BiTNode{char data;BiTNode *lchild,*rchild;}* BiTree;typedef struct {BiTree *base;BiTree *top;int *ibase;int mark;int stacksize;}SqStack;int CreateBiTree(BiTree &T){char ch=' ';scanf("%c",&ch);if(ch==' ')T=NULL;else{if(!(T=(BiTree)malloc(sizeof(BiTree))))return 0;T->data=ch;CreateBiTree(T->lchild);CreateBiTree(T->rchild);}return 1;}void InitStack(SqStack &S){S.base=(BiTree *)malloc(STACKINITSIZE*sizeof(BiTree));S.ibase=(int *)malloc(STACKINITSIZE*sizeof(int));//if(!S.base)return 0;S.top=S.base;S.mark=0;S.stacksize=STACKINITSIZE;//return 1;}int StackEmpty(SqStack S){if(S.top==S.base)return 1;return 0;}void Push(SqStack &S,BiTree e,int i){if(S.top-S.base>=S.stacksize){S.base=(BiTree *)realloc(S.base,(STACKINITSIZE+STACKINCREMENT)*sizeof(BiTree));//if(!S.base)return 0;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*(S.top)=e;S.ibase[S.mark]=i;S.mark++;S.top++;}int Pop(SqStack &S,BiTree *e,int &i){if(S.top==S.base)return 0;S.top--;*e=*S.top;S.mark--;i=S.ibase[S.mark];return 1;}void PostOrderTraverser(BiTree T){SqStack s;int i=0;InitStack(s);BiTree p;p=T;Push(s,p,0);while(!StackEmpty(s)){Pop(s,&p,i);switch(i){case 0:Push(s,p,1);if(p->lchild)Push(s,p->lchild,0);break;case 1:Push(s,p,2);if(p->rchild)Push(s,p->rchild,0);break;case 2:printf("%c",p->data);}}}void main(){BiTree T;printf("输入结点的先序扩展序列:");CreateBiTree(T);printf("\n非递归后序遍历为:");PostOrderTraverser(T);printf("\n");}运行结果:输入结点的先序扩展序列: ABDGEHIKCFJ非递归后序遍历为:GDHKIEBJFCA9.层次的非递归算法#include<stdio.h>#include<stdlib.h>typedef struct BiTNode{char data;BiTNode *lchild,*rchild;}* BiTree;void CreateBiTree(BiTree &T){//printf("按先序次序输入结点的值,并以$作为结束符号");char ch=' ';scanf("%c",&ch);if(ch==' ')T=NULL;else{if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))printf("cuo");T->data=ch;CreateBiTree(T->lchild);CreateBiTree(T->rchild);}}void visit(BiTree T){//按先序序列访问二叉树,并打印出它的扩展序列;if(T)printf("%c",T->data);else printf("树是空树");if(T->lchild)visit(T->lchild);else printf(" ");if(T->rchild)visit(T->rchild);else printf(" ");}typedef struct QNode{BiTree data;QNode *next;}QNode,*QueuePtr;//**********typedef struct{QueuePtr front;QueuePtr rear;}LinkQueue;void InitQueue(LinkQueue &Q){Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));Q.front->next=NULL;}void DestroyQueue(LinkQueue &Q){while(Q.front){Q.rear=Q.front->next;free(Q.front);Q.front=Q.rear;}}void EnQueue(LinkQueue &Q,BiTree e){QNode *p;p=(QueuePtr)malloc(sizeof(QNode));p->data=e;p->next=NULL;Q.rear->next=p;Q.rear=p;}int DeQueue(LinkQueue &Q){if(Q.front==Q.rear)return 0;QNode *p;p=Q.front->next;//e=*p->data;Q.front->next=p->next;if(Q.rear==p)Q.rear=Q.front;return 1;}void CengTraverser(BiTree T){LinkQueue Lq;InitQueue(Lq);BiTree p=NULL;p=T;EnQueue(Lq,p);p=Lq.rear->data;while(p){printf("%c",p->data);if(p->lchild){EnQueue(Lq,p->lchild);}if(p->rchild){EnQueue(Lq,p->rchild);}DeQueue(Lq);if(Lq.front!=Lq.rear)p=Lq.front->next->data;else p=NULL;}}void main(){BiTree T;printf("输入二叉树的先序扩展序列");CreateBiTree(T);printf("二叉树的层次遍历为:");CengTraverser(T);printf("\n");}10.求二叉树的深度(后序遍历)#include<stdio.h>#include<stdlib.h>typedef struct BiTNode{char data;BiTNode *lchild,*rchild;//左右孩子指针}* BiTree;int CreateBiTree(BiTree &T){scanf("%c",&ch);if(ch==' ')T=NULL;else{if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))return 0;T->data=ch;CreateBiTree(T->lchild);CreateBiTree(T->rchild);}return 1;}//后序遍历的递归算法int deep(BiTree T){//按后序遍历,并打印出它的后序序列;if(T){return (deep(T->lchild)>deep(T->rchild)?deep(T->lchild):deep(T->rchild))+1;}else return 0;}void main(){BiTree T;printf("\n输入二叉树的先序扩展序列:");CreateBiTree(T);printf("\n二叉树的深度为:");printf("%d",deep(T));printf("\n");}11.求树的深度#include<stdio.h>#include<stdlib.h>#include<malloc.h>typedef struct CSNode{char data;CSNode *firstchild,*nextsibling;}CSNode,*CSTree;int CreateCSTree(CSTree &T){char ch=' ';scanf("%c",&ch);if(ch==' ')T=NULL;else{if(!(T=(CSNode *)malloc(sizeof(CSNode))))return 0;T->data=ch;CreateCSTree(T->firstchild);CreateCSTree(T->nextsibling);}return 1;}int deep(CSTree T){//按后序遍历求树的深度;if(T){return (deep(T->firstchild)+1)>deep(T->nextsibling)?(deep(T->firstchild)+1):deep(T->nextsibling);}else return 0;}void main(){CSTree T;printf("\n按照先序遍历扩展序列输入树终结点的值:");CreateCSTree(T);printf("\n树的深度为:");printf("%d",deep(T));printf("\n");}12.编写DFS算法的非递归函数。