线性表是从数据元素的逻辑结构上定义的.
这种数据元素的逻辑结构的特征如下:
1.除开第一个和最后一个元素之外.所有元素都有一个前驱元素和后继元素.
2.第一个元素无前驱元素,但有后继元素.
3.最后一个元素有前驱元素,单无后继元素.
可以抽象为如下表述:
元素1 | 元素2 | 元素3 | 元素4 | 元素5 | 元素6 |
然而同一种逻辑结构在内存中却可以有两种存储方式:1.在内存中连续存储的线性表-----顺序表(如数组)
2.在内存中离散存储的线性表-----链表(如单链表,双链表)
对于顺序表有多重操作:初始化,赋值,插入新值,删除值等
下面的用C代码实现顺序表及其一些常用的操作:
1 #include<stdio.h> 2 3 #define ERROR 0 4 5 #define InitSize 20 //顺序表的初始大小 6 7 typedef int ElemType; 8 9 typedef struct{ 10 ElemType data[InitSize]; 11 int length; 12 }sqlist; 13 14 //顺序表初始化 15 void InitList(sqlist *L) 16 { 17 L->length=0; 18 return ; 19 } 20 21 //获取顺序表的长度 22 int GetLength(sqlist *L) 23 { 24 return L->length; 25 } 26 27 //顺序表赋值 28 void GiveValue(sqlist *L) 29 { 30 int value; 31 int i=0; 32 while(value!=0) 33 { 34 printf("Please input %d valueL-------(exit until value equal 0) ",i+1); 35 scanf("%d",&value); 36 if(value!=0) 37 { 38 L->data[i++]=value; 39 L->length++; 40 } 41 } 42 } 43 44 45 46 //获取顺序表某个位置的值 47 ElemType GetValue(sqlist *L,int i) 48 { 49 ElemType e; 50 if(i>L->length||i<1) 51 return ERROR; 52 53 int k=0; 54 for(k=0;k<L->length;k++) 55 { 56 if(k==i-1) 57 e=L->data[k]; 58 } 59 return e; 60 } 61 62 //获取顺序表某个值的位置 63 int GetPos(sqlist *L,ElemType value) 64 { 65 int pos; 66 int judeflag=1; 67 int i; 68 for(i=0;i<L->length;i++) 69 { 70 if(L->data[i]==value) 71 { 72 pos=i+1; 73 break; 74 } 75 judeflag++; 76 } 77 78 if(judeflag>=L->length) 79 return ERROR; 80 81 return pos; 82 } 83 84 //在顺序表指定位置插入新的值 85 void InsertValue(sqlist *L,int pos,ElemType value) 86 { 87 if(pos<1||pos>L->length) 88 return ERROR; 89 90 int i; 91 for(i=L->length-1;i>pos-2;i--) 92 { 93 L->data[i+1]=L->data[i]; 94 } 95 96 L->data[pos]=value; 97 L->length++; 98 } 99 100 //在顺序表中指定位置删除值 101 void DeleteValue(sqlist *L,int pos) 102 { 103 if(pos<1||pos>L->length) 104 return ERROR; 105 106 int i; 107 for(i=pos;i<L->length;i++) 108 { 109 L->data[i-1]=L->data[i]; 110 } 111 112 L->length--; 113 } 114 115 //显示顺序表 116 void ShowList(sqlist *L) 117 { 118 int i; 119 printf("The List show below: "); 120 for(i=0;i<L->length;i++) 121 { 122 printf("%d ",L->data[i]); 123 } 124 } 125 126 127 //主函数 128 int main() 129 { 130 sqlist L; 131 InitList(&L);//初始化顺序表 132 GiveValue(&L);//顺序表赋值 133 ShowList(&L);//显示线性表 134 135 printf(" "); 136 int flag; 137 printf("****************************************************** "); 138 printf("*************choose the operation of List************* "); 139 printf("*****************1-指定位置插入值********************* "); 140 printf("*****************2-指定位置删除值********************* "); 141 printf("*****************3-获取顺序表某个值得位置************* "); 142 printf("*****************4-获取顺序表某个位置上的值********* "); 143 printf("*****************5-获取顺序表长度********************* "); 144 printf("*****************0-退出******************************* "); 145 printf("****************************************************** "); 146 printf(" "); 147 148 printf("Input the value Flag: "); 149 scanf("%d",&flag); 150 151 printf("flag=%d ",flag); 152 153 int pos,value,len; 154 switch(flag){ 155 case 1: 156 { 157 printf("Please input the value and position: "); 158 scanf("%d %d",&value,&pos); 159 printf("Insert value=%d in pos=%d ",value,pos+1); 160 InsertValue(&L,pos,value); 161 ShowList(&L); 162 break; 163 } 164 case 2: 165 { 166 printf("Please input the position: "); 167 scanf("%d",&pos); 168 printf("Delete value in pos=%d ",pos); 169 DeleteValue(&L,pos); 170 ShowList(&L); 171 break; 172 } 173 case 3: 174 { 175 printf("Please input the value: "); 176 scanf("%d",&value); 177 pos=GetPos(&L,value); 178 printf("Get value=%d's position is %d ",value,pos); 179 ShowList(&L); 180 break; 181 } 182 case 4: 183 { 184 printf("Please input the position: "); 185 scanf("%d",&pos); 186 value=GetValue(&L,pos); 187 printf("Get value=%d from pos=%d ",value,pos); 188 ShowList(&L); 189 break; 190 } 191 case 5: 192 { 193 len=GetLength(&L); 194 printf("the length of List is %d ",len); 195 ShowList(&L); 196 break; 197 } 198 case 0: 199 printf("you choose to exit Goodbye! "); 200 } 201 202 return 0; 203 }
结果图: