数据结构代码实现(一)

/*二叉树的实现与遍历
#include <iostream>
#include <malloc.h>
using namespace std;

typedef struct btnode
{
    char data;
    struct btnode * plchild;
    struct btnode * prchild;
}BTNODE,* PBTNODE;

PBTNODE createBtnode();//建造静态链式二叉树
void pretraBtree(PBTNODE pt);//先序遍历
void intraBtree(PBTNODE pt);//中序
void posttraBtree(PBTNODE pt);//后序

int main()
{
    PBTNODE pt=createBtnode();

    pretraBtree(pt);
    cout<<endl;
    intraBtree(pt);
    cout<<endl;
    posttraBtree(pt);
    cout<<endl;

    return 0;
}

void pretraBtree(PBTNODE pt)
{
    if(pt==NULL) return ;
    cout<<pt->data<<endl;
    pretraBtree(pt->plchild);
    pretraBtree(pt->prchild);
}

void intraBtree(PBTNODE pt)
{
    if(pt==NULL) return ;
    intraBtree(pt->plchild);
    cout<<pt->data<<endl;
    intraBtree(pt->prchild);
}

void posttraBtree(PBTNODE pt)
{
    if(pt==NULL) return ;
    posttraBtree(pt->plchild);
    posttraBtree(pt->prchild);
    cout<<pt->data<<endl;
}

void createBtnode(PBTNODE t)
{
    int temp;
    cin>>temp;
    if(temp!=0)
    {
        PBTNODE pt=(PBTNODE)malloc(BTNODE);
        if(!(*t))
        {
            exit(-1);
        }
        (*t)->data=temp;
        createBtnode((*t));
        createBtnode((*t));
    }
}

//静态链式二叉树
PBTNODE createBtnode()
{
    PBTNODE pa=(PBTNODE)malloc(sizeof(BTNODE));
    PBTNODE pb=(PBTNODE)malloc(sizeof(BTNODE));
    PBTNODE pc=(PBTNODE)malloc(sizeof(BTNODE));
    PBTNODE pd=(PBTNODE)malloc(sizeof(BTNODE));
    PBTNODE pe=(PBTNODE)malloc(sizeof(BTNODE));

    pa->data='A';
    pb->data='B';
    pc->data='C';
    pd->data='D';
    pe->data='E';

    pa->plchild=pb;
    pa->prchild=pc;
    pb->plchild=pb->prchild=NULL;
    pc->plchild=pd;
    pc->prchild=NULL;
    pd->plchild=NULL;
    pd->prchild=pe;
    pe->plchild=pe->prchild=NULL;

    return pa;
}
*/







/*汉诺塔
#include <iostream>
#include <malloc.h>
using namespace std;

void hannuota(int n,char A,char B,char C)
{
    if(n==1)
    {
        cout<<"将编号为"<<n<<"的盘子从"<<A<<"转移到"<<C<<endl;
    }
    else
    {
        hannuota(n-1,A,C,B);
        cout<<"将编号为"<<n<<"的盘子从"<<A<<"转移到"<<C<<endl;
        hannuota(n-1,B,A,C);
    }
}

int main()
{
    char ch1='A';
    char ch2='B';
    char ch3='C';

    int n;

    cout<<"请输入盘子的个数:";
    cin>>n;

    hannuota(n,'A','B','C');
    return 0;
}*/











/*求1+2+3+...+100的和
int f(int n)
{
    if(n==1) return 1;
    else return n+f(n-1);
}

int main()
{
    cout<<f(100);
    return 0;
}*/




/*阶乘的递归实现
规模大的问题的解决依赖于规模较小的问题的解决而解决
当规模递减到某种程度,当这个规模下问题可以很容易解
决时再递推回来,这个问题就解决了
int f(int n)
{
    if(n==1) return 1;
    else return n*f(n-1);
}

int main()
{
    cout<<f(3);
    return 0;
}*/







/*求阶乘的循环实现
int main()
{
    int val,m=1;
    cout<<"请输入一个数字";
    cout<<"val=";
    cin>>val;
    for(int i=1;i<=val;i++)
    {
        m=m*i;
    }
    cout<<m<<endl;
    return 0;
}*/

/*递归的简单使用
void f(int n)
{
    if(n==1) cout<<"hhh"<<endl;
    else f(n-1);
}
int main()
{
    f(10);//只输出一个hhh
    return 0;
}*/
/*
void f();
void g();
void k();

int main()
{
    f();
    cout<<"0000"<<endl;
    return 0;
}
void f()
{
    cout<<"FFFF"<<endl;
    g();
    cout<<"1111"<<endl;
}
void g()
{
    cout<<"GGGG"<<endl;
    k();
    cout<<"2222"<<endl;
}
void k()
{
    cout<<"KKKK"<<endl;
}

*/















/*队列
#include <iostream>
#include <malloc.h>
using namespace std;

typedef struct Queue
{
    int * pbase;
    int front;
    int rear;
}QUEUE,* PQUEUE;

void init(QUEUE * p2.求阶乘Q);//队列初始化
bool ruQueue(QUEUE * pQ,int val);//入队
bool fullQueue(QUEUE * pQ);//判断队列是否满
void traverseQueue(QUEUE * pQ);//遍历队列
bool emptyQueue(QUEUE * pQ);//判断是否为空
bool chuQueue(QUEUE * pQ,int * pval);//出队并返回删除元素

int main()
{
    QUEUE Q;
    int val;
    init(&Q);
    ruQueue(&Q,1);
    ruQueue(&Q,2);
    ruQueue(&Q,3);
    ruQueue(&Q,4);
    ruQueue(&Q,5);
    ruQueue(&Q,6);
    ruQueue(&Q,7);
    traverseQueue(&Q);
    if(chuQueue(&Q,&val))
    {
        cout<<val<<endl;
    }
    else
    {
        cout<<"false"<<endl;
    }
    traverseQueue(&Q);
    return 0;
}

void init(QUEUE * pQ)
{
    pQ->pbase=(int *)malloc(sizeof(int)*6);
    pQ->front=0;
    pQ->rear=0;
}

bool ruQueue(QUEUE * pQ,int val)
{
    if(fullQueue(pQ))
    {
        return false;
    }
    else
    {
        pQ->pbase[pQ->rear]=val;
        pQ->rear=(pQ->rear+1)%6;//数组长度
        return true;
    }
}

bool fullQueue(QUEUE * pQ)
{
    if((pQ->rear+1)%6==pQ->front)
    {
        return true;
    }
    else return false;
}

void traverseQueue(QUEUE * pQ)
{
    int i=pQ->front;
    while(i!=pQ->rear)
    {
        cout<<pQ->pbase[i]<<" ";
        i=(i+1)%6;
    }
}
bool emptyQueue(QUEUE * pQ)
{
    if(pQ->front==pQ->rear)
        return true;
    else return false;
}

bool chuQueue(QUEUE * pQ,int * pval)//返回删除元素
{
    if(emptyQueue(pQ))
    {
        return false;
    }
    else
    {
        *pval=pQ->pbase[pQ->front];
        pQ->front=(pQ->front+1)%6;
        return true;
    }
}*/


/*栈
#include <iostream>
#include <malloc.h>
#include <cstdio>
#include <cstdlib>
using namespace std;

typedef struct node
{
    int data;
    struct node * pnext;
}NODE,* PNODE;

typedef struct stack1
{
    PNODE ptop;//指向栈顶元素的节点
    PNODE pbottem;//指向栈底下面的无用节点
}STACK,* PSTACK;

void initstack(PSTACK ps);
void pushstack(PSTACK ps,int val);
void traversestack(PSTACK ps);
bool popstack(PSTACK ps,int * pval);
void clearstack(PSTACK ps);

int main()
{
    STACK s;
    int val;
    initstack(&s);//建立一个空栈
    pushstack(&s,1);//压栈
    pushstack(&s,2);
    pushstack(&s,3);
    pushstack(&s,4);
    pushstack(&s,5);
    traversestack(&s);//遍历输出栈
    if(popstack(&s,&val))
    {
        cout<<val<<endl;
    }
    traversestack(&s);
    clearstack(&s);
    traversestack(&s);
    return 0;
}

void initstack(PSTACK ps)
{
    PNODE pnew=(PNODE)malloc(sizeof(NODE));
    if(pnew==NULL)
    {
        cout<<"分配失败"<<endl;
        exit(-1);
    }
    ps->ptop=pnew;
    ps->pbottem=pnew;
    pnew->pnext=NULL;
}

void pushstack(PSTACK ps,int val)
{
    PNODE pnew=(PNODE)malloc(sizeof(NODE));
    pnew->data=val;
    pnew->pnext=ps->ptop;
    ps->ptop=pnew;
    return ;
}

void traversestack(PSTACK ps)
{
    PNODE pnew=ps->ptop;
    while(pnew!=ps->pbottem)
    {
        cout<<pnew->data<<" ";
        pnew=pnew->pnext;
    }
    return ;
}

bool popstack(PSTACK ps,int * pval)
{
    if(ps->ptop==ps->pbottem)
    {
        return false;
    }
    else{
        PNODE pnew=ps->ptop;
        *pval=pnew->data;
        ps->ptop=ps->ptop->pnext;
        free(pnew);
    }
}

void clearstack(PSTACK ps)
{
    if(ps->ptop==ps->pbottem)
    {
        return ;
    }
    else {
        PNODE p=ps->ptop;
        PNODE q=NULL;
        while(p!=ps->pbottem)
        {
            q=p->pnext;
            free(p);
            p=q;
        }
        ps->ptop=ps->pbottem;
        return ;
    }
}*/
/*
#include <iostream>
#include <malloc.h>
using namespace std;
void f(int k);//动态分配的内存在堆里面分配内存,静态非配的内存再栈里面分配
int main()
{
    int i=10;
    int * p=(int *)malloc(200);
    return 0;
}
void f(int k)
{
    int m;
    double * q=(double *)malloc(200);
}
*/



/*链表的实现与功能
#include <iostream>
#include <malloc.h>
#include <cstdlib>
using namespace std;

typedef struct node
{
    int data;
    struct node * pnext;
}NODE,* PNODE;


PNODE create_list();//创建一个链表
void traverse_list(PNODE phead);//遍历链表

bool isEmpty(PNODE phead);//判断是否为空
int lengthList(PNODE phead);//求长度
bool insertList(PNODE phead,int i,int val);//插入
bool deleteList(PNODE phead,int i,int * val);//删除
void sortList(PNODE phead);//排序

int main()
{
    PNODE phead=NULL;

    phead=create_list();//创建一个非循环单链表,将首地址分配给phead;

    traverse_list(phead);//遍历

    if(isEmpty(phead)==1) cout<<"空"<<endl;
    else cout<<"不空"<<endl;

    int x=lengthList(phead);
    cout<<x<<endl;

    sortList(phead);

    traverse_list(phead);

    insertList(phead,4,33);//1~(phead->data)-1;

    traverse_list(phead);
    int val;
    deleteList(phead,4,&val);
    cout<<val;
    traverse_list(phead);
    return 0;
}
PNODE create_list()//是对不同节点的存储,每次开辟一个节点的空间
{
    int len;
    int val;

    cin>>len;//输入链表长度,即链表节点个数

    PNODE phead=(PNODE)malloc(sizeof(NODE));
    if(phead==NULL) cout<<"分配失败"<<endl;

    phead->data=len;

    PNODE ptail=phead;
    ptail->pnext=NULL;

    phead->data=0;

    for(int i=0;i<len;i++)
    {
        cout<<"请输入节点值: ";
        cin>>val;//节点值

        PNODE pnew=(PNODE)malloc(sizeof(NODE));
        if(pnew==NULL) cout<<"分配失败"<<endl;

        pnew->data=val;
        ptail->pnext=pnew;
        pnew->pnext=NULL;
        ptail=pnew;

        phead->data++;

    }
    return phead;
}
void traverse_list(PNODE phead)
{
    PNODE p=phead->pnext;
    for(;p!=NULL;)//继续进行程序的条件
    {
        cout<<p->data<<endl;
        p=p->pnext;
    }
    return ;
}

bool isEmpty(PNODE phead)
{
    if(phead->pnext==NULL) return true;
    else return false;
}
int lengthList(PNODE phead)
{
    return phead->data;
}

void sortList(PNODE phead)
{
    PNODE p,q;
    int len=phead->data;
    int i,j,t;
    for(i=0,p=phead->pnext;i<len-1;i++,p=p->pnext)
    {
        for(j=i+1,q=p->pnext;j<len;j++,q=q->pnext)
        {
            if((p->data)>(q->data))
            {
                t=p->data;
                p->data=q->data;
                q->data=t;
            }
        }
    }
    return ;

}

//在phead所指向链表的第pos个节点前插入一个新的节点,值为val
//pos从一开始
bool insertList(PNODE phead,int pos,int val)
{
    int i=0;
    PNODE p=phead;
    while(p!=NULL&&i<pos-1)
    {
        p=p->pnext;
        i++;
    }//指向了pos前面的一个节点
    if(i>pos-1||p==NULL) return false;
    PNODE pnew=(PNODE)malloc(sizeof(NODE));
    if(pnew==NULL)
    {
        cout<<"失败"<<endl;
        exit(-1);
    }
    pnew->data=val;
    PNODE q=p->pnext;
    p->pnext=pnew;
    pnew->pnext=q;
    return true;
}

bool deleteList(PNODE phead,int pos,int * val)
{
    int i=0;
    PNODE p=phead;
    while(p->pnext!=NULL&&i<pos-1)
    {
        p=p->pnext;
        i++;
    }
    if(p->pnext==NULL||i>pos-1)
        return false;

    PNODE q=p->pnext;
    *val=q->data;
    p->pnext=p->pnext->pnext;
    free(q);
    q=NULL;
    return true;
}
*/


/*链表的插入与删除操作
#include <iostream>
using namespace std;

typedef struct node
{
    int data;           //数据域
    struct node * pnext;//指针域
}NODE,* PNODE;//NODE<->struct node;PNODE<->struct node *;
int main()
{
    //p->pnext等价于pnext这个成员,即(*p).pnext,记住它是个成员
    插入//r=p->pnext;p->pnext=q;q->next=r;//r是PNODE类型指针变量
    插入//q->pnext=p->pnext;p->pnext=q;
    删除//p->pnext=p->pnext->pext;三个元素(有瑕疵,不可用)
    删除//r=p->next;p->pnext=p->pnext->pnext;free(r);//释放这个地址的内存,即将这一片内存提醒系统可以使用
    PNODE p=(PNODE)malloc(sizeof(NODE));
    将动态非配的新节点的地址赋给p;
    free (p);
    删除p所指向的节点所占的内存,删除p这个地址的内存
    p->pnext;
    p所指向的结构体变量中的pnext成员本身
    return 0;
}*/
/*typedef的用法
#include <iostream>
using namespace std;
typedef int zhangsan;//为int再多取一个名字,zhangsan等价于int;

typedef struct Student
{
    int sid;
    char name[100];
    char sex;
}ST;            //ST等价于struct Student;
typedef struct Student
{
    int sid;
    char name[100];
    char sex;
}* PST;         //PST就是struct Student *;
typedef struct Student
{
    int sid;
    char name[200];
    int sex;
}ST,* PST;  //ST等价于struct Student,PST就是struct Student *;
int main()
{
    //struct Student st;//ST st;
    //struct Student * p=&st;/ST * p;

    return 0;
}*/



/*连续存储【数组】
#include <iostream>
#include <malloc.h>
#include <cstdio>
using namespace std;

//定义了一个数据类型,该数据类型的名字
//叫做struct Arr
struct Arr
{
    int * pBase;//存储的是数组第一个元素的位置
    int len;//数组所能容纳的最大元素的个数
    int cnt;//当前数组有效元素的个数
    //int increment//自动增长因子
};


void initArr(struct Arr * parr,int length);//初始化
bool appendArr(struct Arr * parr,int var);//追加
bool insertArr(struct Arr * parr,int pos,int val);//插入,pos的值从一开始
bool deleteArr(struct Arr * parr,int pos;int * pval);//删除相应位置的元素,*pval是删除的值
bool get();//获得相应下标的值
bool isEmpty(struct Arr * parr);//判断是否为空
bool isFull(struct Arr * parr);//检查是否为空
void sortArr();//排序
void showArr(struct Arr * parr);//输出数组
void inversionArr(struct Arr * parr);//倒置


int main()
{
    struct Arr arr;
    initArr(&arr,6);
    showArr(&arr);
    appendArr(&arr,1);
    appendArr(&arr,2);
    appendArr(&arr,3);
    appendArr(&arr,4);
    appendArr(&arr,5);

    //appendArr(&arr,6);
    //insertArr(&arr,1,99);

    insertArr(&arr,22,99);
    showArr(&arr);
    return 0;
}

void initArr(struct Arr * parr,int length)
{
    parr->pBase=(int *)malloc(sizeof(int)*length);
    if(parr->pBase==NULL)
    {
        cout<<"动态内存分配失败"<<endl;
        exit(-1);//终止整个程序
    }
    else
    {
        parr->len=length;
        parr->cnt=0;
    }
    return ;
}

bool isEmpty(struct Arr * parr)
{
    if(parr->cnt==0)
        return true;
    else
        return false;
}

void showArr(struct Arr * parr)
{
    if(isEmpty(parr)==1)
        cout<<"数组为空"<<endl;
    else
    {
        for(int i=0;i<parr->cnt;i++)
        {
            cout<<parr->pBase[i]<<endl;
        }
    }
}
bool isFull(struct Arr * parr)
{
    if(parr->cnt==parr->len) return true;
    else return false;
}
bool appendArr(struct Arr * parr,int var)//流程 功能 试数
{
    if(isFull(parr)) return false;
    else
    {
        parr->pBase[parr->cnt]=var;
        ++(parr->cnt);
        return true;
    }
}
bool insertArr(struct Arr * parr,int pos,int val)
{
    if(parr->cnt==parr->len) return false;
    if(pos<1||pos>parr->cnt+1) return false;
    for(int i=parr->cnt-1;i>=pos-1;i--)
    {
        parr->pBase[i+1]=parr->pBase[i];
    }
    parr->pBase[pos-1]=val;
    (parr->cnt)++;
    return true;
}
bool deleteArr(struct Arr * parr,int pos;int * pval)
{
    if(isEmpty(parr))
        return false;
    if(pos<1||pos>parr->cnt)
        return false;
    for(i=pos;i<parr->cnt;i++)
    {
        parr->pBase[i-1]=parr->pBase[i];
    }
    parr->cnt--;
    return true;
}
void inversionArr(struct Arr * parr)
{
    int i=0;
    int j=parr->cnt-1;
    int t;
    while(i<j)
    {
        t=parr->pBase[i];
        parr->pBase[i]=parr->pBase[j];
        parr->pBase[j]=t;
        i++;
        j--;
    }
    return ;
}
void sortArr(struct Arr * parr)
{
    for(int i=0;i<parr->cnt-1;i++)
    {
        for(int j=i+1;j<parr->cnt;j++)
        {
            if(parr->pBase[i]>parr->pBase[j])
            {
                int t=parr->pBase[i];
                parr->pBase[i]=parr->pBase[j];
                parr->pBase[j]=t;
            }
        }
    }
}*/





/*预备知识
#include <iostream>
#include <malloc.h>
using namespace std;
struct Student
{
    int sid;
    int age;
};
struct Student * createStudent();
void showStudent(struct Student * p);
int main()
{
    struct Student * ps;
    ps=createStudent();
    showStudent(ps);
    return 0;
}
struct Student * createStudent()
{
    struct Student * p=(struct Student *)malloc(sizeof(struct Student));
    p->sid=99;
    p->age=120;
    return p;
}
void showStudent(struct Student * p)
{
    cout<<p->sid<<p->age<<endl;
}*/
/*#include <iostream>
using namespace std;
int f();
int main()
{
    int i=10;
    i=f();
    cout<<i<<endl;
}
int f()
{
    int j=20;
    return j;
}*/
/*#include <iostream>
using namespace std;
int main()
{
    int a[5]={4,10,1,2,8};
    int len;
    cin>>len;
    int * pArr=(int *)malloc(sizeof(int)*len);
            //动态分配sizeof(int)*len个字节的内存
            //int * 强制转换地址的类型,以规定每个数据所占用的空间
    *pArr=-1;//a[0]=-1;
    pArr[1]=10;//a[1]=10;pArr就是a;
    free(pArr);//把pArr所申请的的内存释放;
    return 0;
}*/
/*#include <iostream>
#include <cstring>
using namespace std;
struct Student
{
    int sid;
    char name[200];
    int age;
};
void f(struct Student * pst);
void ff(struct Student st);
int main()
{
    struct Student st;//已经为st分配了内存
    int i;
    f(&st);
    ff(st);
    cout<<st.sid<<st.name<<st.age;
    return 0;
}
void ff(struct Student st)//这种方式耗内存 耗时间 不推荐
{
    cout<<st.sid<<st.name<<st.age<<endl;
}
void f(struct Student * pst)
{
    pst->sid=99;
    strcpy(pst->name,"zhenghua");
    (*pst).age=22;
}*/

/*#include <iostream>
using namespace std;
struct Student
{
    int sid;
    char name[200];
    int age;
};
int main()
{
    struct Student st={1000,"lihua",20};
    struct Student * pst;
    pst=&st;
    pst->sid=99;//pst->sid       等价于 (*pst).sid,
                //而(*pst).sid 等价于  st.sid
                //所以pst->      等价于  st.sid
    cout<<pst->sid<<endl;
    return 0;
}*/
/*#include <iostream>
using namespace std;
struct Student//数据类型是struct Student
{
    int sid;
    string name;
    int age;
};//分号不能省
int main()
{
    struct Student st={1000,"zhengsan",20};
    cout<<st.sid<<" "<<st.name<<" "<<st.age<<endl;
    st.name="lihua";
    cout<<st.name<<endl;
    return 0;
}*/



/*#include <iostream>
using namespace std;
void f(int * * q);
int main()
{
    int i=9;
    int * p=&i;
    cout<<p<<endl;
    f(&p);
    cout<<p<<endl;
    return 0;
}
void f(int * * q)
{
    *q=(int *)0xFFFFFFFF;
}*/
/*#include <iostream>
using namespace std;
void f(int * p);

int main()
{
    int i=10;
    f(&i);
    cout<<i<<endl;
    return 0;
}
void f(int * p)
{
    *p=99;
}*/
/*#include <iostream>
using namespace std;
int main()
{
    double * p;
    double x=66.6;
    p=&x;//x占8个地址,一个字节一个地址,
         //p存放的是第一个字节或者第八个
         //字节的地址
    double array[3]={1.1,2.2,3.3};
    double * q;
    q=array;//或者q=&array[0];
    cout<<q<<endl;//输出的是十六进制整数即地址
    q=&array[1];
    cout<<q<<endl;
    cout<<sizeof(p)<<" "<<sizeof(q)<<endl;
    return 0;
}*/
/*#include <iostream>
using namespace std;
void showArray(int *p,int len);
int main()
{
    int a[5]={1,2,3,4,5};
    showArray(a,5);
    cout<<a[0]<<endl;
    return 0;
}
void showArray(int *p,int len)
{
    p[0]=-1;
    for(int i=0;i<len;i++)
        cout<<p[i]<<endl;
}*/
/*#include <iostream>
#include <cstdio>
using namespace std;
void f(int *i)
{
    *i=100;
}
void f1(int &j)//
{
    j=100;
}
int main()
{
    int i=9;
    f(&i);
    cout<<i<<endl;
    int j=9;
    f1(j);
    cout<<j<<endl;

}*/
/*int main()
{
    int * p;//p是个指针变量,int *表示该p变量只能存放int型变量的地址
    int i=10;
    int j;
    p=&i;
    j=*p;
    cout<<j<<endl;
    return 0;
}*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值