線性表的插入和刪除


  參考blog :   http://blog.sina.com.cn/s/blog_5c5bc9070100y8c9.html  

    

   一.算法的基本概念
計算機解題的過程實際上是在實施某種算法,這種算法稱為計算機算法。
1.算法的基本特征:可行性,確定性,有窮性,擁有足夠的情報。
2.算法的基本要素:算法中對數據的運算和操作、算法的控制結構。
3.算法設計的基本方法:列舉法、歸納法、遞推、遞歸、減半遞推技術、回溯法。
4.算法設計的要求:正確性、可讀性、健壯性、效率與低存儲量需求

  

  二.數據結構的定義
1.數據的邏輯結構:反映數據元素之間的關系的數據元素集合的表示。數據的邏輯結構包括集合、線形結構、樹形結構和圖形結構四種。
2.數據的存儲結構:數據的邏輯結構在計算機存儲空間種的存放形式稱為數據的存儲結構。常用的存儲結構有順序、鏈接、索引等存儲結構。

 

在數據結構中,沒有前件的結點稱為根結點;沒有后件的結點成為終端結點。插入和刪除是對數據結構的兩種基本運算。還有查找、分類、合並、分解、復制和修改等。

 

  三.線性結構和非線性結構
根據數據結構中各數據元素之間前后件關系的復雜程度,一般將數據結構分為兩大類型線性結構和非線性結
線性結構:非空數據結構滿足:有且只有一個根結點;每個結點最多有一個前件,最多只有一個后件。非線性結構:如果一個數據結構不是線性結構,稱之為非線性結構。

 

  常見的線性結構:線性表、棧、隊列

 

   四.線性表的順序存儲結構
線性表的順序表指的是用一組地址連續的存儲單元依次存儲線性表的數據元素。
線性表的順序存儲結構具備如下兩個基本特征:
1.線性表中的所有元素所占的存儲空間是連續的;
2.線性表中各數據元素在存儲空間中是按邏輯順序依次存放的。
即線性表邏輯上相鄰、物理也相鄰,則已知第一個元素首地址和每個元素所占字節數,則可求出任一個元素首地址。

 

假設線性表的每個元素需占用K個存儲單元,並以所占的第一個單元的存儲地址作為數據元素的存儲位置。則線性表中第i+1個數據元素的存儲位置LOC(ai+1)和第i個數據元素的存儲位置LOC(ai)之間滿足下列關系:
LOC(ai+1)=LOC(ai)+K
LOC(ai)=LOC(a1)+(i-1)*K     ①
其中,LOC(a1)是線性表的第一個數據元素a1的存儲位置,通常稱做線性表的起始位置或基地址。
因為在順序存儲結構中,每個數據元素地址可以通過公式①計算得到,所以線性表的順序存儲結構是隨機存取的存儲結構。

在線性表的順序存儲結構下,可以對線性表做以下運算:
插入、刪除、查找、排序、分解、合並、復制、逆轉

 

  源碼實現:

 1 /*--------------------------------  2  線性表的插入和刪除  3 ----------------------------------*/
 4 
 5 #include <stdio.h>
 6 #include <string>
 7 #include <stdlib.h>
 8 #include <math.h>
 9 #include <iostream>
 10 
 11 using namespace std;  12 
 13 #define LIST_INIT_SIZE  100     //線性表初始分配發熱空間
 14 #define LISTINCRMENT     10     //線性表存儲空間的分配增量
 15 #define ElemType        int     //指針類型
 16 
 17 typedef struct{  18     ElemType *elem;     //存儲空間基址
 19     int length;         //當前長度
 20     int listsize;       //當前分配的存儲容量(以sizeof(ElemType)為單位)
 21 }SqList;  22 
 23 int initList_Sq(SqList &L);               //構造一個空的線性表
 24 int listInsert_Sq(SqList &L, int i, ElemType e);   //插入元素
 25 int listDelete_Sq(SqList &L, int i, ElemType &e);  //將第i個元素刪除,並用e返回  26 
 27 //構造一個空的線性表
 28 int initList_Sq(SqList &L)//將結構體變量的引用做函數參數
 29 {  30     L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));  31     if (!L.elem)        //存儲分配失敗
 32  {  33         exit(-1);  34  }  35     L.length = 0;    //空表長度0
 36     L.listsize = LIST_INIT_SIZE;   //初始存儲容量
 37     return true;  38 }  39 
 40 //在第i個元素之前插入一個元素,i的合法值 1<= i <=L.length+1
 41 int ListInsert_Sq(SqList &L,int i,ElemType e)  42 {  43     ElemType *newbase, *q, *p;  44 
 45     if (i<1 || i>L.length + 1)  //i不合法
 46         return false;  47     if (L.length >= L.listsize)    //當存儲空間已滿,增加分配
 48  {  49         newbase = (ElemType*)realloc(L.elem, LIST_INIT_SIZE * sizeof(ElemType));  50         if (!newbase)     //存儲分配失敗
 51  {  52             exit(-1);  53  }  54             L.elem = newbase;      //新地址
 55             L.listsize += LISTINCRMENT;    //增加存儲容量,因為只插入了一個,所以LISTINCRMENT就夠了
 56         
 57  }  58     q = &(L.elem[i-1]);     //q為插入位置
 59     for (p = &(L.elem[L.length - 1]); p >= q; --p)   //&(L.elem[L.length - 1]最后一個元素的地址
 60  {  61         *(p + 1) = *p;          //右移1位
 62  }  63         *q = e;                 //在q位置插入e
 64         ++L.length;          //表長加1
 65     
 66     
 67     return 0;  68 }  69 
 70 
 71 //在順序表L中刪除第i個元素,並用e返回 其值
 72 int ListDelete_Sq(SqList &L, int i, ElemType &e)  73 {  74     ElemType *p, *q;  75     if ((i<1) || (i>L.length))  76         return false;  77     p = &(L.elem[i-1]);   //刪除元素位置
 78     e = *p;  79     q = L.elem + L.length - 1;  //元素長度
 80     for (++p; p <= q; ++p)  81         *(p - 1) = *p;      //左移
 82     return true;  83 }  84 
 85 int main()  86 {  87     int i;  88  SqList L;  89     //puts("Please input 5 num: ");
 90  initList_Sq(L);  91     ///if (initList_Sq(L))
 92     //{  93         //創建新表,輸入5個元素
 94         for (i = 0; i < 5; i++)  95  {  96  listInsert_Sq(L, i, i);  97             //scanf("shuru :%d", &L.elem[i]); //cin >> L.elem[i];  98             //++L.length;
 99  } 100         /*
101  for (i = 0; i < 5; i++) 102  { 103  scanf("%d", &L.elem[i]); //cin >> L.elem[i]; 104  } 105  puts(" "); 106         */
107     //} 108     //else 109     //{ 110         //puts("ERROR"); 111         //exit(-1); 112     //}
113 
114         for (i = 0; i<L.length; ++i) 115  { 116             printf("%d ", L.elem[i]); 117  } 118         printf("\n"); 119 
120     //插入元素,要插入的位置和元素值
121     puts("Please Input Your Insert num and possition:"); 122     int pos, num; 123     scanf("%d", &num, &pos);//cin >> num >> pos;
124     printf("\n"); 125     if (ListInsert_Sq(L, pos, num)) 126  { 127         printf("Insert After:\n"); 128         for (i = 0; i < L.length; ++i) 129             printf("%d ", L.elem[i]);   //顯示插入后的值
130         printf("\n"); 131  } 132     else
133  { 134         puts("Insert ERROR"); 135         exit(-1); 136  } 137 
138     //刪除元素,要刪除元素的位置
139     puts("Please Input You want to Delete possition:"); 140     scanf("%d", &pos);  //cin >> pos; 
141     if (ListDelete_Sq(L, pos, num)) 142  { 143         printf("Delete After:\n"); 144         for (i = 0; i < L.length;i++) 145            printf("%d ", L.elem[i]); 146         puts(""); 147  } 148     else
149  { 150         puts("Delete ERROR"); 151         exit(-1); 152  } 153 
154     return 0; 155 }

 

  程序還是有點問題。。。

 

 還沒調試好。。。。。。。。發現blog 上的很多東西是不嚴謹的


免責聲明!

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



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