顺序表结构可设为一个数组和一个指向尾部的变量,数组用来存放元素,指向尾部的变量在插入元素的时候加一,删除元素的时候减一,始终指向尾部。
1 typedef int elemtype; 2 3 typedef struct arrayList{ 4 elemtype date[MAXSIZE]; 5 int last; 6 }ArrayList;
初始化时给对应的指针分配空间,并使last=-1
1 ArrayList *init_ArrayList(){ 2 3 ArrayList *a = (ArrayList *)malloc(sizeof(ArrayList)); 4 if(a==NULL) 5 return NULL; 6 7 a->last = -1; 8 return a; 9 10 }
插入元素:插入位置为x,使>=x的所有元素向后移动一个位置,然后在该位置插入新元素
1 int insertList(ArrayList *a,elemtype e,int x) { 2 3 if(a->last>=MAXSIZE-1){ 4 printf("顺序表已满"); 5 return 0; 6 } 7 8 //顺序表需要顺序插入,即不能在last外插入 9 if(x<1 || x>a->last+2){ 10 printf("插入位置错误 "); 11 return 0; 12 } 13 14 int i; 15 for(i=a->last;i>=x-1;i--)//last代表数组最后一个元素的下标 16 a->date[i+1] = a->date[i];//节点依次向后移动一个位置 17 a->date[i+1] = e; 18 a->last++; 19 return 1; 20 21 }
删除元素:使位置x后的所有元素向前移动一个位置
1 int deleteList(ArrayList *a,int x){ 2 3 if(x<1 || x>a->last) 4 return 0; 5 6 int i; 7 for(i=x;i<=a->last;i++) 8 a->date[i-1] = a->date[i]; 9 a->last--; 10 return 1; 11 12 }
遍历
1 void printList(ArrayList *a){ 2 3 int i; 4 for(i=0;i<=a->last;i++) 5 printf("%d ",a->date[i]); 6 7 }
试运行:
void main(){ ArrayList *init_ArrayList(); int insertList(ArrayList *a,elemtype e,int x); int deleteList(ArrayList *a,int x); void printList(ArrayList *a); ArrayList *arrayList = init_ArrayList(); if(arrayList==NULL){ printf("空间分配失败"); return ; } printf("创建成功 "); insertList(arrayList,1,1); insertList(arrayList,2,2); insertList(arrayList,3,3); insertList(arrayList,4,4); insertList(arrayList,5,2); deleteList(arrayList,1); printList(arrayList); }
结果:
对于顺序表查找最为方便快捷:
1 int getPois(ArrayList *a,elemtype e){//获得位置 2 3 int i; 4 for(i=0;i<=a->last;i++){ 5 if(a->date[i]==e) 6 return i+1; 7 } 8 return -1; 9 10 } 11 12 elemtype getEle(ArrayList *a,int x){//获得元素 13 14 if(x<1 || x>a->last+1) 15 return -1; 16 17 return a->date[x-1]; 18 19 }