妙趣横生的算法--顺序表

最近参加了许多笔试,发现数据结构、算法真的饿是硬伤!!!尤其是微软了,瞬间对编程失去了信心。哭泣的脸哭泣的脸哭泣的脸哭泣的脸于是我决定在接下来的日子里好好补补。

 

在图书馆借了一本书,甚是喜欢,将里面的内容与大家分享一下。

我把上面的一些例题操作了一遍,然后与大家分享一下。

大家不喜勿喷呀。

 

 

 

 

 

静态表                                                                

题目:创建一个静态的顺序表存放整数,大小为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://www.cnblogs.com/yydcdut/p/3663792.html

posted @ 2014-04-14 12:44  我爱物联网  阅读(1920)  评论(14编辑  收藏  举报
AmazingCounters.com