#define _CRT_SECURE_NO_WARNINGS
#define OK 1
#define ERROR 1
#define OVERFLOW -1
#define TRUE 1
#define FALSE 0
#define MAXVEX 100
bool visited[MAXVEX];
#include
#include
void ShowMainMenu() {
printf("\n");
printf("*******************算法与数据结构******************\n");
printf("*1 单链表的基本操作及应用 *\n");
printf("*2 栈的基本操作及应用 *\n");
printf("*3 数组的基本操作及应用 *\n");
printf("*4 树的基本操作及应用 *\n");
printf("*5 图的基本操作及应用 *\n");
printf("*6 退出 *\n");
printf("***************************************************\n");
}
typedef struct LNode {
intData;
structLNode *next;
}LNode, *LinkList;
void CreateList_L(LinkList&L, int n)
{
LinkListp;
L= (LinkList)malloc(sizeof(LNode));
L->next= NULL;
for(int i = 0; i { p= (LinkList)malloc(sizeof(LNode)); scanf("%d",&(p->Data)); p->next= L->next; L->next = p; } } bool ListInsert_L(LinkList&L, int i,int e) { LinkListp, s; p= L; int j = 0; while(p&&j
{ p= p->next; ++j; } if(!p || j>i - 1) { returnfalse; } s= (LinkList)malloc(sizeof(LNode)); s->Data= e; s->next = p->next; p->next= s; returntrue; } bool ListDelete_L(LinkList&L, int i,int &e) { LinkListp, s; p= L; int j = 0; while(p->next&&j
{ p= p->next; ++j; } if(!(p->next) || j>i - 1) { returnfalse; } s= (LinkList)malloc(sizeof(LNode)); s= p->next; p->next = s->next; e= s->Data; free(s); returntrue; } LinkList ListFind_L(LinkList L, int X) { LinkListp = L; /* p指向L的第1个结点 */ while(p && p->Data != X) p= p->next; /*下列语句可以用 return p; 替换 */ if(p) returnp; else returnfalse; } void ListDisplay_L(LinkList L) { L= L->next; while(L != NULL) { printf("%d", L->Data); L= L->next; } } void LLinkList() { LinkListL = 0; intn; do{ printf("\n"); printf("**************单链表的基本操作及应用***************\n"); printf("*1 创建 *\n"); printf("*2 插入 *\n"); printf("*3 删除 *\n"); printf("*4 查找 *\n"); printf("*5 显示 *\n"); printf("*6 通讯录(应用) *\n"); printf("*7 退出 *\n"); printf("***************************************************\n"); printf("请选择:"); scanf("%d",&n); switch(n) { case1: printf("--------创建单链表---------\n"); printf("请输入要创建的链表的元素个数:"); inta1; scanf("%d",&a1); CreateList_L(L,a1); break; case2: printf("--------插入元素-------"); printf("请输入要插入的元素及其插入的位置:"); inta2, b; scanf("%d%d", &a2, &b); ListInsert_L(L,b, a2); break; case3: printf("--------删除元素-------"); printf("请输入要删除元素的位置:"); inta3; scanf("%d",&a3); inte; ListDelete_L(L,a3, e); printf("删除的元素为:%d", e); break; case4: printf("--------查找元素-------"); printf("请输入要查找的元素:"); inta4; scanf("%d",&a4); if(ListFind_L(L, a4)) { printf("查找到的元素为:"); printf("%d",ListFind_L(L, a4)->Data); } else { printf("查找失败!"); } break; case5: printf("--------显示链表-------"); ListDisplay_L(L); break; case6: printf("--------通讯录---------"); break; case7: break; default: printf("ERROR!");break; } }while (n != 7); } typedef int Position; struct SNode { int*Data; /* 存储元素的数组 */ PositionTop; /* 栈顶指针*/ intMaxSize; /* 堆栈最大容量 */ }; typedef struct SNode *Stack; Stack CreateStack(int MaxSize) { StackS = (Stack)malloc(sizeof(struct SNode)); S->Data= (int *)malloc(MaxSize * sizeof(int)); S->Top= -1; S->MaxSize= MaxSize; returnS; } bool IsFull(Stack S) { return(S->Top == S->MaxSize - 1); } bool Push(Stack S, int X) { if(IsFull(S)) { printf("堆栈满"); returnfalse; } else{ S->Data[++(S->Top)]= X; returntrue; } } bool IsEmpty(Stack S) { return(S->Top == -1); } int Pop(Stack S) { if(IsEmpty(S)) { printf("堆栈空"); returnfalse; } else return(S->Data[(S->Top)--]); } void SStack() { intnumber; printf("请输入堆栈中最多元素个数:"); scanf("%d",&number); StackS = CreateStack(number); intn; do{ printf("\n"); printf("****************栈的基本操作及应用*****************\n"); printf("*1 进栈 *\n"); printf("*2 出栈 *\n"); printf("*3 取栈顶元素 *\n"); printf("*4 表达式求解(应用) *\n"); printf("*5 退出 *\n"); printf("***************************************************\n"); printf("请选择:"); scanf("%d",&n); switch(n) { case1: printf("--------进栈-------"); printf("请输入要进栈的元素:"); inta1; scanf("%d",&a1); Push(S,a1); break; case2: printf("--------出栈-------"); printf("%d",Pop(S)); break; case3: printf("--------取栈顶元素-------"); printf("%d",Pop(S)); break; case4: { intx1, x2, result = 0, n = 0; printf("--------表达式求值-------\n"); printf("请输入x:"); scanf("%d",&x1); for(int i = 0; i < number; i++) { x2= Pop(S); n= x1*x2; result+= n; } printf("计算的值为:"); printf("%d",result); break; } case5:break; default: printf("ERROR!");break; } }while (n != 5); } typedef struct Array { int*pBase; intlen; intcnt; }*PArr; void init_arr(PArr &pArr, int len) { pArr= (Array*)malloc(sizeof(Array)); pArr->pBase= (int *)malloc(sizeof(int)*len); if(pArr->pBase == NULL) { printf("动态内存分配失败"); exit(-1);//终止整个程序 } else{ pArr->len= len; pArr->cnt= 0; } } int is_full(PArr &pArr) { if(pArr->cnt == pArr->len) { return0; //0代表true,表示已满 } else{ return1; //1代表false,表示未满 } } int append_arr(PArr &pArr, int val) { if(is_full(pArr) == 0) { return0; } else{ pArr->pBase[pArr->cnt]= val; pArr->cnt++; return1; } } int is_empty(PArr &pArr) { if(pArr->cnt == 0) { return0; //0代表true } else{ return1; //1代表false } } void show_arr(PArr &pArr) { if(is_empty(pArr) == 0) { printf("当前数组为空!"); } else{ inti; for(i = 0; i printf("%d ", pArr->pBase[i]); } printf("\n"); } } void AArray() { Array*pArr = 0; Array*pBrr = 0; printf("请输入数组的长度:"); inta; scanf("%d",&a); init_arr(pArr,a); intn; do{ printf("\n"); printf("*************稀疏矩阵的压缩存储及应用**************\n"); printf("*1 创建 *\n"); printf("*2 显示 *\n"); printf("*3 矩阵乘法(应用) *\n"); printf("*4 退出 *\n"); printf("***************************************************\n"); printf("请选择:"); scanf("%d",&n); switch(n) { case1: printf("---------创建-------\n"); for(int i = 0; i < a; i++) { printf("请输入要加入数组的元素:"); intb; scanf("%d",&b); append_arr(pArr,b); } break; case2: printf("---------显示-------"); show_arr(pArr); break; case3: { printf("---------矩阵乘法-------\n"); getchar(); init_arr(pBrr,a); for(int i = 0; i < a; i++) { printf("请输入要加入另一个数组的元素:"); intbb; scanf("%d",&bb); append_arr(pBrr,bb); } inta = 0, b = 0; for(int i = 0; i < pArr->cnt; ++i) { a= (pArr->pBase[i]) *(pBrr->pBase[i]); b+= a; } printf("计算之后的值为:"); printf("%d",b); break; } case4:break; default: printf("ERROR!");break; } }while (n != 4); } typedef struct BinNode { chardata; BinNode*lchild, *rchild; }*BinTree; //二叉树链式存储结构 void CreateBinTree(BinTree &T)//先序建立二叉树 { charch; printf("请输入数据:"); scanf("%c",&ch); getchar(); if(ch == ' ') T= NULL; else { if(!(T = (BinNode*)malloc(sizeof(BinNode)))) { exit(-1); printf("1\n"); } T->data= ch;//这是根节点 CreateBinTree(T->lchild);//创建左孩子 CreateBinTree(T->rchild);//创建右孩子 } } void PreOrder(BinTree T)//前序遍历二叉树 { if(T != NULL) { printf("%c",T->data); PreOrder(T->lchild); PreOrder(T->rchild); } } void InOrder(BinTree T)//中序遍历二叉树 { if(T != NULL) { InOrder(T->lchild); printf("%c",T->data); InOrder(T->rchild); } } void PostOrder(BinTree T)//后序遍历二叉树 { if(T != NULL) { PostOrder(T->lchild); PostOrder(T->rchild); printf("%c",T->data); } } char a[10]; char *p = a; void cengxu(BinTree T, char *p) { BinTreetemp[100]; //关键中间变量存放每一层的数据 intin = 0, out = 0; temp[in++]= T; //每次把这一层存入,然后输出的时候就把他的左右节点存入 while(in > out) //例如一颗完全二叉树abcdefg 输出a的时候把bc放入,输出b的时候把b { //的孩子放入也就是de,再输出c并且放入孩子fg,依次这样,达到层序的要求 if(temp[out]) { //printf("%c",temp[out]->data); *p= temp[out]->data; p++; temp[in++]= temp[out]->lchild; temp[in++]= temp[out]->rchild; } out++; } } int cnt = 0; int countNode(BinTree T)//求二叉树中节点的个数 { if(T) { cnt++; countNode(T->lchild); countNode(T->rchild); } returncnt; } int leafCountOfBiTree(const BinTree &T) { if(T == NULL) return0; if(T->lchild == NULL && T->rchild == NULL) return1; returnleafCountOfBiTree(T->lchild) + leafCountOfBiTree(T->rchild); } int depthval = 0; int dl = 0; int dr = 0; int Depth(BinTree T)//求二叉树的高度 { if(!T) return0; else { dl= Depth(T->lchild); dr= Depth(T->rchild); depthval= 1 + (dl>dr ? dl : dr); returndepthval; } } char Parent(BinTree &T, char e) { cengxu(T,p); for(int i = 0; i < 10; i++) { if(a[i] == e) { i-= 1; returna[i / 2]; } } } char brother(BinTree &T, char e) { cengxu(T,p); if(T->data == e) { return'a'; } for(int i = 0; i < 10; i++) { if(a[i] == e) { if(a[(i - 1) / 2] == a[i / 2]) { returna[i + 1]; } elseif (a[(i - 1) / 2] == a[(i - 2) / 2]) { returna[i - 1]; } } } } void BiTree() { BinTreeT = 0; intn; do{ printf("\n"); printf("**************二叉树的基本操作及应用***************\n"); printf("*1 创建二叉树 *\n"); printf("*2 遍历二叉树(先/中/后) *\n"); printf("*3 计算树的深度 *\n"); printf("*4 计算叶子结点个数 *\n"); printf("*5 查找双亲 *\n"); printf("*6 查找兄弟 *\n"); printf("*7 Huffman编码(应用) *\n"); printf("*8 退出\n"); printf("***************************************************\n"); printf("请选择:"); scanf("%d",&n); switch(n) { case1: printf("---------创建二叉树--------\n"); getchar(); printf("先序创建二叉树,先顶点,再左孩子,再右孩子\n"); printf("(例如二叉树1 2 3,则输入为“12 3 ”,2,3后面两个空格,因为它们是叶子结点)\n"); CreateBinTree(T); break; case2: printf("---------*遍历二叉树-------\n"); printf("先序遍历:"); PreOrder(T); printf("\n"); printf("中序遍历:"); InOrder(T); printf("\n"); printf("后序遍历:"); PostOrder(T); break; case3: printf("---------计算树的深度------"); printf("树的深度为:"); printf("%d",Depth(T)); break; case4: printf("---------计算叶子结点个数-------"); printf("树的叶子结点个数为:"); printf("%d",leafCountOfBiTree(T)); break; case5: printf("---------查找双亲-------\n"); getchar(); printf("请输入要查找的结点:"); chare; scanf("%c",&e); printf("该节点的双亲为:"); printf("%c",Parent(T, e)); break; case6: printf("---------查找兄弟-------\n"); getchar(); printf("请输入要查找的结点:"); charee; scanf("%c",&ee); getchar(); printf("该节点的兄弟为:"); if(brother(T, ee) != 'a') { printf("%c\n",brother(T, ee)); } else { printf("该节点无兄弟"); } break; case7: printf("---------Huffman编码-------"); break; case8:break; default: printf("ERROR!");break; } }while (n != 8); } typedef enum { DG, DN, UDG, UDN }Graphkind; #define MAX_VERTEX_num 20 typedef struct Mgrap { charvwrs[MAX_VERTEX_num]; intarcs[MAX_VERTEX_num][MAX_VERTEX_num]; intvexnum, arcunm; Graphkindkind; }*mgrap; void creatUDG(mgrap & G) { inti, j, k; printf("请输入无向图的顶点数和边数\n"); scanf_s("%d%d", &G->vexnum, &G->arcunm); getchar(); printf("请依次输入顶点的序号:\n"); for(i = 0; i < G->vexnum; i++) { scanf_s("%c",&G->vwrs[i]); getchar(); } for(i = 1; i <= G->vexnum; i++) for(j = 1; j <= G->arcunm; j++) G->arcs[i][j]= -1; for(k = 1; k <= G->arcunm; k++) { printf("请输入边的两个点(例如顶点2到顶点3有边,则输入2 3,空格间隔):"); scanf_s("%d%d", &i, &j); G->arcs[j][i]= G->arcs[i][j] = 0; } } void creatUDN(mgrap &G) { inti, j, k; printf("请输入无向网的顶点数和边数\n"); scanf_s("%d%d", &G->vexnum, &G->arcunm); getchar(); printf("请依次输入顶点的序号:\n"); for(i = 0; i < G->vexnum; i++) { scanf_s("%c",&G->vwrs[i]); getchar(); } for(i = 1; i <= G->vexnum; i++) for(j = 1; j <= G->arcunm; j++) G->arcs[i][j]= -1; for(k = 1; k <= G->arcunm; k++) { printf("请输入边的两个点(例如顶点2到顶点3有边,则输入2 3,空格间隔):"); scanf_s("%d%d", &i, &j); printf("输入权值"); getchar(); scanf_s("%d",&G->arcs[i][j]); G->arcs[j][i]= G->arcs[i][j]; } } void creatDG(mgrap &g) { inti, j, k; printf("请输入有向图的顶点数和边数"); scanf_s("%d%d", &g->vexnum, &g->arcunm); getchar(); printf("请依次输入顶点的序号:\n"); for(i = 0; i < g->vexnum; i++) { scanf_s("%c",&g->vwrs[i]); getchar(); } for(i = 1; i <= g->vexnum; i++) for(j = 1; j <= g->arcunm; j++) g->arcs[i][j]= -1; for(k = 1; k <= g->arcunm; k++) { printf("请输入边的两个点(例如顶点2到顶点3有边,则输入2 3,空格间隔):"); scanf_s("%d%d", &i, &j); g->arcs[i][j]= 0; } } void creatDN(mgrap &g) { inti, j, k; printf("请输入有向网的顶点数和边数"); scanf_s("%d%d", &g->vexnum, &g->arcunm); fflush(stdin); printf("请依次输入顶点的序号:\n"); for(i = 0; i < g->vexnum; i++) { scanf_s("%c",&g->vwrs[i]); fflush(stdin); } for(i = 1; i <= g->vexnum; i++) for(j = 1; j <= g->arcunm; j++) g->arcs[i][j]= -1; for(k = 1; k <= g->arcunm; k++) { printf("请输入边的两个点(例如顶点2到顶点3有边,则输入2 3,空格间隔):"); scanf_s("%d%d", &i, &j); printf("输入权值"); fflush(stdin); scanf_s("%d",&g->arcs[i][j]); /*g->arcs[j][i]= g->arcs[i][j];*/ } } /*图的输出*/ void show(mgrap G) { inti, j; for(i = 0; i { printf("%5c",G->vwrs[i]); } printf("\n"); printf("按矩阵的方式输出:(0表示两点有边,-1表示两点无边,其他数值表示权值)\n"); for(i = 1; i <= G->vexnum; i++) { for(j = 1; j <= G->arcunm; j++) printf("%5d",G->arcs[i][j]); printf("\n"); } } void sort(mgrap g) { inti, j, k; for(i = 1; i <= g->vexnum; i++) { intflag = 0; for(j = 1; j <= g->arcunm; j++) { if(g->arcs[i][j] == 0) { if(g->arcs[j][i] != 0 && flag != 1) { printf("%5c",g->vwrs[i - 1]); flag= 1; } } } } printf("%5c",g->vwrs[g->vexnum - 1]); } void Graph() { mgrapG, g; G= (mgrap)malloc(sizeof(Mgrap)); g= (mgrap)malloc(sizeof(Mgrap)); intn; do{ printf("\n"); printf("****************图的基本操作及应用*****************\n"); printf("*1 创建无向图 *\n"); printf("*2 创建无向网 *\n"); printf("*3 创建有向图 *\n"); printf("*4 创建有向网 *\n"); printf("*5 遍历 *\n"); printf("*6 拓扑排序 *\n"); printf("*7 最小生成树(应用) *\n"); printf("*8 最短路径(应用) *\n"); printf("*9 关键路径(应用) *\n"); printf("*10 退出 *\n"); printf("***************************************************\n"); printf("请选择:"); scanf_s("%d",&n); switch(n) { case1: printf("---------创建无向图-------\n"); creatUDG(G); break; case2: printf("---------创建无向网-------\n"); creatUDN(G); break; case3: printf("---------创建有向图-------\n"); creatDG(g); break; case4: printf("---------创建有向网-------\n"); creatDN(g); break; case5: printf("---------遍历-------\n"); printf("请选择图的类型:1:无向图/网 2:有向图/网"); intz; scanf_s("%d",&z); switch(z) { case1: show(G); break; case2: show(g); break; default:printf("error");break; } break; case6: printf("---------拓扑排序-------\n"); sort(g); break; case7: printf("---------最小生成树-------"); break; case8: printf("---------最短路径-------"); break; case9: printf("---------关键路径-------"); break; case10:break; default: printf("ERROR!");break; } }while (n != 10); } void main() { intn; do{ ShowMainMenu(); printf("请选择:"); scanf("%d",&n); switch(n) { case1:LLinkList(); break; case2:SStack(); break; case3:AArray(); break; case4:BiTree(); break; case5:Graph(); break; case6:break; default:printf("ERROR!");break; } }while (n != 6); } 应用要求实现两个,数组乘法和表达式求值