C语言实现线性表连续存储结构相关算法
使用C语言编写的线性表连续存储结构的各种算法,包括插入,删除,清空,判断是否已满等,以下为代码:
1 # include <stdio.h> 2 # include <malloc.h> 3 # include <stdlib.h> //包含了exit函数 4 5 struct Arr 6 { 7 int * pBase; 8 int len; 9 int cnt; 10 }; 11 12 //初始化 13 void init(struct Arr * p,int length); 14 //附加新元素 15 bool append(struct Arr * p,int val); 16 //添加新元素 17 bool insert(struct Arr * p,int pos,int val); 18 //删除一个元素 19 bool deleteArr(struct Arr * p,int pos); 20 //删除所有的元素 21 bool deleteAll(struct Arr * p); 22 //获取指定位置的元素 23 int get(struct Arr * p,int pos); 24 25 bool isEmpty(struct Arr * p);//判断是否为空 26 //判断是否已满 27 bool isFull(struct Arr * p); 28 //排序(升序) 29 bool sortAsc(struct Arr * p); 30 //反转 31 void reverse(struct Arr * P); 32 //显示数组 33 void show(struct Arr * p); 34 35 int main(int argc, char *argv[]) 36 { 37 //初始一个有10元素的数组 38 struct Arr arr; 39 init(&arr,10); 40 //加入几个元素 41 append(&arr,-80); 42 append(&arr,-40); 43 append(&arr,50); 44 append(&arr,60); 45 append(&arr,3); 46 append(&arr,10); 47 append(&arr,30); 48 show(&arr); 49 insert(&arr,1,-1); 50 insert(&arr,11,8); 51 insert(&arr,3,5); 52 show(&arr); 53 deleteArr(&arr,4); 54 deleteArr(&arr,-8); 55 show(&arr); 56 sortAsc(&arr); 57 printf("排序后输出如下:\n"); 58 show(&arr); 59 reverse(&arr); 60 show(&arr); 61 return 0; 62 } 63 64 //初始化 65 void init(struct Arr * p,int length){ 66 p->pBase=(int *)malloc(sizeof(int) * length); 67 if(p->pBase==NULL){ 68 printf("数组初始化失败!\n"); 69 } 70 p->len=length; 71 p->cnt=0; 72 } 73 //附加新元素 74 bool append(struct Arr *p,int val){ 75 if(isFull(p)) 76 { 77 printf("数组已满,元素%d插入失败\n",val); 78 return true; 79 } 80 p->pBase[p->cnt]=val; 81 p->cnt=p->cnt+1; 82 return false; 83 } 84 //添加新元素 85 bool insert(struct Arr * p,int pos,int val) 86 { 87 if(isFull(p)) 88 { 89 printf("数组已满,向第%d个位置插入元素%d失败\n",pos,val); 90 return false; 91 } 92 if(pos<1||pos>p->cnt+1){ 93 printf("插入位置有误,向第%d个位置插入元素%d失败\n",pos,val); 94 return false; 95 } 96 for(int i=p->cnt;i>pos-1;i--){ 97 p->pBase[i]=p->pBase[i-1]; 98 } 99 p->pBase[pos-1]=val; 100 p->cnt=p->cnt+1; 101 return true; 102 } 103 //删除一个元素 104 bool deleteArr(struct Arr * p,int pos){ 105 if(isEmpty(p)) 106 { 107 printf("数组已空,删除第%d个元素%d失败\n",pos); 108 return false; 109 } 110 if(pos<1||pos>p->cnt){ 111 printf("删除位置有误,删除第%d个位置元素失败\n",pos); 112 return false; 113 } 114 for(int i=pos;i<p->cnt;i++){ 115 p->pBase[i-1]=p->pBase[i]; 116 } 117 p->cnt=p->cnt-1; 118 return true; 119 } 120 //删除所有的元素 121 bool deleteAll(struct Arr * p){ 122 p->cnt=0; 123 } 124 //获取指定位置的元素 125 int get(struct Arr * p,int pos){ 126 if(pos<-1||pos>p->cnt){ 127 printf("获取第%d个元素失败,您输入的位置有误\n!",pos); 128 return 0; 129 } 130 return p->pBase[pos-1]; 131 } 132 //判断是否为空 133 bool isEmpty(struct Arr * p){ 134 if(p->cnt==0){ 135 return true; 136 } 137 return false; 138 } 139 //判断是否已满 140 bool isFull(struct Arr * p){ 141 if(p->cnt==p->len){ 142 return true; 143 } 144 return false; 145 } 146 //排序(升序) 147 bool sortAsc(struct Arr * p){ 148 int t=0,i=0,j=0; 149 for(i=0;i<p->cnt;i++){ 150 for(j=i+1;j<p->cnt;j++){ 151 if(p->pBase[i]>p->pBase[j]){ 152 t=p->pBase[j]; 153 p->pBase[j]=p->pBase[i]; 154 p->pBase[i]=t; 155 } 156 } 157 } 158 } 159 //反转 160 void reverse(struct Arr * p){ 161 if(isEmpty(p)){ 162 return ; 163 } 164 int i=0,t=0,j=0; 165 j=p->cnt-1; 166 while(i<j) 167 { 168 t=p->pBase[i]; 169 p->pBase[i]=p->pBase[j]; 170 p->pBase[j]=t; 171 i++; 172 j--; 173 } 174 } 175 176 //显示数组 177 void show(struct Arr * p){ 178 if(isEmpty(p)) 179 { 180 printf("数组为空"); 181 } 182 int i=0; 183 for(i=0;i<p->cnt;i++){ 184 printf("%d ",p->pBase[i]); 185 } 186 printf("\n"); 187 }
线性表连续存储结构的算法中,插入与删除是最重要,需要重点掌握以下的两点:
1)插入或者删除的位置
2)元素移动的顺序