数据结构考试题

1、已知线性表A,B,C 是递增有序的线性表。要求对A 表作如下运算:删去那些既在B 表 中出现又在C 表中出现的元素。A,B,C 以顺序表存储。

#include

#include

#define maxsize 100

typedef int datatype;

typedef struct

{

int createlist(seqlist *L)

{

}

seqlist same(seqlist *A, seqlist *B)

{

}

seqlist delet(seqlist *A, seqlist *B)

{

int i,j,k; for(i=0;ilength;i++) for(j=0;jlength;j++) if(A->data[i]==B->data[j]) seqlist C; int i,j,k=0; for(i=0;ilength;i++) for(j=0;jlength;j++) if(A->data[i]==B->data[j]) { } C.data[k]=A->data[i]; k++; int i; printf("please input the length of the list: "); scanf("%d",&L->length); printf("please input a list of number!\n"); for(i=0;ilength;i++) scanf("%d",&L->data[i]); return 0; datatype data[maxsize]; int length; }seqlist; C.length=k; return C;

}

} for(k=i;klength-1;k++) A->data[k]=A->data[k+1]; A->length--; return *A;

void dsip(seqlist *L)

{

}

int main()

{

} seqlist A,B,C; createlist(&A); createlist(&B); createlist(&C); printf("before:\n"); dsip(&A); C=same(&B,&C); A=delet(&A,&C); printf("after:\n"); dsip(&A); return 0; int i; for(i=0;ilength;i++) printf("%d ",L->data[i]); printf("\n");

2、已知线性表A,B,C 是递增有序的线性表。要求对A 表作如下运算:线性表A 中出现的元素,在线性表B 中也出现,则将A 中该元素删除。A ,B 以顺序表存储。

#include

#include

#define maxsize 100

typedef int datatype;

typedef struct

{

int createlist(seqlist *L)

{ datatype data[maxsize]; int length; }seqlist;

}

printf("please input the length of the list: "); scanf("%d",&L->length); printf("please input a list of number!\n"); for(i=0;ilength;i++) scanf("%d",&L->data[i]); return 0;

seqlist delet(seqlist *A, seqlist *B)

{

}

void dsip(seqlist *L)

{

}

int main()

{

} seqlist A,B; createlist(&A); createlist(&B); A=delet(&A,&B); printf("删除后:"); dsip(&A); return 0; int i; for(i=0;ilength;i++) printf("%d ",L->data[i]); printf("\n"); int i,j,k; for(i=0;ilength;i++) for(j=0;jlength;j++) if(A->data[i]==B->data[j]) { } for(k=i;klength-1;k++) A->data[k]=A->data[k+1]; A->length--; return *A;

3、顺序表A 和顺序表B 的元素都是非递减排列,利用线性表的基本运算,将它们合并成一个顺序表C ,要求C 也是非递减排列。A ,B 表的值可以自行设计。

#include

#include

#define ListSize 100

#define OVERFLOW -1

#define ERROR 0

#define OK 1

#define DataType int

typedef int status;

typedef struct

{

DataType *list;

int listSize;

int length;

}SeqList;

int InitList(SeqList *L)

{

(*L).list=(DataType *) malloc(ListSize*sizeof(DataType));

if (!(*L).list)

exit(OVERFLOW);

(*L).length=0;

(*L).listSize=ListSize;

return OK; //线性表的初始化

}

void mergelist(SeqList la,SeqList lb,SeqList lc)

{

int *pa,*pb,*pc,*pa_last,*pb_last; int i; pa=la.list; lc.listSize=la.length+lb.length; pc=lc.list=(DataType *)malloc(lc.listSize*sizeof(DataType)); if(!lc.list) exit(0); pa_last=la.list+la.length-1; pb_last=lb.list+lb.length-1; while(pa

} printf("%d ",lc.list[i]); printf("\n");

int main()

{

} mergelist(la,lb,lc); return 0; } SeqList la,lb,lc; int i; la.length=0; lb.length=0; if(InitList(&la)) { } if(InitList(&lb)) { printf("输入顺序表lb:\n"); { } scanf("%d",&lb.list[i]); lb.length++; for(i=0;i

4、已知线性表La 和Lb 的元素按值非递减排列。归并La 和Lb 得到新的线性表Lc ,Lc 的元素也按值非递减排列。采用链式结构来实现。La 、Lb 表的值可以自行设计。

#include

#include

typedef int ElemType; // 定义ElemType 为整型

typedef struct LNode

{

ElemType data; struct LNode *next;

}LNode,*LinkList;

void CreateList(LinkList &L,int n)

{ // 正位序(结点插在表尾) 输入n 个元素的值,建立带表头结点的单链线性表L

int i;

LinkList p,q;

L=(LinkList)malloc(sizeof(LNode)); // 生成头结点

L->next=NULL; // 先建立一个带头结点的空单链表

q=L; // q指向空表的头结点(相当于尾结点)

printf("请输入%d个数据\n",n);

for(i=1;i

{

p=(LinkList)malloc(sizeof(LNode)); // 生成新结点 scanf("%d",&p->data); // 给新结点输入元素值 q->next=p; // 将新结点插在表尾 q=q->next; // q指向尾结点

}

p->next=NULL; // 最后一个结点的指针域为空

}

void MergeList(LinkList La,LinkList &Lb,LinkList &Lc) // 算法2.12

{ // 已知单链线性表La 和Lb 的元素按值非递减排列。

// 归并La 和Lb 得到新的单链线性表Lc ,Lc 的元素也按值非递减排列。(销毁Lb ,Lc 即新的La)

while(pa&&pb) // La和Lb 中的元素都未比较完

if(pa->datadata) // La的当前元素不大于Lb 的当前元素

{

}

else // Lb的当前元素小于La 的当前元素

{

}

pc->next=pa?pa:pb; // 插入剩余段

}

free(Lb); //释放Lb 的头结点 Lb=NULL; // Lb不再指向任何结点 pc->next=pb; // pb所指结点归并到Lc 中 pc=pb; // pc指向表Lc 的最后一个结点 pb=pb->next; // 表Lb 的下一个结点成为待比较结点 pc->next=pa; // 将pa 所指结点归并到Lc 中 pc=pa; // pc指向表Lc 的最后一个结点 pa=pa->next; // 表La 的下一个结点成为待比较结点 LinkList pa=La->next,pb=Lb->next,pc; // pa、pb 分别指向La 、Lb 的首元结点(待比较结点) Lc=pc=La; // 用La 的头结点作为Lc 的头结点,pc 指向La 的头结点(Lc的尾结点)

void Printf_L(LinkList&L)

{

}

void main()

{

}

int n=5; LinkList La,Lb,Lc; printf("按非递减顺序,"); CreateList(La,n); // 根据输入顺序,正位序建立线性表 printf("按非递减顺序,"); CreateList(Lb,n); // 根据输入顺序,逆位序建立线性表 printf("La="); Printf_L(La); // 输出链表La 的内容 printf("Lb="); Printf_L(Lb); // 输出链表Lb 的内容 MergeList(La,Lb,Lc); // 按非递减顺序归并La 和Lb ,得到新表Lc printf("Lc="); Printf_L(Lc); // 输出链表Lc 的内容 LNode*p; p=L->next; while(p!=NULL) { } printf("\n"); printf("%d ",p->data); p=p->next;

6、编写一个程序,实现双链表的各种基本运算(双链表的元素类型为char ),并在此基础上设计一个程序,完成如下功能:

(1)初始化双链表h ;

(2)采用尾插法依次插入元素a ,b ,c ,d ,e ;

(3)删除h 的第3个元素;

#include "stdio.h"

#include "malloc.h"

typedef char ElemType;

typedef struct DNode //定义双链表结点类型

{

ElemType data; struct DNode *prior; //指向前驱结点 struct DNode *next; //指向后继结点

} DLinkList;

/*初始化双链表*/

void InitList(DLinkList *&L)

{

}

/*向双链表L 的第i 个位置插入数据e*/

int ListInsert(DLinkList *&L,int i,ElemType e)

{

}

/*释放双链表*/

void DestroyList(DLinkList *&L)

{

DLinkList *p=L, *q=p->next; { } free(p); p=q; q=q->next; while(q!=NULL) int j=0; DLinkList *p=L,*s; while(jdata=e; s->next=p->next; if(p->next!=NULL) p->next->prior=s; s->prior=p; p->next=s; return 1; return 0; j++; p=p->next; L=(DLinkList *)malloc(sizeof(DLinkList)); L->prior=L->next=NULL;

free(p);

}

/*从双链表L 的第i 个位置删除数据e*/

int ListDelete(DLinkList *&L,int i,ElemType &e)

{

}

/*打印双链表*/

void DispList(DLinkList *L)

{

DLinkList *p=L->next;

while(p!=NULL)

{

printf("%c",p->data);

p=p->next;

}

printf("\n");

}

void main()

{

DLinkList *h; ElemType e; int j=0; DLinkList *p=L,*q; while(jnext; if(q==NULL) return 0; e=q->data; p->next=q->next; if(p->next!=NULL) p->next->prior=p; free(q); return 1; return 0; j++; p=p->next;

} printf("双链表的基本运算如下:\n"); printf(" (1)初始化双链表h\n"); InitList(h); printf(" (2)依次采用尾插法插入a,b,c,d,e 元素\n"); ListInsert(h,1,'a'); ListInsert(h,2,'b'); ListInsert(h,3,'c'); ListInsert(h,4,'d'); ListInsert(h,5,'e'); printf(" (3)输出双链表h:"); DispList(h); printf(" (4)删除h 的第3个元素\n"); ListDelete(h,3,e); printf(" (5)输出双链表h:"); DispList(h); printf(" (6)释放双链表h\n"); DestroyList(h);

7、利用堆栈实现进制转换,如10进制到8进制的转换(1348)10 = (2504) 8 #include

#include

#include

#define STACK_INIT_SIZE 100 // 存储空间的初始分配量

#define STACKINCREMENT 10 //存储空间分配增量

struct SqStack

{

int *base;

int *top;

int stacksize; //当前已分配的存储空间

};

/*构造一个空栈*/

void InitStack(struct SqStack *S)

{

S->base = (int *)malloc(STACK_INIT_SIZE * sizeof (int));

if(!(S->base)) //存储分配失败

{

exit(0);

printf("内存分配错误!\n");

}

S->top = S->base ;

S->stacksize = STACKINCREMENT ;

}

/*入栈*/

void Push(struct SqStack *S, int e)

{

if(S->top - S->base >= S->stacksize) //栈满溢出

{

S->base = (int *)realloc(S->base,(STACKINCREMENT+STACK_INIT_SIZE)* sizeof (int));

//重新分配存储空间

if(!(S->base))

{

exit(0);

printf("存储失败\n");

}

S->top = S->base + S->stacksize ;

S->stacksize = S->stacksize + STACKINCREMENT ;

}

* (S->top++) = e;

}

/*出栈*/

int Pop(struct SqStack *S, int e)

{

if(S->top == S->base) //空栈

printf("此栈为空栈\n");

e = *( -- S->top);

return(e);

}

/*判断栈是否为空*/

int StackEmpty(struct SqStack *S)

{

if(S->top == S->base)

return 1;

else

return 0;

}

/*主函数*/

int main(int argc, char *argv[])

{

int n = 0;

int e = 1;

struct SqStack *Change;

Change = (struct SqStack *)malloc(sizeof(struct SqStack));

InitStack(Change);

printf("Please input the Primitive num (十进制数):");

scanf("%d",&n);

while(n)

{

Push(Change , n%8 );

n = n/8;

}

printf("The result is ( 八 进 制 数 ) : ");

while(!StackEmpty(Change))

{

e = Pop(Change,e);

printf("%d",e);

}

printf("\n");

if(e/8 == 0 )

printf("此栈已经为空了\n");

system("PAUSE");

return 0;

}

8、实现链栈的基本操作,然后利用堆栈将一个线性表中的元素按逆序重新存放。例如原来的顺序为 12,8,6,4,2,要求改为 2,4,6,8,12。

#include

#include

#include

#define STACK_INIT_SIZE 10 /* 存储空间初始分配量 */

#define STACKINCREMENT 2 /* 存储空间分配增量 */

#define OK 1

#define ERROR 0

typedef int Status;

typedef int SElemType;

#define ListSize 100

typedef int DataType;

typedef struct

{

typedef struct SqStack

{

SElemType *base;/* 在栈构造之前和销毁之后,base 的值为NULL */ SElemType *top; /* 栈顶指针 */ int stacksize; /* 当前已分配的存储空间,以元素为单位 */ DataType list[ListSize]; int length; }SeqList;/*顺序表*/

}SqStack; /* 顺序栈 */

/*初始化顺序表*/

SeqList InitList()

{

int i;

DataType value[]={12,8,6,4,2};

SeqList L;

L.length=0;

for(i=0;i

{

L.list[i] = value[i];

L.length++;

}

return L;

}

/*顺序表输出函数*/

void displayList(SeqList *sq)

{

int index;

if(sq->length==0) return;

for(index=0;indexlength;index++)

{

printf("%4d",sq->list[index]);

}

}

Status InitStack(SqStack &S)

{ /* 构造一个空栈 S */

}

Status DestroyStack(SqStack &S)

{ /* 销毁栈 S ,S 不再存在 */

free(S.base); S.base=NULL; S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base) exit(-1); /* 存储分配失败 */ S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; printf("\n");

}

S.stacksize=0; return OK;

Status Push(SqStack &S,SElemType e)

{ /* 插入元素 e 为新的栈顶元素 */

}

Status StackEmpty(SqStack S)

{ /* 若栈 S 为空栈,则返回 TRUE ,否则返回 FALSE */

} if(S.top==S.base) return OK; else return ERROR; if(S.top-S.base>=S.stacksize) /* 栈满,追加存储空间 */ { S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!S.base) exit(-1); /* 存储分配失败 */ S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } *(S.top)++=e; return OK;

Status Pop(SqStack &S,SElemType &e)

{ /* 若栈不空,则删除 S 的栈顶元素,用 e 返回其值,并返回 OK ;否则返回 ERROR */

}

void reverse(SqStack &S,SeqList &L)

{

SElemType e; DataType f; int i=0; while(!StackEmpty(S)) /* 当栈不空 */ { Pop(S,e); //f=e;/* 弹出栈顶元素且赋值给 e */ if(S.top==S.base) return ERROR; e=*--S.top; return OK;

}

} int main()

{

} Push(S,12); Push(S,8); Push(S,6); Push(S,4); Push(S,2); reverse(S,L); printf("利用堆栈反序线性表后:"); displayList(&L); DestroyStack(S); return 0; SqStack S; InitStack(S); SeqList L; L = InitList(); printf("初始线性表L 元素为:"); displayList(&L);

9、实现链队的各种基本运算,依次进队元素a ,b ,c ;然后出队一个元素,并输出该元素;输出链队的元素个数;

#include

#include

#include

typedef char ElemType;

typedef struct qnode

{

ElemType data;

struct qnode *next;

}QNode;

typedef struct

{

QNode *front;

QNode *rear;

}LiQueue;

//初始化队列

void InitQueue(LiQueue *&q)

{

q=(LiQueue *)malloc(sizeof(LiQueue));

q->front=q->rear=NULL;

}

//销毁队列

void DestroyQueue(LiQueue *&q)

{

QNode *p=q->front,*r;

if(p!=NULL)

{

r=p->next;

}

free(p);

free(q);

}

//进队列

void enQueue(LiQueue *&q,ElemType e)

{

QNode *p;

p=(QNode *)malloc(sizeof(QNode));

p->data=e;

p->next=NULL;

if(q->rear==NULL)

q->front=q->rear=p;

else

{

q->rear->next=p;

}

}

//出队列

bool deQueue(LiQueue *&q,ElemType &e)

{

QNode *t;

if(q->rear==NULL)

return false;

t=q->front;

if(q->front==q->rear) q->rear=p; while(r!=NULL) { free(p); p=r;r=p->next; }

q->front=q->rear=NULL;

else

q->front=q->front->next;

e=t->data;

free(t);

return true;

}

int QueueLength(LiQueue *q) //输出链队的元素个数

{

}

void main()

{

ElemType e;

LiQueue *q;

printf("链队的各种基本运算如下:\n");

printf("(1)初始化链队q");

InitQueue(q);

printf("\n");

printf("(3)依次进队元素a ,b ,c ;");

enQueue(q,'a');

enQueue(q,'b');

enQueue(q,'c');

printf("\n");

printf("(4)出队一个元素,并输出该元素:");

deQueue(q,e);

printf("%c",e);

printf("\n");

printf("(5)输出链队q 的元素个数:");

printf("%d\n",QueueLength(q));

printf("\n");

printf("(9)释放链队");

DestroyQueue(q);

printf("\n");

} int n=0; QNode *p=q->front; while(p!=NULL) { } return(n); n++; p=p->next;

10、若 x 和 y 是两个采用顺序结构存储的串,编写一个比较两个串是否相等的函数。 提示:两个串相等表示对应的字符必须都相同,所以扫描两串,逐一比较相应位置的字符,若相同继续比较直到全部比较完毕,如果都相同则表示两串相等,否则表示两串不相等。 #include

#include

#include

#define OK 1

#define ERROR 0

#define TRUE 1

#define FALSE 0

#define MAXSIZE 40 /* 存储空间初始分配量 */

typedef int Status; /* Status是函数的类型, 其值是函数结果状态代码,如OK 等 */

typedef char String[MAXSIZE+1]; /* 0号单元存放串的长度 */

/* 输出字符串T */ void StrPrint(String T) { /* 生成一个其值等于chars 的串T */ Status StrAssign(String T,char *chars) { int i; if(strlen(chars)>MAXSIZE) return ERROR; else { T[0]=strlen(chars); for(i=1;iT, 则返回值>0;若S=T, 则返回值=0;若S

int i;

for(i=1;i

if(S[i]!=T[i])

return S[i]-T[i];

return S[0]-T[0];

}

int main() { int i; String x,y; printf("(1)生成串x:"); StrAssign(x,"i take a test"); StrPrint(x); printf("(2)生成串y:"); StrAssign(x,"i get good grage"); StrPrint(x); printf("(3)比较串x 和串y:\n"); i=StrCompare(x,y); char s; if(i '; printf("串x%c串y\n",s); }

11、实现顺序串的基本运算,并在此基础上设计一个程序,完成如下功能:

建立串s=“abcdefghefghijklmn ”和串s1=“xyz ”,将串s 的第2个字符开始的5个字符替换成串s1而产生串s2。

#include

#include

#include

#define OK 1

#define ERROR 0

#define TRUE 1

#define FALSE 0

#define MAXSIZE 40 /* 存储空间初始分配量 */

typedef int Status; /* Status是函数的类型, 其值是函数结果状态代码,如OK 等 */

typedef char String[MAXSIZE+1]; /* 0号单元存放串的长度 */

/* 输出字符串T */ void StrPrint(String T) { /* 生成一个其值等于chars 的串T */ Status StrAssign(String T,char *chars) { int i; if(strlen(chars)>MAXSIZE) return ERROR; else { T[0]=strlen(chars); for(i=1;iT, 则返回值>0;若S=T, 则返回值=0;若S

int i;

for(i=1;i

return S[i]-T[i]; return S[0]-T[0];

}

int main() { int i; String x,y; char s; StrAssign(x,"i take a test"); StrPrint(x); printf("(1)生成串x:");

printf("(2)生成串y:"); StrAssign(x,"i get good grage"); StrPrint(x); printf("(3)比较串x 和串y:\n"); i=StrCompare(x,y); if(i '; printf("串x%c串y\n",s); }

13、二叉树采用链接存储结构,试设计一个按层次顺序(同一层次自左至右)遍历二叉树的算法。

提示:算法要采用一个队列 q,先将二叉树根结点入队列,然后退队列,输出该结点,若它有左子树,便将左子树根结点入队列,若它有右子树,便将右子树根结点入队列,如此直到队列空为止。

#include

#include

#include

#include

#define Max 20 //结点的最大个数

typedef struct node{

char data;

struct node *lchild,*rchild;

}BinTNode; //自定义二叉树的结点类型

typedef BinTNode *BinTree; //定义二叉树的指针

int NodeNum,leaf; //NodeNum为结点数,leaf 为叶子数

//==========基于先序遍历算法创建二叉树==============

//=====要求输入先序序列,其中加入虚结点"#"以示空指针的位置==========

BinTree CreatBinTree(void)

{

BinTree T;

char ch;

if((ch=getchar())=='#')

return(NULL); //读入#,返回空指针 T=(BinTNode *)malloc(sizeof(BinTNode)); //生成结点 T->data=ch; T->rchild=CreatBinTree(); //构造右子树 T->lchild=CreatBinTree(); //构造左子树 return(T); else{

}

}

//====利用" 先进先出" (FIFO )队列,按层次遍历二叉树==========

void Levelorder(BinTree T)

{

int front=0,rear=1;

BinTNode *cq[Max],*p; //定义结点的指针数组cq

cq[1]=T; //根入队

while(front!=rear)

{

}

//==========主函数=================

void main()

{

BinTree root;

int i;

/printf("\n");

printf("Creat Bin_Tree; Input preorder:"); //输入完全二叉树的先序序列,

//用#代表虚结点,如ABD###CE##F## root=CreatBinTree(); //创建二叉树,返回根结点

}

14、编写程序,输出相应图的DFS 结果。

} front=(front+1)%NodeNum; p=cq[front]; //出队 printf("%c",p->data); //出队,输出结点的值 if(p->lchild!=NULL){ cq[rear]=p->lchild; //左子树入队 } if(p->rchild!=NULL){ cq[rear]=p->rchild; //右子树入队 rear=(rear+1)%NodeNum; rear=(rear+1)%NodeNum; } printf("LevePrint Bin_Tree:"); Levelorder(root); //按层次遍历

#include"stdio.h"

#include"stdlib.h"

#define MaxVertexNum 100 //定义最大顶点数

typedef struct{

char vexs[MaxVertexNum]; //顶点表

int edges[MaxVertexNum][MaxVertexNum]; //邻接矩阵,可看作边表

int n,e; //图中的顶点数n 和边数e

}MGraph; //用邻接矩阵表示的图的类型

//=========建立邻接矩阵=======

void CreatMGraph(MGraph *G)

{

int i,j,k;

char a;

printf("Input VertexNum(n) and EdgesNum(e): ");

scanf("%d,%d",&G->n,&G->e); //输入顶点数和边数

scanf("%c",&a);

printf("Input Vertex string:");

for(i=0;in;i++)

{

scanf("%c",&a); G->vexs[i]=a; //读入顶点信息,建立顶点表

}

for(i=0;in;i++)

for(j=0;jn;j++) G->edges[i][j]=0; //初始化邻接矩阵

printf("Input edges,Creat Adjacency Matrix\n");

for(k=0;ke;k++) { //读入e 条边,建立邻接矩阵

}

//=========定义标志向量,为全局变量=======

typedef enum{FALSE,TRUE} Boolean;

Boolean visited[MaxVertexNum];

//========DFS:深度优先遍历的递归算法======

void DFSM(MGraph *G,int i)

{ //以Vi 为出发点对邻接矩阵表示的图G 进行DFS 搜索,邻接矩阵是0,1矩阵 int j;

printf("%c",G->vexs[i]); //访问顶点Vi

visited[i]=TRUE; //置已访问标志

for(j=0;jn;j++) //依次搜索Vi 的邻接点

}

void DFS(MGraph *G) if(G->edges[i][j]==1 && ! visited[j]) DFSM(G,j); //(Vi ,Vj )∈E ,且Vj 未访问过,故Vj 为新出发点 scanf("%d%d",&i,&j); //输入边(Vi ,Vj )的顶点序号 G->edges[i][j]=1; G->edges[j][i]=1; //若为无向图,矩阵为对称矩阵;若建立有向图,去掉该条语句 }

int i;

for(i=0;in;i++)

}

//==========main=====

void main()

{

int i;

MGraph *G;

G=(MGraph *)malloc(sizeof(MGraph)); //为图G 申请内存空间

CreatMGraph(G); //建立邻接矩阵

printf("Print Graph DFS: ");

DFS(G); //深度优先遍历

printf("\n");

}

15、编写程序,输出相应图的BFS 结果。

visited[i]=FALSE; //标志向量初始化 if(!visited[i]) //Vi未访问过 DFSM(G,i); //以Vi 为源点开始DFS 搜索 for(i=0;in;i++)

#include"stdio.h"

#include"stdlib.h"

#define MaxVertexNum 100 //定义最大顶点数

typedef struct{

char vexs[MaxVertexNum]; //顶点表

int edges[MaxVertexNum][MaxVertexNum]; //邻接矩阵,可看作边表

int n,e; //图中的顶点数n 和边数e

}MGraph; //用邻接矩阵表示的图的类型

//=========建立邻接矩阵=======

void CreatMGraph(MGraph *G)

{

int i,j,k;

char a;

printf("Input VertexNum(n) and EdgesNum(e): ");

scanf("%d,%d",&G->n,&G->e); //输入顶点数和边数

scanf("%c",&a);

printf("Input Vertex string:");

for(i=0;in;i++)

{

G->vexs[i]=a; //读入顶点信息,建立顶点表

}

for(i=0;in;i++)

for(j=0;jn;j++) G->edges[i][j]=0; //初始化邻接矩阵

printf("Input edges,Creat Adjacency Matrix\n");

for(k=0;ke;k++) { //读入e 条边,建立邻接矩阵

}

//=========定义标志向量,为全局变量=======

typedef enum{FALSE,TRUE} Boolean;

Boolean visited[MaxVertexNum];

//===========BFS:广度优先遍历=======

void BFS(MGraph *G,int k)

{ //以Vk 为源点对用邻接矩阵表示的图G 进行广度优先搜索 int i,j,f=0,r=0;

int cq[MaxVertexNum]; //定义队列

for(i=0;in;i++)

visited[i]=FALSE; //标志向量初始化 for(i=0;in;i++) cq[i]=-1; //队列初始化

printf("%c",G->vexs[k]); //访问源点Vk

visited[k]=TRUE;

cq[r]=k; //Vk已访问,将其入队。注意,实际上是将其序号入队 while(cq[f]!=-1) { //队非空则执行

}

//==========main=====

void main()

{

int i;

MGraph *G;

G=(MGraph *)malloc(sizeof(MGraph)); //为图G 申请内存空间

CreatMGraph(G); //建立邻接矩阵 i=cq[f]; f=f+1; //Vf出队 for(j=0;jn;j++) //依次Vi 的邻接点Vj if(G->edges[i][j]==1 && !visited[j]) { //Vj未访问 printf("%c",G->vexs[j]); //访问Vj visited[j]=TRUE; r=r+1; cq[r]=j; //访问过Vj 入队 scanf("%d%d",&i,&j); //输入边(Vi ,Vj )的顶点序号 G->edges[i][j]=1; G->edges[j][i]=1; //若为无向图,矩阵为对称矩阵;若建立有向图,去掉该条语句 } } }

printf("Print Graph BFS: ");

BFS(G,4); //以序号为3的顶点开始广度优先遍历

printf("\n");

}

16、编写程序,输出该树的前序遍历序列

#include

#include

#include

#include

#define Max 20 //结点的最大个数

typedef struct node{

char data;

struct node *lchild,*rchild;

}BinTNode; //自定义二叉树的结点类型

typedef BinTNode *BinTree; //定义二叉树的指针

int NodeNum,leaf; //NodeNum为结点数,leaf 为叶子数

//==========基于先序遍历算法创建二叉树==============

//=====要求输入先序序列,其中加入虚结点"#"以示空指针的位置========== BinTree CreatBinTree(void)

{

BinTree T;

char ch;

if((ch=getchar())=='#')

}

//========NLR 先序遍历=============

void Preorder(BinTree T)

{

if(T) { return(NULL); //读入#,返回空指针 T=(BinTNode *)malloc(sizeof(BinTNode)); //生成结点 T->data=ch; T->rchild=CreatBinTree(); //构造右子树 T->lchild=CreatBinTree(); //构造左子树 return(T); else{ }

printf("%c",T->data); //访问结点

Preorder(T->lchild); //先序遍历左子树

Preorder(T->rchild); //先序遍历右子树

}

}

//==========主函数=================

void main()

{

BinTree root;

int i;

printf("Creat Bin_Tree; Input preorder:"); //输入完全二叉树的先序序列, // 用#代表虚结点,如ABD###CE##F## root=CreatBinTree(); //创建二叉树,返回根结点 式,输入序号。

printf("\t1: Preorder Traversal\n");

printf("Print Bin_tree Preorder: ");

Preorder(root); //先序遍历

printf("\n");

}

//从菜单中选择遍历方

1、已知线性表A,B,C 是递增有序的线性表。要求对A 表作如下运算:删去那些既在B 表 中出现又在C 表中出现的元素。A,B,C 以顺序表存储。

#include

#include

#define maxsize 100

typedef int datatype;

typedef struct

{

int createlist(seqlist *L)

{

}

seqlist same(seqlist *A, seqlist *B)

{

}

seqlist delet(seqlist *A, seqlist *B)

{

int i,j,k; for(i=0;ilength;i++) for(j=0;jlength;j++) if(A->data[i]==B->data[j]) seqlist C; int i,j,k=0; for(i=0;ilength;i++) for(j=0;jlength;j++) if(A->data[i]==B->data[j]) { } C.data[k]=A->data[i]; k++; int i; printf("please input the length of the list: "); scanf("%d",&L->length); printf("please input a list of number!\n"); for(i=0;ilength;i++) scanf("%d",&L->data[i]); return 0; datatype data[maxsize]; int length; }seqlist; C.length=k; return C;

}

} for(k=i;klength-1;k++) A->data[k]=A->data[k+1]; A->length--; return *A;

void dsip(seqlist *L)

{

}

int main()

{

} seqlist A,B,C; createlist(&A); createlist(&B); createlist(&C); printf("before:\n"); dsip(&A); C=same(&B,&C); A=delet(&A,&C); printf("after:\n"); dsip(&A); return 0; int i; for(i=0;ilength;i++) printf("%d ",L->data[i]); printf("\n");

2、已知线性表A,B,C 是递增有序的线性表。要求对A 表作如下运算:线性表A 中出现的元素,在线性表B 中也出现,则将A 中该元素删除。A ,B 以顺序表存储。

#include

#include

#define maxsize 100

typedef int datatype;

typedef struct

{

int createlist(seqlist *L)

{ datatype data[maxsize]; int length; }seqlist;

}

printf("please input the length of the list: "); scanf("%d",&L->length); printf("please input a list of number!\n"); for(i=0;ilength;i++) scanf("%d",&L->data[i]); return 0;

seqlist delet(seqlist *A, seqlist *B)

{

}

void dsip(seqlist *L)

{

}

int main()

{

} seqlist A,B; createlist(&A); createlist(&B); A=delet(&A,&B); printf("删除后:"); dsip(&A); return 0; int i; for(i=0;ilength;i++) printf("%d ",L->data[i]); printf("\n"); int i,j,k; for(i=0;ilength;i++) for(j=0;jlength;j++) if(A->data[i]==B->data[j]) { } for(k=i;klength-1;k++) A->data[k]=A->data[k+1]; A->length--; return *A;

3、顺序表A 和顺序表B 的元素都是非递减排列,利用线性表的基本运算,将它们合并成一个顺序表C ,要求C 也是非递减排列。A ,B 表的值可以自行设计。

#include

#include

#define ListSize 100

#define OVERFLOW -1

#define ERROR 0

#define OK 1

#define DataType int

typedef int status;

typedef struct

{

DataType *list;

int listSize;

int length;

}SeqList;

int InitList(SeqList *L)

{

(*L).list=(DataType *) malloc(ListSize*sizeof(DataType));

if (!(*L).list)

exit(OVERFLOW);

(*L).length=0;

(*L).listSize=ListSize;

return OK; //线性表的初始化

}

void mergelist(SeqList la,SeqList lb,SeqList lc)

{

int *pa,*pb,*pc,*pa_last,*pb_last; int i; pa=la.list; lc.listSize=la.length+lb.length; pc=lc.list=(DataType *)malloc(lc.listSize*sizeof(DataType)); if(!lc.list) exit(0); pa_last=la.list+la.length-1; pb_last=lb.list+lb.length-1; while(pa

} printf("%d ",lc.list[i]); printf("\n");

int main()

{

} mergelist(la,lb,lc); return 0; } SeqList la,lb,lc; int i; la.length=0; lb.length=0; if(InitList(&la)) { } if(InitList(&lb)) { printf("输入顺序表lb:\n"); { } scanf("%d",&lb.list[i]); lb.length++; for(i=0;i

4、已知线性表La 和Lb 的元素按值非递减排列。归并La 和Lb 得到新的线性表Lc ,Lc 的元素也按值非递减排列。采用链式结构来实现。La 、Lb 表的值可以自行设计。

#include

#include

typedef int ElemType; // 定义ElemType 为整型

typedef struct LNode

{

ElemType data; struct LNode *next;

}LNode,*LinkList;

void CreateList(LinkList &L,int n)

{ // 正位序(结点插在表尾) 输入n 个元素的值,建立带表头结点的单链线性表L

int i;

LinkList p,q;

L=(LinkList)malloc(sizeof(LNode)); // 生成头结点

L->next=NULL; // 先建立一个带头结点的空单链表

q=L; // q指向空表的头结点(相当于尾结点)

printf("请输入%d个数据\n",n);

for(i=1;i

{

p=(LinkList)malloc(sizeof(LNode)); // 生成新结点 scanf("%d",&p->data); // 给新结点输入元素值 q->next=p; // 将新结点插在表尾 q=q->next; // q指向尾结点

}

p->next=NULL; // 最后一个结点的指针域为空

}

void MergeList(LinkList La,LinkList &Lb,LinkList &Lc) // 算法2.12

{ // 已知单链线性表La 和Lb 的元素按值非递减排列。

// 归并La 和Lb 得到新的单链线性表Lc ,Lc 的元素也按值非递减排列。(销毁Lb ,Lc 即新的La)

while(pa&&pb) // La和Lb 中的元素都未比较完

if(pa->datadata) // La的当前元素不大于Lb 的当前元素

{

}

else // Lb的当前元素小于La 的当前元素

{

}

pc->next=pa?pa:pb; // 插入剩余段

}

free(Lb); //释放Lb 的头结点 Lb=NULL; // Lb不再指向任何结点 pc->next=pb; // pb所指结点归并到Lc 中 pc=pb; // pc指向表Lc 的最后一个结点 pb=pb->next; // 表Lb 的下一个结点成为待比较结点 pc->next=pa; // 将pa 所指结点归并到Lc 中 pc=pa; // pc指向表Lc 的最后一个结点 pa=pa->next; // 表La 的下一个结点成为待比较结点 LinkList pa=La->next,pb=Lb->next,pc; // pa、pb 分别指向La 、Lb 的首元结点(待比较结点) Lc=pc=La; // 用La 的头结点作为Lc 的头结点,pc 指向La 的头结点(Lc的尾结点)

void Printf_L(LinkList&L)

{

}

void main()

{

}

int n=5; LinkList La,Lb,Lc; printf("按非递减顺序,"); CreateList(La,n); // 根据输入顺序,正位序建立线性表 printf("按非递减顺序,"); CreateList(Lb,n); // 根据输入顺序,逆位序建立线性表 printf("La="); Printf_L(La); // 输出链表La 的内容 printf("Lb="); Printf_L(Lb); // 输出链表Lb 的内容 MergeList(La,Lb,Lc); // 按非递减顺序归并La 和Lb ,得到新表Lc printf("Lc="); Printf_L(Lc); // 输出链表Lc 的内容 LNode*p; p=L->next; while(p!=NULL) { } printf("\n"); printf("%d ",p->data); p=p->next;

6、编写一个程序,实现双链表的各种基本运算(双链表的元素类型为char ),并在此基础上设计一个程序,完成如下功能:

(1)初始化双链表h ;

(2)采用尾插法依次插入元素a ,b ,c ,d ,e ;

(3)删除h 的第3个元素;

#include "stdio.h"

#include "malloc.h"

typedef char ElemType;

typedef struct DNode //定义双链表结点类型

{

ElemType data; struct DNode *prior; //指向前驱结点 struct DNode *next; //指向后继结点

} DLinkList;

/*初始化双链表*/

void InitList(DLinkList *&L)

{

}

/*向双链表L 的第i 个位置插入数据e*/

int ListInsert(DLinkList *&L,int i,ElemType e)

{

}

/*释放双链表*/

void DestroyList(DLinkList *&L)

{

DLinkList *p=L, *q=p->next; { } free(p); p=q; q=q->next; while(q!=NULL) int j=0; DLinkList *p=L,*s; while(jdata=e; s->next=p->next; if(p->next!=NULL) p->next->prior=s; s->prior=p; p->next=s; return 1; return 0; j++; p=p->next; L=(DLinkList *)malloc(sizeof(DLinkList)); L->prior=L->next=NULL;

free(p);

}

/*从双链表L 的第i 个位置删除数据e*/

int ListDelete(DLinkList *&L,int i,ElemType &e)

{

}

/*打印双链表*/

void DispList(DLinkList *L)

{

DLinkList *p=L->next;

while(p!=NULL)

{

printf("%c",p->data);

p=p->next;

}

printf("\n");

}

void main()

{

DLinkList *h; ElemType e; int j=0; DLinkList *p=L,*q; while(jnext; if(q==NULL) return 0; e=q->data; p->next=q->next; if(p->next!=NULL) p->next->prior=p; free(q); return 1; return 0; j++; p=p->next;

} printf("双链表的基本运算如下:\n"); printf(" (1)初始化双链表h\n"); InitList(h); printf(" (2)依次采用尾插法插入a,b,c,d,e 元素\n"); ListInsert(h,1,'a'); ListInsert(h,2,'b'); ListInsert(h,3,'c'); ListInsert(h,4,'d'); ListInsert(h,5,'e'); printf(" (3)输出双链表h:"); DispList(h); printf(" (4)删除h 的第3个元素\n"); ListDelete(h,3,e); printf(" (5)输出双链表h:"); DispList(h); printf(" (6)释放双链表h\n"); DestroyList(h);

7、利用堆栈实现进制转换,如10进制到8进制的转换(1348)10 = (2504) 8 #include

#include

#include

#define STACK_INIT_SIZE 100 // 存储空间的初始分配量

#define STACKINCREMENT 10 //存储空间分配增量

struct SqStack

{

int *base;

int *top;

int stacksize; //当前已分配的存储空间

};

/*构造一个空栈*/

void InitStack(struct SqStack *S)

{

S->base = (int *)malloc(STACK_INIT_SIZE * sizeof (int));

if(!(S->base)) //存储分配失败

{

exit(0);

printf("内存分配错误!\n");

}

S->top = S->base ;

S->stacksize = STACKINCREMENT ;

}

/*入栈*/

void Push(struct SqStack *S, int e)

{

if(S->top - S->base >= S->stacksize) //栈满溢出

{

S->base = (int *)realloc(S->base,(STACKINCREMENT+STACK_INIT_SIZE)* sizeof (int));

//重新分配存储空间

if(!(S->base))

{

exit(0);

printf("存储失败\n");

}

S->top = S->base + S->stacksize ;

S->stacksize = S->stacksize + STACKINCREMENT ;

}

* (S->top++) = e;

}

/*出栈*/

int Pop(struct SqStack *S, int e)

{

if(S->top == S->base) //空栈

printf("此栈为空栈\n");

e = *( -- S->top);

return(e);

}

/*判断栈是否为空*/

int StackEmpty(struct SqStack *S)

{

if(S->top == S->base)

return 1;

else

return 0;

}

/*主函数*/

int main(int argc, char *argv[])

{

int n = 0;

int e = 1;

struct SqStack *Change;

Change = (struct SqStack *)malloc(sizeof(struct SqStack));

InitStack(Change);

printf("Please input the Primitive num (十进制数):");

scanf("%d",&n);

while(n)

{

Push(Change , n%8 );

n = n/8;

}

printf("The result is ( 八 进 制 数 ) : ");

while(!StackEmpty(Change))

{

e = Pop(Change,e);

printf("%d",e);

}

printf("\n");

if(e/8 == 0 )

printf("此栈已经为空了\n");

system("PAUSE");

return 0;

}

8、实现链栈的基本操作,然后利用堆栈将一个线性表中的元素按逆序重新存放。例如原来的顺序为 12,8,6,4,2,要求改为 2,4,6,8,12。

#include

#include

#include

#define STACK_INIT_SIZE 10 /* 存储空间初始分配量 */

#define STACKINCREMENT 2 /* 存储空间分配增量 */

#define OK 1

#define ERROR 0

typedef int Status;

typedef int SElemType;

#define ListSize 100

typedef int DataType;

typedef struct

{

typedef struct SqStack

{

SElemType *base;/* 在栈构造之前和销毁之后,base 的值为NULL */ SElemType *top; /* 栈顶指针 */ int stacksize; /* 当前已分配的存储空间,以元素为单位 */ DataType list[ListSize]; int length; }SeqList;/*顺序表*/

}SqStack; /* 顺序栈 */

/*初始化顺序表*/

SeqList InitList()

{

int i;

DataType value[]={12,8,6,4,2};

SeqList L;

L.length=0;

for(i=0;i

{

L.list[i] = value[i];

L.length++;

}

return L;

}

/*顺序表输出函数*/

void displayList(SeqList *sq)

{

int index;

if(sq->length==0) return;

for(index=0;indexlength;index++)

{

printf("%4d",sq->list[index]);

}

}

Status InitStack(SqStack &S)

{ /* 构造一个空栈 S */

}

Status DestroyStack(SqStack &S)

{ /* 销毁栈 S ,S 不再存在 */

free(S.base); S.base=NULL; S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base) exit(-1); /* 存储分配失败 */ S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; printf("\n");

}

S.stacksize=0; return OK;

Status Push(SqStack &S,SElemType e)

{ /* 插入元素 e 为新的栈顶元素 */

}

Status StackEmpty(SqStack S)

{ /* 若栈 S 为空栈,则返回 TRUE ,否则返回 FALSE */

} if(S.top==S.base) return OK; else return ERROR; if(S.top-S.base>=S.stacksize) /* 栈满,追加存储空间 */ { S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!S.base) exit(-1); /* 存储分配失败 */ S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } *(S.top)++=e; return OK;

Status Pop(SqStack &S,SElemType &e)

{ /* 若栈不空,则删除 S 的栈顶元素,用 e 返回其值,并返回 OK ;否则返回 ERROR */

}

void reverse(SqStack &S,SeqList &L)

{

SElemType e; DataType f; int i=0; while(!StackEmpty(S)) /* 当栈不空 */ { Pop(S,e); //f=e;/* 弹出栈顶元素且赋值给 e */ if(S.top==S.base) return ERROR; e=*--S.top; return OK;

}

} int main()

{

} Push(S,12); Push(S,8); Push(S,6); Push(S,4); Push(S,2); reverse(S,L); printf("利用堆栈反序线性表后:"); displayList(&L); DestroyStack(S); return 0; SqStack S; InitStack(S); SeqList L; L = InitList(); printf("初始线性表L 元素为:"); displayList(&L);

9、实现链队的各种基本运算,依次进队元素a ,b ,c ;然后出队一个元素,并输出该元素;输出链队的元素个数;

#include

#include

#include

typedef char ElemType;

typedef struct qnode

{

ElemType data;

struct qnode *next;

}QNode;

typedef struct

{

QNode *front;

QNode *rear;

}LiQueue;

//初始化队列

void InitQueue(LiQueue *&q)

{

q=(LiQueue *)malloc(sizeof(LiQueue));

q->front=q->rear=NULL;

}

//销毁队列

void DestroyQueue(LiQueue *&q)

{

QNode *p=q->front,*r;

if(p!=NULL)

{

r=p->next;

}

free(p);

free(q);

}

//进队列

void enQueue(LiQueue *&q,ElemType e)

{

QNode *p;

p=(QNode *)malloc(sizeof(QNode));

p->data=e;

p->next=NULL;

if(q->rear==NULL)

q->front=q->rear=p;

else

{

q->rear->next=p;

}

}

//出队列

bool deQueue(LiQueue *&q,ElemType &e)

{

QNode *t;

if(q->rear==NULL)

return false;

t=q->front;

if(q->front==q->rear) q->rear=p; while(r!=NULL) { free(p); p=r;r=p->next; }

q->front=q->rear=NULL;

else

q->front=q->front->next;

e=t->data;

free(t);

return true;

}

int QueueLength(LiQueue *q) //输出链队的元素个数

{

}

void main()

{

ElemType e;

LiQueue *q;

printf("链队的各种基本运算如下:\n");

printf("(1)初始化链队q");

InitQueue(q);

printf("\n");

printf("(3)依次进队元素a ,b ,c ;");

enQueue(q,'a');

enQueue(q,'b');

enQueue(q,'c');

printf("\n");

printf("(4)出队一个元素,并输出该元素:");

deQueue(q,e);

printf("%c",e);

printf("\n");

printf("(5)输出链队q 的元素个数:");

printf("%d\n",QueueLength(q));

printf("\n");

printf("(9)释放链队");

DestroyQueue(q);

printf("\n");

} int n=0; QNode *p=q->front; while(p!=NULL) { } return(n); n++; p=p->next;

10、若 x 和 y 是两个采用顺序结构存储的串,编写一个比较两个串是否相等的函数。 提示:两个串相等表示对应的字符必须都相同,所以扫描两串,逐一比较相应位置的字符,若相同继续比较直到全部比较完毕,如果都相同则表示两串相等,否则表示两串不相等。 #include

#include

#include

#define OK 1

#define ERROR 0

#define TRUE 1

#define FALSE 0

#define MAXSIZE 40 /* 存储空间初始分配量 */

typedef int Status; /* Status是函数的类型, 其值是函数结果状态代码,如OK 等 */

typedef char String[MAXSIZE+1]; /* 0号单元存放串的长度 */

/* 输出字符串T */ void StrPrint(String T) { /* 生成一个其值等于chars 的串T */ Status StrAssign(String T,char *chars) { int i; if(strlen(chars)>MAXSIZE) return ERROR; else { T[0]=strlen(chars); for(i=1;iT, 则返回值>0;若S=T, 则返回值=0;若S

int i;

for(i=1;i

if(S[i]!=T[i])

return S[i]-T[i];

return S[0]-T[0];

}

int main() { int i; String x,y; printf("(1)生成串x:"); StrAssign(x,"i take a test"); StrPrint(x); printf("(2)生成串y:"); StrAssign(x,"i get good grage"); StrPrint(x); printf("(3)比较串x 和串y:\n"); i=StrCompare(x,y); char s; if(i '; printf("串x%c串y\n",s); }

11、实现顺序串的基本运算,并在此基础上设计一个程序,完成如下功能:

建立串s=“abcdefghefghijklmn ”和串s1=“xyz ”,将串s 的第2个字符开始的5个字符替换成串s1而产生串s2。

#include

#include

#include

#define OK 1

#define ERROR 0

#define TRUE 1

#define FALSE 0

#define MAXSIZE 40 /* 存储空间初始分配量 */

typedef int Status; /* Status是函数的类型, 其值是函数结果状态代码,如OK 等 */

typedef char String[MAXSIZE+1]; /* 0号单元存放串的长度 */

/* 输出字符串T */ void StrPrint(String T) { /* 生成一个其值等于chars 的串T */ Status StrAssign(String T,char *chars) { int i; if(strlen(chars)>MAXSIZE) return ERROR; else { T[0]=strlen(chars); for(i=1;iT, 则返回值>0;若S=T, 则返回值=0;若S

int i;

for(i=1;i

return S[i]-T[i]; return S[0]-T[0];

}

int main() { int i; String x,y; char s; StrAssign(x,"i take a test"); StrPrint(x); printf("(1)生成串x:");

printf("(2)生成串y:"); StrAssign(x,"i get good grage"); StrPrint(x); printf("(3)比较串x 和串y:\n"); i=StrCompare(x,y); if(i '; printf("串x%c串y\n",s); }

13、二叉树采用链接存储结构,试设计一个按层次顺序(同一层次自左至右)遍历二叉树的算法。

提示:算法要采用一个队列 q,先将二叉树根结点入队列,然后退队列,输出该结点,若它有左子树,便将左子树根结点入队列,若它有右子树,便将右子树根结点入队列,如此直到队列空为止。

#include

#include

#include

#include

#define Max 20 //结点的最大个数

typedef struct node{

char data;

struct node *lchild,*rchild;

}BinTNode; //自定义二叉树的结点类型

typedef BinTNode *BinTree; //定义二叉树的指针

int NodeNum,leaf; //NodeNum为结点数,leaf 为叶子数

//==========基于先序遍历算法创建二叉树==============

//=====要求输入先序序列,其中加入虚结点"#"以示空指针的位置==========

BinTree CreatBinTree(void)

{

BinTree T;

char ch;

if((ch=getchar())=='#')

return(NULL); //读入#,返回空指针 T=(BinTNode *)malloc(sizeof(BinTNode)); //生成结点 T->data=ch; T->rchild=CreatBinTree(); //构造右子树 T->lchild=CreatBinTree(); //构造左子树 return(T); else{

}

}

//====利用" 先进先出" (FIFO )队列,按层次遍历二叉树==========

void Levelorder(BinTree T)

{

int front=0,rear=1;

BinTNode *cq[Max],*p; //定义结点的指针数组cq

cq[1]=T; //根入队

while(front!=rear)

{

}

//==========主函数=================

void main()

{

BinTree root;

int i;

/printf("\n");

printf("Creat Bin_Tree; Input preorder:"); //输入完全二叉树的先序序列,

//用#代表虚结点,如ABD###CE##F## root=CreatBinTree(); //创建二叉树,返回根结点

}

14、编写程序,输出相应图的DFS 结果。

} front=(front+1)%NodeNum; p=cq[front]; //出队 printf("%c",p->data); //出队,输出结点的值 if(p->lchild!=NULL){ cq[rear]=p->lchild; //左子树入队 } if(p->rchild!=NULL){ cq[rear]=p->rchild; //右子树入队 rear=(rear+1)%NodeNum; rear=(rear+1)%NodeNum; } printf("LevePrint Bin_Tree:"); Levelorder(root); //按层次遍历

#include"stdio.h"

#include"stdlib.h"

#define MaxVertexNum 100 //定义最大顶点数

typedef struct{

char vexs[MaxVertexNum]; //顶点表

int edges[MaxVertexNum][MaxVertexNum]; //邻接矩阵,可看作边表

int n,e; //图中的顶点数n 和边数e

}MGraph; //用邻接矩阵表示的图的类型

//=========建立邻接矩阵=======

void CreatMGraph(MGraph *G)

{

int i,j,k;

char a;

printf("Input VertexNum(n) and EdgesNum(e): ");

scanf("%d,%d",&G->n,&G->e); //输入顶点数和边数

scanf("%c",&a);

printf("Input Vertex string:");

for(i=0;in;i++)

{

scanf("%c",&a); G->vexs[i]=a; //读入顶点信息,建立顶点表

}

for(i=0;in;i++)

for(j=0;jn;j++) G->edges[i][j]=0; //初始化邻接矩阵

printf("Input edges,Creat Adjacency Matrix\n");

for(k=0;ke;k++) { //读入e 条边,建立邻接矩阵

}

//=========定义标志向量,为全局变量=======

typedef enum{FALSE,TRUE} Boolean;

Boolean visited[MaxVertexNum];

//========DFS:深度优先遍历的递归算法======

void DFSM(MGraph *G,int i)

{ //以Vi 为出发点对邻接矩阵表示的图G 进行DFS 搜索,邻接矩阵是0,1矩阵 int j;

printf("%c",G->vexs[i]); //访问顶点Vi

visited[i]=TRUE; //置已访问标志

for(j=0;jn;j++) //依次搜索Vi 的邻接点

}

void DFS(MGraph *G) if(G->edges[i][j]==1 && ! visited[j]) DFSM(G,j); //(Vi ,Vj )∈E ,且Vj 未访问过,故Vj 为新出发点 scanf("%d%d",&i,&j); //输入边(Vi ,Vj )的顶点序号 G->edges[i][j]=1; G->edges[j][i]=1; //若为无向图,矩阵为对称矩阵;若建立有向图,去掉该条语句 }

int i;

for(i=0;in;i++)

}

//==========main=====

void main()

{

int i;

MGraph *G;

G=(MGraph *)malloc(sizeof(MGraph)); //为图G 申请内存空间

CreatMGraph(G); //建立邻接矩阵

printf("Print Graph DFS: ");

DFS(G); //深度优先遍历

printf("\n");

}

15、编写程序,输出相应图的BFS 结果。

visited[i]=FALSE; //标志向量初始化 if(!visited[i]) //Vi未访问过 DFSM(G,i); //以Vi 为源点开始DFS 搜索 for(i=0;in;i++)

#include"stdio.h"

#include"stdlib.h"

#define MaxVertexNum 100 //定义最大顶点数

typedef struct{

char vexs[MaxVertexNum]; //顶点表

int edges[MaxVertexNum][MaxVertexNum]; //邻接矩阵,可看作边表

int n,e; //图中的顶点数n 和边数e

}MGraph; //用邻接矩阵表示的图的类型

//=========建立邻接矩阵=======

void CreatMGraph(MGraph *G)

{

int i,j,k;

char a;

printf("Input VertexNum(n) and EdgesNum(e): ");

scanf("%d,%d",&G->n,&G->e); //输入顶点数和边数

scanf("%c",&a);

printf("Input Vertex string:");

for(i=0;in;i++)

{

G->vexs[i]=a; //读入顶点信息,建立顶点表

}

for(i=0;in;i++)

for(j=0;jn;j++) G->edges[i][j]=0; //初始化邻接矩阵

printf("Input edges,Creat Adjacency Matrix\n");

for(k=0;ke;k++) { //读入e 条边,建立邻接矩阵

}

//=========定义标志向量,为全局变量=======

typedef enum{FALSE,TRUE} Boolean;

Boolean visited[MaxVertexNum];

//===========BFS:广度优先遍历=======

void BFS(MGraph *G,int k)

{ //以Vk 为源点对用邻接矩阵表示的图G 进行广度优先搜索 int i,j,f=0,r=0;

int cq[MaxVertexNum]; //定义队列

for(i=0;in;i++)

visited[i]=FALSE; //标志向量初始化 for(i=0;in;i++) cq[i]=-1; //队列初始化

printf("%c",G->vexs[k]); //访问源点Vk

visited[k]=TRUE;

cq[r]=k; //Vk已访问,将其入队。注意,实际上是将其序号入队 while(cq[f]!=-1) { //队非空则执行

}

//==========main=====

void main()

{

int i;

MGraph *G;

G=(MGraph *)malloc(sizeof(MGraph)); //为图G 申请内存空间

CreatMGraph(G); //建立邻接矩阵 i=cq[f]; f=f+1; //Vf出队 for(j=0;jn;j++) //依次Vi 的邻接点Vj if(G->edges[i][j]==1 && !visited[j]) { //Vj未访问 printf("%c",G->vexs[j]); //访问Vj visited[j]=TRUE; r=r+1; cq[r]=j; //访问过Vj 入队 scanf("%d%d",&i,&j); //输入边(Vi ,Vj )的顶点序号 G->edges[i][j]=1; G->edges[j][i]=1; //若为无向图,矩阵为对称矩阵;若建立有向图,去掉该条语句 } } }

printf("Print Graph BFS: ");

BFS(G,4); //以序号为3的顶点开始广度优先遍历

printf("\n");

}

16、编写程序,输出该树的前序遍历序列

#include

#include

#include

#include

#define Max 20 //结点的最大个数

typedef struct node{

char data;

struct node *lchild,*rchild;

}BinTNode; //自定义二叉树的结点类型

typedef BinTNode *BinTree; //定义二叉树的指针

int NodeNum,leaf; //NodeNum为结点数,leaf 为叶子数

//==========基于先序遍历算法创建二叉树==============

//=====要求输入先序序列,其中加入虚结点"#"以示空指针的位置========== BinTree CreatBinTree(void)

{

BinTree T;

char ch;

if((ch=getchar())=='#')

}

//========NLR 先序遍历=============

void Preorder(BinTree T)

{

if(T) { return(NULL); //读入#,返回空指针 T=(BinTNode *)malloc(sizeof(BinTNode)); //生成结点 T->data=ch; T->rchild=CreatBinTree(); //构造右子树 T->lchild=CreatBinTree(); //构造左子树 return(T); else{ }

printf("%c",T->data); //访问结点

Preorder(T->lchild); //先序遍历左子树

Preorder(T->rchild); //先序遍历右子树

}

}

//==========主函数=================

void main()

{

BinTree root;

int i;

printf("Creat Bin_Tree; Input preorder:"); //输入完全二叉树的先序序列, // 用#代表虚结点,如ABD###CE##F## root=CreatBinTree(); //创建二叉树,返回根结点 式,输入序号。

printf("\t1: Preorder Traversal\n");

printf("Print Bin_tree Preorder: ");

Preorder(root); //先序遍历

printf("\n");

}

//从菜单中选择遍历方


相关文章

  • 在线考试系统
  • <.NET 应用案例> --在线考试系统的设计与实现 所在班级: 计算机12-3班 学 号: 1004010718 姓 名: 厚朴 年 月 日 目 录 1项目的来源.目的和意义 . ....................... ...查看


  • 注册结构工程师的报考条件及所考科目
  • 2010年注册结构工程师考试时间确定为2010年9月18.19日 2010年一级结构工程师考试时间:2010年9月18.19日 2010年二级结构工程师考试时间:2010年9月19日考试科目 一级注册注册结构工程师[1]设基础考试和专业考试 ...查看


  • 异常情况处理方案
  • 异常情况处理方案 目录 1. 2. 3. 4. 5. 6. 7. 8. 9. 考点服务可靠部署方式 ...................................................................... ...查看


  • 计算机软件资格考试
  • 计算机技术与软件专业资格(水平)考试 报考指南 1.什么是计算机技术与软件专业技术资格(水平)考试? 计算机技术与软件专业技术资格(水平)考试(以下简称计算机软件资格考试),是国家人事部和信息产业部对全国计算机与软件专业技术人员进行的职业资 ...查看


  • 一级注册结构工程师必备规范
  • 08年一级结构师考试使用规范.标准 2008-8-15 [大 中 小][打印] 2008年度全国一级注册结构工程师专业考试所使用的规范.标准 1.<建筑结构可靠度设计统一标准>(GB50068-2001) 2.<建筑结构荷 ...查看


  • 前辈的二注 结构工程师考试心得
  • 前辈的国家二级注册结构工程师考试心得 放寒假了,有时间了,对自己参加二级注册结构工程师考试的心得写一篇总结. 对于本科土木工程的学生来说,或多或少应该对注册结构工程师有听过或者了解过,如果之前没有听过,那就得快点去了解了,这个可是关乎切身利 ...查看


  • 试题库组卷系统详细设计报告
  • 试题库组卷系统设计报告 目录 第一章.系统软件总体结构图 -------------------------1 第二章.系统控制流和数据流模型图----------------------..1 第三章.数据字典和数据库的构造说明----- ...查看


  • 在线考试系统建设的意义及实现
  • 高等教育网络E-power 在线考试系统建设的意义及实现 在当今信息时代, 计算机技术与网络技术越来越广地应用于各个领域, 改变着人们的学习.工作.生活乃至思维方式, 也引起了教育领域的重大变革.将计算机与网络技术应用于现代高等教育中, 是 ...查看


  • 二级结构师
  • [转] 转载 结构二注终极经验2011-12-30 22:32阅读(41) 下一篇:2011-11-23 |返回日志列表 赞(1)赞(1)赞(1)赞(1) 转载(341) 分享(2) 评论 复制地址 更多 [老袁原创]结构二注终极经验(有图 ...查看


  • 二级注册建筑师报名程序
  • 深圳2010年一二级注册建筑师考试报名通知 来源:考试大 2010/2/25 [考试大:中国教育考试第一门户] 模拟考场 视频课程 字号:T | T 深圳市关于做好2010年度全国一.二级注册建筑师资格考试工作的通知 各有关单位: 根据全国 ...查看


热门内容