最近參加了許多筆試,發現數據結構、算法真的餓是硬傷!!!尤其是微軟了,瞬間對編程失去了信心。
於是我決定在接下來的日子里好好補補。
在圖書館借了一本書,甚是喜歡,將里面的內容與大家分享一下。
我把上面的一些例題操作了一遍,然后與大家分享一下。
大家不喜勿噴呀。
靜態表
題目:創建一個靜態的順序表存放整數,大小為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(); }
順序表個人敲了一遍代碼之后能夠理解了,但是還是有些細節不夠明白哈。希望大概能看懂,上面也寫的有注釋。