妙趣橫生的算法--順序表


最近參加了許多筆試,發現數據結構、算法真的餓是硬傷!!!尤其是微軟了,瞬間對編程失去了信心。哭泣的臉哭泣的臉哭泣的臉哭泣的臉於是我決定在接下來的日子里好好補補。

 

在圖書館借了一本書,甚是喜歡,將里面的內容與大家分享一下。

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

大家不喜勿噴呀。

 

 

 

 

 

靜態表                                                                

題目:創建一個靜態的順序表存放整數,大小為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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM