大二 第一次数据结构作业 (数组的排序,删除,查找,插入,合并)(线性表)
来源:互联网 发布:移动网络电话号码 编辑:程序博客网 时间: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
- 大二 第一次数据结构作业 (数组的排序,删除,查找,插入,合并)(线性表)
- 线性表的插入,删除,合并,查找
- 数据结构之线性表(建表-插入-删除-合并)
- 【数据结构】顺序线性表的插入、删除、合并实现
- 线性表的操作(完成表的建立,插入,删除,排序,销毁,查找 )
- 线性表的输入输出插入删除查找(顺序表示)
- 《数据结构》线性表:链式存储结构实现示例代码二(插入、删除、查找)
- 线性表的插入、查找与删除
- 【数据结构作业二】写出单链表结点的结构体类型定义及查找、插入、删除算法,并以单链表作存储结构,实现有序表的合并
- 线性表的输入输出查找删除插入(链式,头插入)
- 线性表的输入输出查找删除插入(链式,尾插入)
- 常见数据结构查找、插入、删除、遍历性能比较 常见排序算法的比较(图)
- 常见数据结构查找、插入、删除、遍历性能比较 常见排序算法的比较(图)
- 常见数据结构查找、插入、删除、遍历性能比较 常见排序算法的比较(图)
- 常见数据结构查找、插入、删除、遍历性能比较 常见排序算法的比较(图)
- 常见数据结构查找、插入、删除、遍历性能比较 常见排序算法的比较(图)
- 2015年大二上-数据结构-查找-1-(1)-线性表的折半查找
- C语言:实现线性表基本表示(数组元素的删除,插入,合并)
- 常用的Linux命令
- 1-7 2440时钟初探
- UVA - 10635 Prince and Princess (二分法 求最长上升子序列)
- 读《采购与供应链管理》
- 枚举,结构体区别
- 大二 第一次数据结构作业 (数组的排序,删除,查找,插入,合并)(线性表)
- GitHub上优秀的开源项目(转载)
- 使用composer安装php-cs-fixer
- 【Android】使用WindowManager添加View
- Liblinphone3.10.2 DataStructures
- Android开发-Fragment中调用父Activity中方法-AndroidStudio
- 扑克牌顺子
- Mybatis框架学习笔记 lesson1
- python中的反射