靜態鏈表的單向實現,初衷是為了模擬沒有指針的高級語言,用數組來代替指針來描述單向鏈表,所用方法為游標實現法
數組元素用兩個數據域組成,一個為數據值,一個為當前數據的后繼下標
----實現了單向鏈表的初始化創建 插入 和 刪除
----優點:改進了順序儲存結構中插入刪除需要大量移動數據的缺點
----缺點:1.連續分配空間 表長難以確定
2.失去了順序結構儲存的快速讀取功能
總結:為了模擬 為了實現這種巧妙的構思 為了好玩
#include <stdio.h>#include <windows.h>#define MAX_LEN (502)//不用指針的靜態鏈表 模擬高級語言使用typedef struct node{ int value; int NextSet;}StaticList;void CreateStaticList(StaticList static_list[],int length_src,int init_num[],int length_put){ int count; int NullEndSet; if(static_list == NULL || length_src <= 0 || length_src > MAX_LEN ||init_num == NULL)return ; memset( static_list,0,length_src*sizeof(StaticList) ); //初始化next指向 for(count = 1;count<length_src-2;count++) { static_list[count].NextSet = count+1; } static_list[count].NextSet = 0; NullEndSet = count; //初始化用戶賦值 for(count = 0;count<length_put;count++) { static_list[count+1].value = init_num[count]; } static_list[count].NextSet = 0;//最后的元素向后鏈接位置為位置0 //初始化空位置頭和有數據位置頭 static_list[0].value = NullEndSet;//空數據尾位置 static_list[0].NextSet = count+1;//空數據頭位置 static_list[length_src-1].value = count;//數據數量 static_list[length_src-1].NextSet = count==0?-1:1;//有數據頭位置}//插入//插入插入位置之前void InsertStaticNode(StaticList static_list[],int length_src,int insertnum,int insertindexset){ int NullSet; int HeaderSet; int DataCount; int count; int NewNextSet; int NewLastSet; if(static_list == NULL || length_src <= 0 || length_src+1 > MAX_LEN ||insertindexset <= 0 ||insertindexset >MAX_LEN)return ; NullSet = static_list[0].NextSet;//空位置頭 也是 插入位置 HeaderSet = static_list[length_src-1].NextSet; DataCount = static_list[length_src-1].value; if(insertindexset > DataCount) { PRintf("當前靜態鏈表長度為:%d/n請進行正確位置的添加,謝謝使用/n",DataCount); return ; } static_list[NullSet].value = insertnum;//插入數據 static_list[0].NextSet = static_list[NullSet].NextSet;//更新空位置頭 NewLastSet = NewNextSet = HeaderSet; for(count = 1;count<insertindexset;count++) { NewLastSet = NewNextSet; NewNextSet = static_list[NewNextSet].NextSet; } static_list[NullSet].NextSet = NewNextSet;//向后鏈接 //向前鏈接 if(1 == insertindexset) { static_list[length_src-1].NextSet = NullSet; } else { static_list[NewLastSet].NextSet = NullSet; } static_list[length_src-1].value++;//更新已存在數據數量}//刪除void DeleteStaticNode(StaticList static_list[],int length_src,int deleteindexset){ int DataCount; int HeaderSet; int NullEndSet; int count; int DelLastSet; int DelNode; int DelNextNode; if(static_list == NULL || length_src <= 0 || length_src > MAX_LEN ||deleteindexset <= 0 ||deleteindexset >MAX_LEN)return ; DataCount = static_list[length_src-1].value; if(deleteindexset > DataCount) { printf("當前靜態鏈表長度為:%d/n請進行正確位置的刪除,謝謝使用/n",DataCount); return ; } HeaderSet = static_list[length_src-1].NextSet; NullEndSet = static_list[0].value; if(deleteindexset == 1)//刪除頭 { DelNode = HeaderSet; static_list[length_src-1].NextSet = static_list[HeaderSet].NextSet; } else { DelNode = DelLastSet = HeaderSet; for(count = 1;count<deleteindexset;count++) { DelLastSet = DelNode; DelNode = static_list[DelNode].NextSet; } if(deleteindexset == DataCount)//刪除尾 { static_list[DelLastSet].NextSet = 0; } else//刪除中間 { DelNextNode = static_list[DelNode].NextSet; static_list[DelLastSet].NextSet = DelNextNode; } } static_list[DelNode].value = 0;//置零 static_list[DelNode].NextSet = 0;//置零 static_list[NullEndSet].NextSet = DelNode;//無數據元素尾添加 static_list[length_src-1].value--;//更新已存在數據數量}int main(){ int head; StaticList static_list[102] = {0}; int putinarr[] = {3,4,5,7,8,3,3,4,8,56,78,6,2,45}; CreateStaticList(static_list,sizeof(static_list)/sizeof(static_list[0]),putinarr,sizeof(putinarr)/sizeof(putinarr[0])); InsertStaticNode(static_list,sizeof(static_list)/sizeof(static_list[0]),123131,1); DeleteStaticNode(static_list,sizeof(static_list)/sizeof(static_list[0]),15); InsertStaticNode(static_list,sizeof(static_list)/sizeof(static_list[0]),999,14); head = static_list[sizeof(static_list)/sizeof(static_list[0])-1].NextSet; while(head) { printf("%d ",static_list[head].value); head = static_list[head].NextSet; } system("pause"); return 0;}
新聞熱點
疑難解答