链表(带头结点):建立、打印、插入、删除、查询
定位、就地逆置
#include <iostream>
using namespace std;
#include <malloc.h>
#include <stdio.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
/*void CreateList(LinkList &L,int n)
{
int i;
LinkList p;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
for(i=n;i>0;--i)
{
p = (LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next = L->next;
L->next = p;
}
}*/
void CreateList(LinkList &L,int n)
{
int i;
ElemType e;
LinkList p,q;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
q = L;
for(i=1;i<=n;i++)
{
scanf("%d",&e);
p = (LinkList)malloc(sizeof(LNode));
p->data = e;
q->next = p;
q = p;
}
q->next = NULL;
}
Status ListInsert(LinkList &L,int i,ElemType e)
{
int j=0;
LinkList p,s;
p = L;
while(p&&j<i-1)
{
p = p->next;
++j;
}
if(!p||j>i-1)
{
return ERROR;
}
s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
Status ListDelete(LinkList &L,int i,ElemType &e)
{
int j=0;
LinkList p,q;
p = L;
while(p->next&&j<i-1)
{
p = p->next;
++j;
}
if(!(p->next)||j>i-1)
{
return ERROR;
}
q = p->next;
p->next = q->next;
e = q->data;
free(q);
return OK;
}
int GetElem(LinkList L,int i,ElemType &e)
{
int j=1;
LinkList p;
p = L->next;
while(p&&j<i)
{
p = p->next;
++j;
}
if(!p||j>i)
{
return ERROR;
}
e = p->data;
return e;
}
int LOCATE(LinkList &L,ElemType x)
{
int i=1;
LinkList p;
p = L->next;
while(p->data!=x&&p)
{
p = p->next;
i++;
}
if(!p)
return 0;
else
return i;
}
void Inverse(LinkList &L)
{
LinkList p,q;
p = L->next;
L->next = NULL;
while(p!=NULL)
{
q = p;
p = p->next;
q->next = L->next;
L->next = q;
}
}
void Print(LinkList L)
{
LinkList p;
p = L->next;
while(p)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
int main()
{
LinkList L;
ElemType x;
int n,i,m;
ElemType e;
/*printf("你想逆位序输入元素个数:");
scanf("%d",&n);
CreateList(L,n);*/
printf("你想顺位序输入元素个数:");
scanf("%d",&n);
CreateList(L,n);
printf("当前表中元素为:");
Print(L);
printf("你想插入的元素的位置和你要插入的元素:");
scanf("%d %d",&i,&e);
ListInsert(L,i,e);
printf("当前表中元素为:");
Print(L);
printf("你想删除的元素的位置:");
scanf("%d",&i);
ListDelete(L,i,e);
printf("当前表中元素为:");
Print(L);
printf("你想查找的元素的位置:");
scanf("%d",&i);
e = GetElem(L,i,e);
if(e==0)
printf("查询失败。\n");
else
printf("你要查询的元素值为%d。\n",e);
printf("你想定位的元素为:");
scanf("%d",&x);
m = LOCATE(L,x);
printf("你所要定位的元素位置为第%d个。\n",m);
printf("链表元素就地逆置后为:");
Inverse(L);
Print(L);
return 0;
}
二叉树:先序输入、先序遍历、中序遍历、求高度、求叶子结点个数
左右子树交换、判相似
#include <iostream>
using namespace std;
#include <malloc.h>
#include <stdio.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
Status CreateBiTree(BiTree &T)
{
char ch;
scanf("%c",&ch);
if(ch==' ')
T = NULL;
else
{
if(!(T = (BiTNode *)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
}
void Preorder(BiTree T)
{ // 先序遍历二叉树
if (T) {
printf("%c",T->data); // 访问结点
Preorder(T->lchild); // 遍历左子树
Preorder(T->rchild); // 遍历右子树
}
}
void Inorder(BiTree T)
{ // 中序遍历二叉树
if (T) {
Inorder(T->lchild); // 遍历左子树
printf("%c",T->data); // 访问结点
Inorder(T->rchild); // 遍历右子树
}
}
int Bihigh(BiTree T)
{
int h,h1,h2;
if(!T)
h=0;
else
{
h1 = Bihigh(T->lchild);
h2 = Bihigh(T->rchild);
h = 1+(h1>h2?h1:h2);
}
return h;
}
void Countleaf(BiTree T,int &counter)
{
if(T)
{
if((!T->lchild)&&(!T->rchild))
counter++;
Countleaf(T->lchild,counter);
Countleaf(T->rchild,counter);
}
}
int BTS(BiTree B1,BiTree B2)
{
if(!B1&&!B2)
return 1;
else if(B1&&B2&&BTS(B1->lchild,B2->lchild)&&BTS(B1->rchild,B2->rchild))
return 1;
else
return 0;
}
void Exchange(BiTree &T)
{
BiTree B;
if(T)
{
B = T->lchild;
T->lchild = T->rchild;
T->rchild = B;
if(T->lchild)
Exchange(T->lchild);
if(T->rchild)
Exchange(T->rchild);
}
}
int main()
{
BiTree T,B1,B2;
int h,counter=0;
printf("请按先序次序输入二叉树中元素:");
CreateBiTree(T);
printf("该二叉树的先序次序为:");
Preorder(T);
printf("该二叉树的中序次序为:");
Inorder(T);
printf("\n");
h = Bihigh(T);
printf("该二叉树高度为:%d\n",h);
Countleaf(T,counter);
printf("该二叉树叶子结点个数为:%d\n",counter);
Exchange(T);
printf("树的左右子树交换后先序次序为:");
Preorder(T);
printf("\n");
printf("树的左右子树交换后中序次序为:");
Inorder(T);
printf("\n");
fflush(stdin);
printf("请按先序次序输入第一棵判断相似的二叉树中元素:");
CreateBiTree(B1);
fflush(stdin);
printf("请按先序次序输入第二棵判断相似的二叉树中元素:");
CreateBiTree(B2);
if(BTS(B1,B2))
printf("两二叉树相似。\n");
else
printf("两二叉树不相似。\n");
return 0;
}
图(邻接矩阵、无向邻接表、有向邻接表):定位、建立、深度遍历(第一个结点、下一个结点、主体算法、开始遍历算法)
#include <iostream>
using namespace std;
#include <malloc.h>
#include <stdio.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef char VertexType;
#define MAX_VERTEX_NUM 20
typedef int Boolean;
Boolean visited[MAX_VERTEX_NUM];
typedef struct
{
VertexType vexs[MAX_VERTEX_NUM];
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vexnum,arcnum;
}MGraph;
int locateVex(MGraph G,char v)
{
int i;
for(i=0;i<G.vexnum;i++)
if(v==G.vexs[i])
return i;
return -1;
}
Status CreateGraph(MGraph &G)
{
int i,j,k;
char v1,v2;
scanf("%d %d",&G.vexnum,&G.arcnum);
for(i=0;i<G.vexnum;i++)
{
printf("输入第%d个顶点向量:",i+1);
scanf(" %c",&G.vexs[i]);
}
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
G.arcs[i][j] = 0;
for(k=0;k<G.arcnum;k++)
{
printf("输入一条边依附的顶点:");
scanf(" %c %c",&v1,&v2);
i=locateVex(G,v1);
j=locateVex(G,v2);
G.arcs[j][i] = G.arcs[i][j] = 1;
}
return OK;
}
int FirstAdjVex(MGraph G,int v)
{
int i;
for(i=0;i<G.vexnum;i++)
if(G.arcs[0][i]==1)
return i;
return -1;
}
int NextAdjVex(MGraph G,int v,int w)
{
int i;
for(i=w+1;i<G.vexnum;i++)
if(G.arcs[v][i]==1)
return i;
return -1;
}
void DFS(MGraph G,int v)
{
int w;
visited[v] = TRUE;
printf("%c",G.vexs[v]);
for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
if(!visited[w])
DFS(G,w);
}
void DFSTraverse(MGraph G)
{
int v;
for(v=0;v<G.vexnum;v++)
visited[v] = FALSE;
for(v=0;v<G.vexnum;v++)
if(!visited[v])
DFS(G,v);
}
int main()
{
MGraph G;
printf("用邻接矩阵创建图。\n");
printf("请输入图的顶点数和弧数:");
if(CreateGraph(G)==1)
printf("创建成功。\n");
printf("深度遍历得到的顶点访问序列为:");
DFSTraverse(G);
return 0;
}