大二 第一次数据结构作业 (数组的排序,删除,查找,插入,合并)(线性表)

来源:互联网 发布:移动网络电话号码 编辑:程序博客网 时间:2024/05/22 00:12

大二  第一次数据结构作业  (数组的排序, 删除,查找,插入,两有序数组的合并)


#include<stdio.h>int a[1100],b[1100],c[2200];int main(){    int n,i;    int x;    int id;    printf("请输入a数组长度n:\n");    scanf("%d",&n);    printf("请输入n个数:\n");    for(i=0; i<n; i++)    {        scanf("%d",&a[i]);    }    ///排序;    printf("数组a从小到大排序后的结果是:\n");    for(i=0; i<n; i++)    {        for(int j=i+1; j<n; j++)        {            if(a[i]>a[j])            {                int t;                t=a[i];                a[i]=a[j];                a[j]=t;            }        }    }    for(i=0; i<n; i++)        printf("%d ",a[i]);    printf("\n\n");   ///插入;    printf("请输入a数组长度n:\n");    scanf("%d",&n);    printf("请输入n个数:\n");    for(i=0; i<n; i++)    {        scanf("%d",&a[i]);    }    printf("请输入要插入元素:\n");    scanf("%d",&x);    printf("请输入插入的下标:\n");    scanf("%d",&id);    if(id<=0 || id>n)        printf("输入下标有误!\n");    else    {        printf("插入新元素后的数组是:\n");        for(i=0; i<n; i++)        {            if(i+1==id)            {                for(int j=n+1; j>=i; j--)                {                    a[j]=a[j-1];                }                a[i]=x;            }        }        for(i=0; i<n+1; i++)            printf("%d ",a[i]);        printf("\n\n");    }    ///查找;    printf("请输入a数组长度n:\n");    scanf("%d",&n);    printf("请输入n个数:\n");    for(i=0; i<n; i++)    {        scanf("%d",&a[i]);    }    printf("请输入要查找的元素:\n");    scanf("%d",&x);    for(i=0; i<n; i++)    {        if(a[i]==x)            break;    }    if(i==n)        printf("该元素不在数组内。\n\n");    else        printf("该元素在数组内。\n\n");   ///删除;    printf("请输入a数组长度n:\n");    scanf("%d",&n);    printf("请输入n个数:\n");    for(i=0; i<n; i++)    {        scanf("%d",&a[i]);    }    printf("请输入要删除的元素下标:\n");    scanf("%d",&id);    if(id<=0 || id>n)        printf("输入下标有误!\n");    else    {        printf("删除后的数组是:\n");        for(i=0;i<n;i++)        {            if(i==id)            {                for(int j=i-1;j<n-1;j++)                {                    a[j]=a[j+1];                }            }        }        for(i=0;i<n-1;i++)        {            printf("%d ",a[i]);        }        printf("\n\n");    }    ///合并;    int m;    printf("请输入有序数组a的长度n:\n");    scanf("%d",&n);    printf("请输入n个数:\n");    for(i=0; i<n; i++)    {        scanf("%d",&a[i]);    }    printf("请输入有序数组b的长度m:\n");    scanf("%d",&m);    printf("请输入m个数:\n");    for(i=0; i<m; i++)    {        scanf("%d",&b[i]);    }    printf("两个数组合并结果:\n");    int j=0,k=0;    i=0;    while(i<n && j<m)    {        if(a[i] <= b[j])        {            c[k++]=a[i++];        }        else        {            c[k++]=b[j++];        }    }    while(i<n)    {        c[k++]=a[i++];    }    while(j<m)    {        c[k++]=b[j++];    }    for(i=0;i<k;i++)        printf("%d ",c[i]);    printf("\n");    return 0;}


 

上课时改成函数来写了,习惯不好,害死人....

#include<stdio.h>const int maxsize=1100;int a[maxsize],b[maxsize],c[maxsize*2];int n,m,i,x;int id;void Input()   ///输入a[]数组{printf("请输入a数组长度n:\n");    scanf("%d",&n);if(n<=0)printf("抱歉! 输入数组长度有误! \n");else if(n>=maxsize)printf("抱歉! 输入长度超过最大内存长度! \n");else{printf("请输入n个数:\n");for(i=0; i<n; i++){scanf("%d",&a[i]);}}}void Sort(int a[], int n)  ///将数组a[]从小到大排序;{    printf("数组a从小到大排序后的结果是:\n");    for(i=0; i<n; i++)    {        for(int j=i+1; j<n; j++)        {            if(a[i]>a[j])            {                int t;                t=a[i];                a[i]=a[j];                a[j]=t;            }        }    }    for(i=0; i<n; i++)        printf("%d ",a[i]);    printf("\n\n");}void Insert(int a[], int id, int x, int n)   ///在数组a[]的id位置插入元素x;{if( n==maxsize-1)printf("数组已达到最大内存,不可插入! \n\n");else{printf("请输入要插入元素:\n");scanf("%d",&x);printf("请输入插入的下标:\n");scanf("%d",&id);if(id<=0 || id>n)printf("输入下标有误!\n");else{printf("插入新元素后的数组是:\n");for(i=0; i<n; i++){if(i+1==id){for(int j=n+1; j>=i; j--){a[j]=a[j-1];}a[i]=x;}}for(i=0; i<n+1; i++)printf("%d ",a[i]);printf("\n\n");}}}void Search(int a[], int x, int n)   ///查找数组a[]中是否有x元素;{printf("请输入要查找的元素:\n");    scanf("%d",&x);    for(i=0; i<n; i++)    {        if(a[i]==x)            break;    }    if(i==n)        printf("该元素不在数组内。\n\n");    else        printf("该元素在数组内。\n\n");}void Delete(int a[], int id, int n)    ///删除数组a[]中的id位置元素;{printf("请输入要删除的元素下标:\n");    scanf("%d",&id);    if(id<=0 || id>n)        printf("输入下标有误!\n");    else    {        printf("删除后的数组是:\n");        for(i=0;i<n;i++)        {            if(i==id)            {                for(int j=i-1;j<n-1;j++)                {                    a[j]=a[j+1];                }            }        }        for(i=0;i<n-1;i++)        {            printf("%d ",a[i]);        }        printf("\n\n");    }}void Input1()   ///输入b[]{printf("请输入b数组长度m:\n");    scanf("%d",&m);if(m<=0)printf("抱歉! 输入数组长度有误! \n");else if(m>=maxsize)printf("抱歉! 输入长度超过最大内存长度! \n");else{printf("请输入m个数:\n");for(i=0; i<m; i++){scanf("%d",&b[i]);}}}void Merge(int a[],int b[])  ///合并a[],b[],两个有序数组;{    printf("两个数组合并结果:\n");    int j=0,k=0;    i=0;    while(i<n && j<m)    {        if(a[i] <= b[j])        {            c[k++]=a[i++];        }        else        {            c[k++]=b[j++];        }    }    while(i<n)    {        c[k++]=a[i++];    }    while(j<m)    {        c[k++]=b[j++];    }    for(i=0;i<k;i++)        printf("%d ",c[i]);    printf("\n");}int main(){    Input();Sort( a, n);Input();Insert( a, id, x, n);Input();Search( a, x, n);Input();Delete( a, id, n);Input();Input1();Merge( a, b);    return 0;}


 


本以为是一次简单的作业,可我还是太小看数据结构了,下面的是线性表的顺序存储结构来写的:

#include<iostream>#include<stdlib.h>using namespace std;typedef int ElemType; ///ElemType 为可定义的数据类型,此设为int类型#define MAXSIZE 100///顺序表可能达到的最大长度#define LISTINCREMENT 10    ///顺序表存储空间的分配增量#define OK 1#define OVERFLOW -2#define ERROR 0typedef int Status;typedef struct{ElemType *elem;///存储空间的基地址int length;            ///当前长度    int listsize;           ///当前分配的存储容量}SqList;Status InitList_Sq(SqList &L){///顺序表的初始化;///构造一个空的顺序表L;L.elem= (ElemType *)malloc(MAXSIZE*sizeof(ElemType));if(!L.elem)        exit(OVERFLOW);     ///存储分配失败;L.length = 0;            ///空表长度为0;L.listsize = MAXSIZE;    ///初始化存储容量;return OK;}int LocateElem_Sq(SqList L,ElemType e){ /// 顺序表的查找;    ///查找元素e是否在顺序表L中;在的话,返回最小下标,不在则返回0;    int i=1;    ElemType *p = L.elem;    while(i<=L.length && *p!=e ){        ++i;        p++;    }if(i<=L.length)        return i;    else    return 0;}Status ListInsert_Sq(SqList &L,int i,ElemType e){  /// 顺序表的插入;///在顺序表L中第i个位置之前插入新的元素e;if((i<1)||(i>L.length+1)) return ERROR;     ///i值不合法;if(L.length >= L.listsize) return ERROR;{   ///存储空间已满,增加分配;        ElemType *newbase = (ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));        if(!newbase) return OVERFLOW;        L.elem = newbase;        L.listsize += LISTINCREMENT;}    ElemType *q = &(L.elem[i-1]);for(ElemType *p=&(L.elem[L.length-1]);p>=q;--p)    ///所插位置后的元素右移;       *(p+1) = *p;           *q = e;++L.length;   ///插入后表长加一;return OK;}Status ListDelete_Sq(SqList &L,int i,ElemType &e){///顺序表的删除;///在顺序表L中删除第i个元素,并用e返回其值;if((i<1)||(i>L.length)) return ERROR;   ///i值不合法;ElemType *p = &(L.elem[i-1]);e = *p;ElemType *q = L.elem+L.length-1;for(++p; p<=q; ++p)        *(p-1)=*p;--L.length;     ///删除后表长减一;return OK;}void input(SqList &L,int n)///依次往顺序表L里输入数据;{for(int i=0;i<n;i++){cin>>L.elem[i];}L.length=n;}void output(SqList L)///依次输出顺序表里的每个元素;{  for(int i=0;i<L.length;i++){cout<<L.elem[i]<<" ";}cout<<"\n";}Status GetElem(SqList L,int i,ElemType *e)  ///用e返回顺序表中的第i个值;{    if(L.length==0 || i<1 || i>L.length)        return ERROR;    *e = L.elem[i-1];    return OK;}void MergeList_Sq(SqList LA,SqList LB,SqList &LC)///两个顺序有序表的合并;{///已知顺序有序表LA和LB的元素按值非递减排列;///归并LA和LB得到新的顺序有序表LC,LC的元素也按值非递减排列;    /*InitList_Sq(LC);    int i=1,j=1,k=0;    int LA_len = LA.length;    int LB_len = LB.length;    int ai,bj;    while((i<=LA_len) && (j<=LB_len)){        GetElem(LA,i,ai);GetElem(LB,j,bj);        if(ai <= bj) {            ListInsert_Sq(&LC,++k,ai);++i;        }        else{            ListInsert_Sq(&LC,++k,bj);++j;        }    }    while(i<=LA_len){        GetElem(LA,i++,ai);        ListInsert_Sq(&LC,++k,ai);    }    while(j<=LB_len){        GetELem(LB,j++,bj);        ListInsert_Sq(&LC,++k,bj);    }*/    ElemType *pa = LA.elem;  ElemType *pb = LB.elem;    LC.listsize = LC.length = LA.length+LB.length;    ElemType *pc = LC.elem = (ElemType *)malloc(LC.listsize*sizeof(ElemType));    if(!LC.elem)        exit(OVERFLOW);    ElemType *pa_last=LA.elem+LA.length-1;    ElemType *pb_last=LB.elem+LB.length-1;    while((pa<=pa_last)&&(pb<=pb_last))    {      if(*pa<=*pb)          *pc++=*pa++;       else           *pc++=*pb++;    }    while(pa<=pa_last)        *pc++=*pa++;    while(pb<=pb_last)        *pc++=*pb++;}int main(){SqList L,La,Lb,Lc;int num_a,num_b,e,num,i;int choose=-1;cout<<"1. 建立顺序表\n";cout<<"2. 输入数据\n";cout<<"3. 查找顺序表L中是否存在某元素\n";cout<<"4. 在顺序表L中i位置插入元素e\n";cout<<"5. 删除顺序表i位置元素\n";cout<<"6. 输出数据\n";cout<<"7. 合并顺序表La与Lb并输出\n";cout<<"0. 退出\n\n";while(choose!=0){cout<<"请选择:\n";cin>>choose;switch(choose){case 1:if(InitList_Sq(L))///创建顺序表L;cout<<"成功建立顺序表L!\n\n";elsecout<<"顺序表L建立失败!\n\n";break;case 2:///向L输入若干个数    InitList_Sq(L);    cout<<"请输入L的元素个数num:\n";    cin>>num;    cout<<"请依次输入num个数:\n";            input(L,num);            cout<<"顺序表的输出结果为:\n";            output(L);break;case 3:    InitList_Sq(L);    cout<<"请输入L的元素个数num:\n";    cin>>num;    cout<<"请依次输入num个数:\n";            input(L,num);    cout<<"请输入要查找的元素e:\n";    cin>>e;if(LocateElem_Sq(L,e)) ///顺序表L的查找。输入e,代表所要查找的数值    cout<<"查找数据成功!\n\n";else    cout<<"查找数据失败!\n\n";break;case 4:  ///顺序表L的插入。输入i和e,i代表插入的位置,e代表插入的数值            InitList_Sq(L);    cout<<"请输入L的元素个数num:\n";    cin>>num;    cout<<"请依次输入num个数:\n";            input(L,num);    cout<<"请输入插入元素的下标i:\n";    cin>>i;    cout<<"请输入插入元素的数值e:\n";    cin>>e;    if(ListInsert_Sq(L,i,e))        cout<<"插入新的元素e成功!\n\n";    else        cout<<"插入新的元素e失败!\n\n";break;case 5:     ///顺序表L的删除。输入i,代表要删除数的位置            InitList_Sq(L);    cout<<"请输入L的元素个数num:\n";    cin>>num;    cout<<"请依次输入num个数:\n";            input(L,num);    cout<<"请输入要删除元素的位置i:\n";    cin>>i;    if(ListDelete_Sq(L,i,e))            {       cout<<"删除第i个元素成功!\n\n";       cout<<"删除后的顺序表为:\n";       output(L);            }    else       cout<<"删除第i个元素失败!\n\n";break;case 6: ///顺序表L的输出            InitList_Sq(L);    cout<<"请输入L的元素个数num\n";    cin>>num;    cout<<"请依次输入num个数:\n";            input(L,num);            cout<<"顺序表的输出结果为:\n";            output(L);break;case 7: ///顺序表La和Lb的合并,输出合并后的顺序表Lc            InitList_Sq(La);    cout<<"请输入La的元素个数num_a:\n";    cin>>num_a;    cout<<"请依次输入num_a个数:\n";            input(La,num_a);            InitList_Sq(Lb);    cout<<"请输入Lb的元素个数num_b:\n";    cin>>num_b;    cout<<"请依次输入num_b个数:\n";            input(Lb,num_b);            InitList_Sq(Lc);    MergeList_Sq(La,Lb,Lc);            cout<<"LA和LB归并成功.\n\n";            cout<<"LA与LB合并后的顺序表是:\n";            output(Lc);break;}}return 0;}




到这里才真正知道自己学的有多渣渣!!!!  链式表的各种操作,让我再琢磨琢磨。。。。

555555555555555555555

心好累~_~。


突然发现数据结构老师给的摸版又不一样...

又要重写,,,,

55555553

#include<stdio.h>#define MAXSIZE 100#define OK  1#define ERROR 0#define OVERFLOW -1typedef int ElemType;typedef int Status;typedef struct{    ElemType elem[MAXSIZE];    int length;} SqList;///依次往顺序表L里输入数据;void input(SqList &L,int n){    for(int i=0; i<n; i++)    {        scanf("%d",&L.elem[i]);    }    L.length=n;}///初始化线性表;int InitList_Sq(SqList *L){    ///构造一个顺序表L;    printf("请输入线性表的长度length:\n");    scanf("%d",&(L->length));    printf("请依次输入length个元素:\n");    input( *L, L->length);    return OK;}///显示线性表的每个元素void ListDisp(SqList L){    for(int i=0; i<L.length; i++)    {        printf("%d ",L.elem[i]);    }    printf("\n");}///在第i个位置之前插入新的元素eStatus ListInsert_Sq(SqList *L,int i,ElemType e){    if((i<1)||(i>L->length+1)) return ERROR;     ///i值不合法;    if(L->length == MAXSIZE) return ERROR;       ///存储空间已满;    if(i<=L->length)   ///若所插数据位置不在表尾;    {        for(int j=L->length-1; j>=i-1; j--)     ///所插位置后的元素右移;            L->elem[j+1]=L->elem[j];    }    L->elem[i-1]=e;    L->length++;   ///插入后表长加一;    return OK;}///删除第i个元素,返回删除元素e的值Status ListDelete_Sq(SqList *L,int i,ElemType *e){    int k;    if(L->length==0)   /// 线性表为空;        return ERROR;    if(i<1 || i>L->length)   ///删除位置不正确;        return ERROR;    *e=L->elem[i-1];    if(i<L->length)  ///如果删除不是最后的位置;    {        for(k=i; k<L->length; k++) ///将删除位置后的元素左移;            L->elem[k-1]=L->elem[k];    }    L->length--;    return OK;}///将两个有序线性表合并为一个有序线性表Status MergeOrderList(SqList LA,SqList LB,SqList *LC){    ///已知顺序有序表LA和LB的元素按值非递减排列;    ///归并LA和LB得到新的顺序有序表LC,LC的元素也按值非递减排列;    LC->length=0;    if(LA.length+LB.length > MAXSIZE)        return OVERFLOW;    else    {        LC->length=LA.length+LB.length;        int i=0,j=0,k=0;        while((i<LA.length) && (j<LB.length))        {            if(LA.elem[i]<=LB.elem[j])                LC->elem[k++]=LA.elem[i++];            else                LC->elem[k++]=LB.elem[j++];        }        while(i<LA.length)            LC->elem[k++]=LA.elem[i++];        while(j<LB.length)            LC->elem[k++]=LB.elem[j++];        return OK;    }}//==================主函数====================//int main(){    SqList L,LA,LB,LC;    ElemType e;    int i,flag;    flag = InitList_Sq(&L);    if(flag == ERROR)    {        printf("构造线性表失败!\n");        return 0;    }    printf("构造线性表成功!\n");    printf("输出数组元素:");    ListDisp(L);    printf("请输入要插入的元素:");    scanf("%d",&e);    printf("请输入要插入元素的位置:");    scanf("%d",&i);    flag = ListInsert_Sq(&L,i,e);    if(flag == ERROR)    {        printf("插入位置不合法!\n");        return 0;    }    else if(flag == OVERFLOW)    {        printf("表已满,无法插入,溢出!\n");        return 0;    }    else        printf("插入成功!\n");    printf("插入元素后的数组元素:");    ListDisp(L);    printf("请输入要删除元素的位置:");    scanf("%d",&i);    flag = ListDelete_Sq(&L,i,&e);    if(flag == ERROR)    {        printf("删除位置不合法!\n");        return 0;    }    else        printf("删除成功!\n");    printf("删除的元素为:%d\n",e);    printf("删除元素后的数组元素:");    ListDisp(L);    printf("两个有序表的合并:\n");    InitList_Sq(&LA);    InitList_Sq(&LB);    flag = MergeOrderList(LA,LB,&LC);    if(flag == OVERFLOW)    {        printf("合并后溢出!无法合并。\n");        return 0;    }    else        printf("合并成功!\n");    printf("两个有序表合并后的结果为:\n");    ListDisp(LC);    return 0;}



0 0
原创粉丝点击