数据结构算法设计题汇总(1)
来源:互联网 发布:gis制作数据分布地图 编辑:程序博客网 时间:2024/06/02 05:54
为了更好地学习数据结构,方便自己复习反思,特建立此分类进行课后习题的总结,通过总结来督促自己学习与反思,提升水平,一步步找出更好的算法。
1.将一元素插入一个有序的顺序表中,使其仍然有序,写出能够实现此算法的代码。
我的思路是将元素先插入表尾,之后再进行插入排序,代码如下:
#include<stdio.h>#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define maxsize 20typedef int status;typedef int elemtype;typedef struct{ elemtype data[maxsize]; int length;}sqlist;status visit(elemtype c){ printf("%d ",c); return OK;}status initlist(sqlist *l){ l->length=0; return OK;}status insertlist(sqlist *l,elemtype e,int i){ int k; if(l->length==maxsize) return ERROR; if(i<1||i>l->length+1) return ERROR; if(i<=l->length) for(k=l->length-1;k>=i-1;k--) l->data[k+1]=l->data[k]; l->data[i-1]=e; l->length++; return OK; }status listtraverse(sqlist l){ int i; for(i=0;i<l.length;i++) { visit(l.data[i]); } putchar('\n'); return OK;}status insertsort(sqlist *l){ int i,j,temp; for(i=1;i<l->length;i++){ if(l->data[i]<l->data[i-1]){ temp=l->data[i]; for(j=i-1;j>=0&&l->data[j]>temp;j--){ l->data[j+1]=l->data[j]; } l->data[j+1]=temp; } }}int main(void){ sqlist L; int i=0; initlist(&L); for(i=0;i<10;i++){ insertlist(&L,i,i); } listtraverse(L); int insert=5; insertlist(&L,insert,L.length+1); listtraverse(L); insertsort(&L); listtraverse(L);}
2.删除一个顺序表中的重复元素
我的思路是使用i,j两个索引,其中i从0开始,j从i+1开始,遍历整个顺序表,当有两元素相等时,删除其中一个即可。
#include<stdio.h>#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define maxsize 20typedef int status;typedef int elemtype;typedef struct{ elemtype data[maxsize]; int length;}sqlist;status visit(elemtype c){ printf("%d ",c); return OK;}status initlist(sqlist *l){ l->length=0; return OK;}status insertlist(sqlist *l,elemtype e,int i){ int k; if(l->length==maxsize) return ERROR; if(i<1||i>l->length+1) return ERROR; if(i<=l->length) for(k=l->length-1;k>=i-1;k--) l->data[k+1]=l->data[k]; l->data[i-1]=e; l->length++; return OK; }status listtraverse(sqlist l){ int i; for(i=0;i<l.length;i++) { visit(l.data[i]); } putchar('\n'); return OK;}status deleteelem(sqlist *l,elemtype e,int i){ int k; if(l->length==0) return ERROR; if(i<1||i>l->length) return ERROR; e=l->data[i-1]; if(i<l->length) { for(k=i;k<l->length-1;k++)//只需要让后面的不包括自身的元素向前 l->data[k]=l->data[k+1]; } l->length--; return OK;} status deletesameelem(sqlist *l){ int i,j; elemtype e; for(i=0;i<l->length;i++){ for(j=i+1;j<l->length;j++){ if(l->data[i]==l->data[j]){ deleteelem(l,e,j); } } }}int main(void){ sqlist L; int i=0; initlist(&L); for(i=0;i<10;i++){ insertlist(&L,i,i); } listtraverse(L); int insert=5; insertlist(&L,insert,L.length+1); listtraverse(L); deletesameelem(&L); listtraverse(L); }
3.删除指定范围内的所有元素
最开始我的思路是遍历表,将所有在指定范围的元素找出来并删除,但在实现过程中出现了一些问题,只删除了奇数项而偶数项依然存在。之后我参考了另一个算法,从反面入手,增加新索引k=0,使不在范围内的元素保存在原顺序表中,同时k++,最后让表长等于k即可,代码如下:
#include<stdio.h>#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define maxsize 20typedef int status;typedef int elemtype;typedef struct{ elemtype data[maxsize]; int length;}sqlist;status visit(elemtype c){ printf("%d ",c); return OK;}status initlist(sqlist *l){ l->length=0; return OK;}status insertlist(sqlist *l,elemtype e,int i){ int k; if(l->length==maxsize) return ERROR; if(i<1||i>l->length+1) return ERROR; if(i<=l->length) for(k=l->length-1;k>=i-1;k--) l->data[k+1]=l->data[k]; l->data[i-1]=e; l->length++; return OK; }status listtraverse(sqlist l){ int i; for(i=0;i<l.length;i++) { visit(l.data[i]); } putchar('\n'); return OK;}status deleteelem(sqlist *l,int i){ int k; if(l->length==0) return ERROR; if(i<1||i>l->length) return ERROR; if(i<l->length) { for(k=i;k<l->length-1;k++)//只需要让后面的不包括自身的元素向前 l->data[k]=l->data[k+1]; } l->length--; return OK;} status deleteeleminrange(sqlist *l,int x,int y){ int i=0,k=0;/*这一步一定要将k初始化为0否则会出现整个线性表全为同一数字的情况*/ for(i=0;i<l->length;i++){ if(l->data[i]<x||l->data[i]>y){ l->data[k++]=l->data[i]; } } l->length=k;}int main(void){ sqlist L; int i=0,x=0,y=0; initlist(&L); for(i=0;i<10;i++){ insertlist(&L,i,i); } listtraverse(L); deleteeleminrange(&L,2,6); listtraverse(L);}
4.给定一个含有数字,字母,其他字符的线性表,要求按照字母,数字,其他字符的顺序进行排序。
对于此题,我的思路是使用ctype.h头文件中的isdigit(),isalpha()函数,对线性表进行遍历,找出其中的数字字母其他字符。之后转存到另一线性表中即可,代码如下:
#include<stdio.h>#include<stdlib.h>#include<ctype.h>#define maxsize 20typedef int status;typedef char elemtype;typedef struct sqlist{ elemtype ch[maxsize]; int length;}sqlist;status initlist(sqlist *l){ l->length=0;} status createlist(sqlist *l){ l->ch[0]='a'; l->length++; l->ch[1]=','; l->length++; l->ch[2]='2'; l->length++;}status visit(elemtype c){ printf("%c ",c);}status traverselist(sqlist l){ for(int i=0;i<l.length;i++){ visit(l.ch[i]); } printf("\n");}elemtype getelem(sqlist *l,int i){ elemtype e; if(l->length==0) return 0; e=l->ch[i-1]; return e; }int main(void){ sqlist l,l2; elemtype e; int i,k=0; initlist(&l); initlist(&l2); l.ch[0]='a'; l.length++; l.ch[1]=','; l.length++; l.ch[2]='2'; l.length++; l.ch[3]='f'; l.length++; l.ch[4]='.'; l.length++; l.ch[5]='5'; l.length++; traverselist(l); for(i=1;i<=l.length;i++){ e=getelem(&l,i); if(isalpha(e)){ l2.ch[k++]=e; l2.length++; } } for(i=1;i<l.length+1;i++){ e=getelem(&l,i); if(isdigit(e)){ l2.ch[k++]=e; l2.length++; } } for(i=1;i<l.length+1;i++){ e=getelem(&l,i); if(!isalpha(e)&&!isdigit(e)){ l2.ch[k++]=e; l2.length++; } } traverselist(l2);}
5.给定一顺序表,将其对称反转
例如:将{0 1 2 3 4 5 6 7 8 9}反转为{5 6 7 8 9 0 1 2 3 4}
我的思路是:用两个索引i=0,j=m(m为对称轴位置)对表进行遍历,遍历的同时左右进行交换,代码如下:
#include<stdio.h>#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define maxsize 20typedef int status;typedef int elemtype;typedef struct{ elemtype data[maxsize]; int length;}sqlist;status visit(elemtype c){ printf("%d ",c); return OK;}status initlist(sqlist *l){ l->length=0; return OK;}status insertlist(sqlist *l,elemtype e,int i){ int k; if(l->length==maxsize) return ERROR; if(i<1||i>l->length+1) return ERROR; if(i<=l->length) for(k=l->length-1;k>=i-1;k--) l->data[k+1]=l->data[k]; l->data[i-1]=e; l->length++; return OK; }status listtraverse(sqlist l){ int i; for(i=0;i<l.length;i++) { visit(l.data[i]); } putchar('\n'); return OK;}status changeorder(sqlist *l,int m,int n){/*m为对称轴位置,n为表长*/ int temp; int i=0,j=m; while(i!=m&&j!=n){ temp=l->data[i]; l->data[i]=l->data[j]; l->data[j]=temp; i++; j++; }}int main(void){ sqlist L,l; int i; initlist(&L); for(i=0;i<10;i++){ insertlist(&L,i,L.length+1); } listtraverse(L); changeorder(&L,5,10); listtraverse(L);}
以上是我所想到的一些解决问题的方法,今后还会不断反思,设计出更为高效的算法。
0 0
- 数据结构算法设计题汇总(1)
- 数据结构算法设计题汇总(2)
- 数据结构与算法汇总
- 数据结构排序算法汇总
- 数据结构--排序算法汇总
- 数据结构与算法汇总
- 数据结构与算法汇总
- [汇总] 数据结构与算法
- 数据结构与算法汇总
- 数据结构与算法汇总
- [汇总I]精选微软等公司数据结构+算法面试100题[第1-60题汇总]
- [汇总I]精选微软等公司数据结构+算法面试100题[第1-60题汇总]
- C#算法与数据结构汇总
- 排序算法与数据结构汇总
- C#算法与数据结构汇总
- 数据结构与算法题目汇总
- 数据结构 栈和队列 算法设计题
- 微软等公司数据结构+算法面试第1-80题汇总
- iOS通过正则表达式判断身份证号码、手机号、邮箱、车牌号是否正确
- Java 1.7 ReentrantReadWriteLock源码解析
- mpi阻塞型函数的死锁
- 程序员编程艺术:面试和算法心得
- 1039. 到底买不买(20)
- 数据结构算法设计题汇总(1)
- C/C++中指针初始化
- redis(五)redis与Mybatis的无缝整合让MyBatis透明的管理缓存二
- iOS安全些许经验和学习笔记
- Java 多线程实现的三种方法,附两个线程执行不同的输出
- 案例3
- redis(三)redis+Keepalived主从热备秒级切换
- Android更新Ui线程的四个方法
- 在ROS中传递图像消息(二)