数据结构(c语言版)

Python011

数据结构(c语言版),第1张

测试数据1:

创建二叉树,输入先序扩展序列:ABD##E##C#F##

先序遍历输出节点:A B D E C F

中序遍历输出节点:D B E A C F

后序遍历输出节点:D E B F C A

二叉树示意图:

          A

       /      \

      B        C

    /    \    / \

   D      E  #   F

  / \    / \    / \

 #   #  #   #  #   #

测试数据2:

创建二叉树,输入先序扩展序列:ABC##DE#G##F###

先序遍历输出节点:A B C D E G F

中序遍历输出节点:C B E G D F A

后序遍历输出节点:C G E F D B A

二叉树示意图:

           A

         /   \

        B     #

    /      \

   C        D

  / \    /     \

 #  #   E       F

       / \     / \

      #   G   #   #

         / \

        #   #

#include<stdio.h>

#include<stdlib.h>

typedef struct Node   //二叉树的结构体

{

    char data            //字符

    struct Node *lchild  //左分支

    struct Node *rchild  //右分支

}Bitree

//创建二叉树: 用"先序遍历"(递归法)

void CreateBiTree(Bitree **bt)

{

    char ch

    scanf("%c",&ch) //输入字符

    if(ch=='#')      //'#'是空节点NULL

        *bt=NULL

    else

    {

        *bt=(Bitree *)malloc(sizeof(Bitree))

        (*bt)->data=ch

        CreateBiTree(&((*bt)->lchild))

        CreateBiTree(&((*bt)->rchild))

    }

}

//用"先序遍历"输出节点(递归法)

void preOrder(Bitree *ptr)

{

    if(ptr!=NULL)

    {

        printf("%c ",ptr->data)

        preOrder(ptr->lchild)

        preOrder(ptr->rchild)

    }

}

//用"中序遍历"输出节点(递归法)

void inOrder(Bitree *ptr)

{

    if(ptr!=NULL)

    {

        inOrder(ptr->lchild)

        printf("%c ",ptr->data)

        inOrder(ptr->rchild)

    }

}

//用"后序遍历"输出节点(递归法)

void postOrder(Bitree *ptr)

{

    if(ptr!=NULL)

    {

        postOrder(ptr->lchild)

        postOrder(ptr->rchild)

        printf("%c ",ptr->data)

    }

}

int main()

{

    Bitree *root

    printf("创建二叉树,输入先序扩展序列:")

    CreateBiTree(&root)

    printf("先序遍历输出节点: ")

    preOrder(root)

    printf("\n中序遍历输出节点: ")

    inOrder(root)

    printf("\n后序遍历输出节点: ")

    postOrder(root)

    printf("\n")

    return 0

}

#include<iostream>

#include<iomanip>

#include<string>

#include <windows.h>

using namespace std

typedef struct {//定义哈夫曼树个结点

    int weight//权值

int parent,lchild,rchild//双亲,左右孩子结点下标

char data//储存相关的字符信息

}HTNode,*HuffmanTree//动态分配数组存储哈夫曼编码树

typedef char **HuffmanCode// 动态分配数组存储哈夫曼编码表

void statistics(char *a,int *w,char *d,int &n)//统计字符

{

int j=0

int k

for(int i=0i<100&&a[i]!='\0'i++){

for( k=0k<jk++){

if(a[i]==d[k])

{ w[k]++

break

}

}

if(k==j){

  d[j]=a[i]

w[j]++

j++}

}

n=j

d[j]='\0'

}

void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n,char *d)//w存放n个字符的权值,构造哈夫曼树HT,并求出n个字符的哈夫曼编码HC

    {if(n<=1)return

int m=2*n-1//m为结点数,一棵有n个叶子结点的哈夫曼树共有2n-1个结点,可以储存一个大小为2n-1的一维数组中

HT=new HTNode[m+1]

HuffmanTree p

int i

for(p=HT+1,i=1i<=ni++,++p) //初始化哈夫曼树

{ p->data=d[i-1]

p->lchild=p->parent=p->rchild=0

p->weight=w[i-1] }

for(i<=m++i,++p)  {

p->lchild=p->parent=p->rchild=0

p->weight=0 }

for(i=n+1i<=m++i){//建立哈夫曼树

int s1,s2,u,t

for (u=1u<=i-1u++)if(HT[u].parent==0){s1=ubreak}

for(u=u+1u<=i-1u++) {

if(HT[s1].weight>HT[u].weight&&HT[u].parent==0)

s1=u }

for(t=1t<=i-1t++)

if(HT[t].parent==0&&t!=s1){s2=tbreak}

for(t=t+1t<=i-1t++)

{ if(HT[s2].weight>HT[t].weight&&HT[t].parent==0&&t!=s1)

s2=t }

HT[s1].parent=iHT[s2].parent=i//parent为0且weight最小的的两个结点,一个为s1,一个为s2

HT[i].lchild=s1HT[i].rchild=s2//左孩子权值小,右孩子权值大

HT[i].weight=HT[s1].weight+HT[s2].weight }

HC=new char*[n+1] //分配n个字符编码指针

char *cd=new char[n]//分配编码的工作空间

cd[n-1]='\0'//编码结束符

int start,c,f

for(i=1i<=n++i){//逐个字符求哈夫曼编码

start=n-1 //编码在数组cd[]的最前位置

for(c=i,f=HT[i].parentf!=0c=f,f=HT[f].parent)//从叶子到树根逆向求哈夫曼编码

if(HT[f].lchild==c) cd[--start]='0'//判断是左孩子还是右孩子(左为0右为1)

else cd[--start]='1'

HC[i]=new char[n-start]//为第i个字符分配空间

strcpy(HC[i],&cd[start]) }//讲cd[]数组的start位置到n-1位置复制给HC[i]

delete(cd)}//释放空间

void main()

{

char a[100]

char d[100]char bc[1000]

int w[100],n=0

HuffmanTree HT

HuffmanCode HC

cout<<"请输入字符:\n"

cin>>a

for(int ak=0ak<100ak++)w[ak]=0

statistics (a,w,d,n)  //统计

HuffmanCoding(HT,HC,w,n,d)

cout<<"霍夫曼编码为:"<<endl

cout<<"原码 "<<"权值 "<<"二进制码"<<endl

system("pause")

}

请采纳,谢谢

#include<stdio.h>

#include<stdlib.h>

typedef struct

{

int arr[100]

int last

}SeqList

void InitList(SeqList *L)

void IsEmpty(SeqList L)

int GetLength(SeqList L)

void DeletNum(SeqList * L,int num)

void GetEmpty(SeqList * L)

void PaiXu(SeqList * L)

int main()

{

int length,addr,num

SeqList L,*p

p=&L

printf("创建表\n")

InitList(&L)//初始化

IsEmpty(L)//判断是否为空

printf("input the length\n")

scanf("%d",&length)

L.last=length-1//数组最后下个数的下标

printf("输入表中的值\n")//输入表中的值

for(int i=0i<=L.lasti++)

scanf("%d",&L.arr[i])

length=GetLength(L)

printf("输入想输出的数在表中的位置(从1开始数)\n")//输出某个位序上的数据元素

scanf("%d",&addr)

if(addr>length)

printf("该位置不存在,超过了范围\n")

else

printf("第%d数为%d\n",addr,L.arr[addr-1])

printf("输入想得到前驱后继的结点的值\n")//输出某元素的前驱后继

scanf("%d",&num)

for(i=0i<=L.lasti++)

{

if(L.arr[i]==num)

{

printf("找到该结点,结点的位置为第%d数\n",i+1)

if((i+1)==length)

printf("该结点无后继\n")

else

printf("结点后继为%d\n",L.arr[i+1])

if((i-1)<0)

printf("该结点无前驱\n")

else

printf("结点前驱为%d\n",L.arr[i-1])

break

}

}

if(i==length)

printf("表中无此数\n")

//将奇偶排序

PaiXu(&L)

printf("输入想要删除的数\n")

scanf("%d",&num)

DeletNum(p,num)//删除该数

GetLength(L)//删除后的表长

GetEmpty(&L)//置空

IsEmpty(L)//判断是否为空

return 0

}

void InitList(SeqList * L)

{

L->last=-1

}

void IsEmpty(SeqList L)

{

if(L.last>=0)

printf("该表不为空\n")

else

printf("该表为空\n")

}

int GetLength(SeqList L)

{

printf("该表的长度为%d\n",L.last+1)

return L.last+1

}

void DeletNum(SeqList * L,int num)

{

int i,k

for(i=0i<=L->lasti++)

{

if(L->arr[i]==num)

{

k=i

break

}

}

if(i==L->last+1)

printf("表中无此数\n")

for(i=ki<L->lasti++)//删除该数后,后面的数向前移

L->arr[i]=L->arr[i+1]

L->last--//表长减一

for(i=0i<=L->lasti++)

printf("%d ",L->arr[i])

}

void GetEmpty(SeqList * L)

{

L->last=-1

}

void PaiXu(SeqList * L)

{

int i,j,t

i=0

j=L->last

while(i<j)

{

while(L->arr[i]%2!=0)

i++

while(L->arr[j]%2==0)

j--

if(i<j)

{

t=L->arr[i]

L->arr[i]=L->arr[j]

L->arr[j]=t

}

}

printf("奇偶排序后\n")

for(i=0i<=L->lasti++)

printf("%d ",L->arr[i])

}