数据结构相关

本文详细介绍了链表、二叉树和图这三种数据结构的基本操作,包括链表的建立、打印、插入、删除和查询,二叉树的先序输入与遍历、高度和叶子节点计算,以及图的定位、建立和深度遍历等核心算法。通过具体的代码实现,展示了如何在C语言环境下进行这些操作。
摘要由CSDN通过智能技术生成

链表(带头结点):建立、打印、插入、删除、查询
定位、就地逆置

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值