数据结构1

CCNU开课了,听了几节课,感觉神马都不会。。。。。

上了一节实验课,酱油,就敲了个结构体,初始化,啥都没敲出来,郁闷

然后开学了,各种无聊,但是感觉没时间搞ACM了。

坐了一晚上,终于搞定了实验一。。。累啊


先敲完了十二个基本的函数:

顺序表:

//代码很搓,大神请绕行,请勿鄙视

#include <stdio.h>
#include <cstdlib>
#include <iostream>
using namespace std;
#define ElemType int
const int LIST_INIT_SIZE=100;
const int LISTINCREMENT=10;
typedef struct
{
    ElemType *elem;
    int length;
    int listsize;
    int incrementsize;
}Sqlist;

void InitList(Sqlist &L,int maxsize,int incresize)//初始化
{
    L.elem=new ElemType[maxsize];
    L.length=0;
    L.listsize=maxsize;
    L.incrementsize=incresize;
}

void DestroyList(Sqlist &L)//销毁线性表
{
    delete[]L.elem;
    L.listsize=0;
    L.length=0;
}

void ClearList(Sqlist &L)
{
    delete[]L.elem;
    L.length=0;
}

int ListEmpty(Sqlist L)
{
    if(L.length==0)
    return 1;
    return 0;
}

int ListLength(Sqlist L)
{
    return L.length;
}

void GetElem(Sqlist L,ElemType i,ElemType &e)
{
    if(i<1||i>L.length)
    {
        cout<<i<<"不合法"<<endl;
        return;
    }
    e=*(L.elem+i);
}

int LocateElem(Sqlist L,ElemType e)
{
    int i=0;
    int *p=L.elem;
    while(i<=L.length&&*p++!=e) ++i;
    if(i<=L.length) return i;
    else
    {
        //cout<<e<<"不合法"<<endl;
        return 0;
    }
}

void PriorElem(Sqlist L,ElemType cur_e,ElemType &pre_e)
{
    int i=1;
    ElemType *p=L.elem+1;
    while(i<=L.length&&*p!=cur_e)
    {
        p++;
        i++;
    }
    if(i>L.length||i==1)
    {
        cout<<"求cur_e的PriorElem"<<" ";
        cout<<cur_e<<"不合法"<<endl;
        return;
    }
    else
    {
        pre_e=*--p;
        return ;
    }
}

void NextElem(Sqlist L,ElemType cur_e,ElemType &next_e)
{
    int i=1;
    ElemType *p=L.elem;
    while(i<L.length&&*p!=cur_e)
    {
        i++;
        p++;
    }
    if(i==L.length)
    {
        cout<<"求cur_e的NextElem"<<" ";
        cout<<cur_e<<"不合法"<<endl;
        return;
    }
    else
    {
        next_e=*++p;
        return ;
    }
}

void ListInsert(Sqlist &L,ElemType i,ElemType e)
{
    ElemType *newbase,*p,*q;
    if(i<1||i>L.length+1)
    {
        cout<<i<<"不合法"<<endl;
        return;
    }
    if(L.length>=L.listsize)
    {
        if(!(newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType))))
        {
            cout<<"动态内存分配不够"<<endl;
        }
        L.elem=newbase;
        L.listsize+=LISTINCREMENT;
    }
    q=L.elem+i;
    for(p=L.elem+L.length;p>=q;--p)
    *(p+1)=*p;
    *q=e;
    ++L.length;
}

void ListDelete(Sqlist &L,int i,ElemType &e)
{
    ElemType *p,*q;
    if(i<1||i>L.length)
    {
        //cout<<i<<L.length<<endl;
        cout<<i<<"不合法"<<endl;
        return;
    }
    p=L.elem+i;
    e=*p;
    q=L.elem+L.length;
    for(;p<q;++p)
     *(p)=*(p+1);
    L.length--;
}

void ListTraverse(Sqlist L)
{
    int flag=0;
    for(int i=1;i<=L.length;i++)
    {
        if(!flag)
        {
            cout<<L.elem[i];
            flag=1;
        }
        else
        cout<<" "<<L.elem[i];
    }
    cout<<endl;
}

int main()
{
    Sqlist La,Lb;
    InitList(La,LIST_INIT_SIZE,LISTINCREMENT);
    InitList(Lb,LIST_INIT_SIZE,LISTINCREMENT);
    int n,e;
    cin>>n;
    La.length=n;
    for(int i=1;i<=n;i++)
    cin>>La.elem[i];

    /*   删除元素
    ListDelete(La,4,e);
    cout<<La.length<<endl;
    for(int i=1;i<=La.length;i++)
    cout<<La.elem[i]<<" ";
    cout<<endl;
    */


    //   销毁线性表 or 重置为空表
    //DestroyList(La);
    //ClearList(La);
    /*
    cout<<La.length<<endl;
    if(ListEmpty(La))   //   判断是否为空表
    cout<<"null"<<endl;
    else
    cout<<"occurpied"<<endl;
    //
    */

    // 得到第i个元素
    /*
    GetElem(La,6,e);
    cout<<e<<endl;
    */

    //  定为元素位置
    /*
    e=5;
    cout<<LocateElem(La,e)<<endl;
    */

    //  求 PriorElem or NextElem
    /*
    ElemType pre_e,next_e;
    PriorElem(La,5,pre_e);
    NextElem(La,5,next_e);
    cout<<pre_e<<endl;
    cout<<next_e<<endl;
    */

    //  插入元素
    /*
    ListInsert(La,5,2);
    ListTraverse(La);
    */

    //  删除元素
    /*
    ListDelete(La,5,e);
    ListTraverse(La);
    cout<<e<<endl;
    */

    return 0;
}


链表:(13个函数操作) (12个基本+1个create)


#include <iostream>
#include <cstdlib>
using namespace std;
#define ElemType int
typedef struct Lnode
{
    ElemType data;
    struct Lnode *next;
}Lnode,*LinkList;
void InitList(LinkList &L)
{
    L=(LinkList)malloc(sizeof(Lnode));
    if(!L)
      cout<<"存储分配失败"<<endl;
    L->next=NULL;
}
void DestroyList(LinkList &L)
{
    LinkList q;
    while(L->next)
    {
        q=L->next;
        free(L);
        L=q;
    }
    delete L->next;
}
void ClearList(LinkList L)
{
    LinkList p,q;
    p=L->next;
    while(p)
    {
        q=p->next;
        free(p);
        p=q;
    }
    L->next=NULL;
}
int ListEmpty(LinkList L)
{
    if(L->next!=L)
        return 1;
    return 0;
}
int ListLength(LinkList L)
{
    int i=1;
    LinkList p=L->next;
    while(p)
    {
        i++;
        p=p->next;
    }
    return i;
}
void GetElem(LinkList L,int i,ElemType &e)
{
    if(i==1)
    {
        e=L->data;
        return ;
    }
    LinkList p=L->next;
    int j=1;
    while(p&&j<i-1)
    {
        p=p->next;
        j++;
    }
    if(!p||j>i)
    {
        cout<<i<<" 不合法\n";
        return ;
    }
    e=p->data;
}
int LocateElem(LinkList L,ElemType e)
{
    LinkList p=L;
    int i=0;
    if(p->data==e)
    return 1;
    while(p)
    {
        i++;
        if(p->data==e)
        return i;
        p=p->next;
    }
}
void PriorElem(LinkList L,ElemType cur_e,ElemType &pre_e)
{
    if(LocateElem(L,cur_e)==2)
    {
        int e;
        GetElem(L,1,e);
        pre_e=e;
        return;
    }
    LinkList q,p=L->next;
    while(p->next)
    {
        q=p->next;
        if(q->data==cur_e)
        {
            pre_e=p->data;
            return ;
        }
        p=q;
    }
    cout<<cur_e<<"不合法\n";
}
void NextElem(LinkList L,ElemType cur_e,ElemType &next_e)
{
    LinkList p=L->next;
    while(p->next)
    {
        if(p->data==cur_e)
        {
            next_e=p->next->data;
            return ;
        }
        p=p->next;
    }
    cout<<cur_e<<"不合法\n";
}
void ListInsert1(LinkList &L,int i,int e)//后插
{
    LinkList p;
    LinkList s;
    s=(LinkList)malloc(sizeof(LinkList));
    s->data=e;
    p=L;
    int k=1;
    while(p)
    {
        if(k==i)
        {
            s->next=p->next;
            p->next=s;
            return;
        }
        k++;
        p=p->next;
    }
}
void ListInsert2(LinkList &L,int i,int e)//前插
{
    LinkList p;
    LinkList s;
    s=(LinkList)malloc(sizeof(LinkList));
    s->data=e;
    p=L;
    int k=1;
    if(i==1)
    {
        s->next=L;
        L=s;
        return;
    }
    else
    {
        while(p)
        {
            if(k==i-1)
            {
                s->next=p->next;
                p->next=s;
                return;
            }
            p=p->next;
            k++;
        }
    }
}
void ListDelete(LinkList L,int i,ElemType &e)
{
    LinkList p=L,q;
    if(i==1)
    {
        L->data=(L->next)->data;
    }
    int j=1;
    while(p->next&&j<i-1)
    {
        p=p->next;
        j++;
    }
    q=p->next;
    p->next=q->next;
    e=q->data;
    free(q);
}
void ListTraverse(LinkList L)
{
    LinkList p=L;
    while(p->next)
    {
        int e=p->data;
        cout<<e<<" ";
        p=p->next;
    }
    cout<<p->data<<endl;
    return ;
}
void CreateList(LinkList &L,ElemType a[],int n)
{
    L=NULL;
    LinkList s;
    for(int i=n;i>0;i--)
    {
        s=new Lnode;
        s->data=a[i];
        s->next=L;
        L=s;
    }
}

int main()
{
    LinkList La;
    LinkList p,q;
    InitList(La);
    int n;
    int e,pre_e,next_e;
    int a[100];
    cin>>n;
    for(int i=1;i<=n;i++)
    cin>>a[i];
    CreateList(La,a,n);//创建链表
    ListInsert1(La,3,222);
    ListTraverse(La);
    ListInsert2(La,3,22);
    ListTraverse(La);//输出链表
    return 0;
}




实验一 : 利用线性表实现两个整数集合的交、并、差的运算。

(日,直接数组模拟的嘛,吃饱了撑着用线性表。。。)


#include <stdio.h>
#include <cstdlib>
#include <iostream>
using namespace std;
#define ElemType int
const int LIST_INIT_SIZE=100;
const int LISTINCREMENT=10;
typedef struct
{
    ElemType *elem;
    int length;
    int listsize;
    int incrementsize;
}Sqlist;

void InitList(Sqlist &L,int maxsize,int incresize)//初始化
{
    L.elem=new ElemType[maxsize];
    L.length=0;
    L.listsize=maxsize;
    L.incrementsize=incresize;
}

void DestroyList(Sqlist &L)//销毁线性表
{
    delete[]L.elem;
    L.listsize=0;
    L.length=0;
}

void ClearList(Sqlist &L)
{
    delete[]L.elem;
    L.length=0;
}

int ListEmpty(Sqlist L)
{
    if(L.length==0)
    return 1;
    return 0;
}

int ListLength(Sqlist L)
{
    return L.length;
}

void GetElem(Sqlist L,ElemType i,ElemType &e)
{
    if(i<1||i>L.length)
    {
        cout<<i<<"不合法"<<endl;
        return;
    }
    e=*(L.elem+i);
}

int LocateElem(Sqlist L,ElemType e)
{
    int i=0;
    int *p=L.elem;
    while(i<=L.length&&*p++!=e) ++i;
    if(i<=L.length) return i;
    else
    {
        //cout<<e<<"不合法"<<endl;
        return 0;
    }
}

void PriorElem(Sqlist L,ElemType cur_e,ElemType &pre_e)
{
    int i=1;
    ElemType *p=L.elem+1;
    while(i<=L.length&&*p!=cur_e)
    {
        p++;
        i++;
    }
    if(i>L.length||i==1)
    {
        cout<<"求cur_e的PriorElem"<<" ";
        cout<<cur_e<<"不合法"<<endl;
        return;
    }
    else
    {
        pre_e=*--p;
        return ;
    }
}

void NextElem(Sqlist L,ElemType cur_e,ElemType &next_e)
{
    int i=1;
    ElemType *p=L.elem;
    while(i<L.length&&*p!=cur_e)
    {
        i++;
        p++;
    }
    if(i==L.length)
    {
        cout<<"求cur_e的NextElem"<<" ";
        cout<<cur_e<<"不合法"<<endl;
        return;
    }
    else
    {
        next_e=*++p;
        return ;
    }
}

void ListInsert(Sqlist &L,ElemType i,ElemType e)
{
    ElemType *newbase,*p,*q;
    if(i<1||i>L.length+1)
    {
        cout<<i<<"不合法"<<endl;
        return;
    }
    if(L.length>=L.listsize)
    {
        if(!(newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType))))
        {
            cout<<"动态内存分配不够"<<endl;
        }
        L.elem=newbase;
        L.listsize+=LISTINCREMENT;
    }
    q=L.elem+i;
    for(p=L.elem+L.length;p>=q;--p)
    *(p+1)=*p;
    *q=e;
    ++L.length;
}

void ListDelete(Sqlist &L,int i,ElemType &e)
{
    ElemType *p,*q;
    if(i<1||i>L.length)
    {
        //cout<<i<<L.length<<endl;
        cout<<i<<"不合法"<<endl;
        return;
    }
    p=L.elem+i;
    e=*p;
    q=L.elem+L.length;
    for(;p<q;++p)
     *(p)=*(p+1);
    L.length--;
}

void ListTraverse(Sqlist L)
{
    int flag=0;
    for(int i=1;i<=L.length;i++)
    {
        if(!flag)
        {
            cout<<L.elem[i];
            flag=1;
        }
        else
        cout<<" "<<L.elem[i];
    }
    if(!flag)
    cout<<"null"<<endl;
    else
    cout<<endl;
}

void bing(Sqlist La,Sqlist Lb)
{
    Sqlist Lc;
    ElemType e;
    InitList(Lc,LIST_INIT_SIZE,LISTINCREMENT);
    for(int i=1;i<=La.length;i++)
    ListInsert(Lc,Lc.length+1,La.elem[i]);
    for(int i=1;i<=Lb.length;i++)
    if(!LocateElem(Lc,Lb.elem[i]))
    ListInsert(Lc,Lc.length+1,Lb.elem[i]);
    ListTraverse(Lc);
}
void jiao(Sqlist La,Sqlist Lb)
{
    Sqlist Lc;
    ElemType e;
    InitList(Lc,LIST_INIT_SIZE,LISTINCREMENT);
    for(int i=1;i<=La.length;i++)
    {
        GetElem(La,i,e);
        if(LocateElem(Lb,e))
        ListInsert(Lc,Lc.length+1,e);
    }
    ListTraverse(Lc);
}
void cha(Sqlist La,Sqlist Lb)
{
    Sqlist Lc;
    ElemType e;
    InitList(Lc,LIST_INIT_SIZE,LISTINCREMENT);
    for(int i=1;i<=La.length;i++)
    {
        GetElem(La,i,e);
        if(!LocateElem(Lb,e))
        ListInsert(Lc,Lc.length+1,e);
    }
    ListTraverse(Lc);
}
int main()
{
    Sqlist La,Lb;
    InitList(La,LIST_INIT_SIZE,LISTINCREMENT);
    InitList(Lb,LIST_INIT_SIZE,LISTINCREMENT);
    cout<<"Input the length of set A :"<<endl;
    cin>>La.length;
    cout<<"Input the elements in set A :"<<endl;
    for(int i=1;i<=La.length;i++)
    cin>>La.elem[i];
    cout<<"Input the length of set B :"<<endl;
    cin>>Lb.length;
    cout<<"Input the elements in set B :"<<endl;
    for(int i=1;i<=Lb.length;i++)
    cin>>Lb.elem[i];
    cout<<"Union of set A and set B :"<<endl;
    bing(La,Lb);
    cout<<"Mix of set A and set B :"<<endl;
    jiao(La,Lb);
    cout<<"the difference set of A and B :"<<endl;
    cha(La,Lb);
    cout<<"the difference set of B and A :"<<endl;
    cha(Lb,La);
    //ListTraverse(La);
    //ListTraverse(Lb);
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值