妙趣横生的算法--顺序表
最近参加了许多笔试,发现数据结构、算法真的饿是硬伤!!!尤其是微软了,瞬间对编程失去了信心。于是我决定在接下来的日子里好好补补。
在图书馆借了一本书,甚是喜欢,将里面的内容与大家分享一下。
我把上面的一些例题操作了一遍,然后与大家分享一下。
大家不喜勿喷呀。
静态表
题目:创建一个静态的顺序表存放整数,大小为10,完成以下的操作。
(1)输入6个整数,打印出顺序表的内容,并显示表中的剩余空间个数。
(2)在顺序表中的第3个位置插入0,打印出顺序表中的内容,并显示表中剩余的空间个数。
(3)再试图插入表中第11个位置整数0,程序提示超出范围。
(4)删除表中第6个元素,打印出顺序表中的内容,并表示表中剩余的空间个数。
#include "stdio.h" #define MaxSize 10 /*静态顺序表的各种操作*/ /** 向顺序表中插入元素 */ /** 参数Sqlist:表首地址 */ /** 参数*len: 表的长度 */ /** 参数i: 插入元素的位置 */ /** 参数x:待插入的元素值 */ void insertElem(int Sqlist[],int *len,int i,int x) { int t; if(*len==MaxSize || i<1 || i>*len+1) { printf("This insert is illegal\n"); return; } /*非法插入*/ for(t=*len-1;t>=i-1;t--) Sqlist[t+1]=Sqlist[t];//插入位置之后的元素往后面推 Sqlist[i-1]=x; /*插入元素*/ *len=*len+1; /*表长加1*/ } /** 向顺序表中删除元素 */ /** 参数Sqlist:表首地址 */ /** 参数*len: 表的长度 */ /** 参数i: 插入元素的位置 */ void DelElem(int Sqlist[],int *len,int i) { int j; if(i<1 || i>*len) { printf("This insert is illegal"); return; } /*非法插入*/ for(j=i;j<=*len-1;j++) Sqlist[j-1]=Sqlist[j]; //将删除元素后面的元素往前移动 *len=*len-1; /*表长减1*/ } /**测试函数*/ main() { /*按照题目要求进行测试*/ int Sqlist[MaxSize]; /*定义一个静态顺序表*/ int len; int i; for(i=0;i<6;i++) scanf("%d",&Sqlist[i]); /*从键盘输入6个整数*/ len=6; for(i=0;i<len;i++) printf("%d ",Sqlist[i]); /*输出顺序表中的6个整数*/ printf("\nThe spare length is %d\n",MaxSize - len); /*显示表中的剩余空间*/ insertElem(Sqlist,&len,3,0); /*在表中第3位置插入整数0*/ for(i=0;i<len;i++) printf("%d ",Sqlist[i]); /*输出顺序表中的所有元素*/ printf("\nThe spare length is %d\n",MaxSize - len); /*显示表中的剩余空间*/ insertElem(Sqlist,&len,11,0); /*在表中第11位置插入整数0*/ DelElem(Sqlist,&len,6); /*删除顺序表中的第6个元素*/ for(i=0;i<len;i++) printf("%d ",Sqlist[i]); /*输出顺序表中的所有元素*/ printf("\nThe spare length is %d\n",MaxSize - len); /*显示表中的剩余空间*/ }
动态表
编写一个程序,动态的创建一个顺序表。要求:顺序表初始长度为10,向顺序表中输入15个整数,并打印出来;再检出顺序表中的第5个元素,打印出来删除后的结果。
#include "stdio.h" #include "conio.h" #include "stdlib.h" #define MaxSize 10 typedef int ElemType ; /*将int定义为ElemType*/ typedef struct{ int *elem;//元素 int length;//长度 int listsize; //内存 } Sqlist; /** 初始化一个顺序表 */ /** 参数L:Sqlist类型的指针 */ void initSqlist(Sqlist *L){ L->elem=(int *)malloc(MaxSize*sizeof(ElemType)); if(!L->elem) exit(0);//没有创建成功 L->length=0; L->listsize= MaxSize; } /** 向顺序表中插入元素 */ /** 参数L:Sqlist类型的指针 */ /** 参数i:插入元素的位置 */ /** 参数item:插入的元素 */ void InsertElem(Sqlist *L,int i,ElemType item){ /*向顺序表L中第i个位置上插入元素item*/ ElemType *base,* insertPtr,*p; if(i<1||i>L->length+1) exit(0);//防止过量插入 if(L->length>=L->listsize) { base=(ElemType*)realloc(L->elem,(L->listsize+10)*sizeof(ElemType));//重新分配内存空间 L->elem=base;//传首地址 L->listsize=L->listsize+100; } insertPtr=&(L->elem[i-1]);//将要删除的地址赋值 for(p=&(L->elem[L->length-1]);p>= insertPtr;p--)//以地址来判断 *(p+1)=*p;//往后面移 * insertPtr=item; L->length++;//长度增加 } /** 从顺序表中删除元素 */ /** 参数L:Sqlist类型的指针 */ /** 参数i:删除元素的位置 */ void DelElem(Sqlist *L,int i) { /*从顺序表L中删除第i个元素*/ ElemType *delItem, *q; if(i<1||i>L->length) exit(0);//防止没有那个位置的删除 delItem=&(L->elem[i-1]);//穿要删除的地址 q=L->elem+L->length-1 ;//这里的-1没有理解非常深刻,后面是<=,那么这里的-1应该是可有可无的 for(++delItem; delItem<=q;++ delItem)*( delItem-1)=* delItem;//往前面移 L->length--;//长度减小 } /** 测试函数 */ main() { Sqlist l; int i; initSqlist(&l); /*初始化一个顺序表*/ for(i=0;i<15;i++) InsertElem(&l,i+1,i+1); /*向顺序表中插入1……15*/ printf("\nThe content of the list is\n"); for(i=0;i<l.length;i++) printf("%d ",l.elem[i]);/*打印出顺序表中的内容*/ DelElem(&l,5); /*删除第5个元素,即5*/ printf("\nDelete the fifth element\n"); for(i=0;i<l.length;i++) /*打印出删除后的结果*/ printf("%d ",l.elem[i]); getche(); }
顺序表个人敲了一遍代码之后能够理解了,但是还是有些细节不够明白哈。希望大概能看懂,上面也写的有注释。
作者:我爱物联网
出处:http://yydcdut.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://yydcdut.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。