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)元素移动的顺序

posted @ 2013-07-18 14:07  北风一叶  阅读(270)  评论(0编辑  收藏  举报