数据结构--顺序表相关操作

顺序表可以看做一个数组,对数组进行操作,体会这一点,顺序表的相关操作就比较容易实现。
代码如下:

seqlist.h

   #pragma once                                                                                                

   #include <stddef.h>

   #define SeqListMaxSize 1000
   typedef char SeqListType;

   typedef struct SeqList{
       SeqListType data[SeqListMaxSize];
      size_t size;
  }SeqList;

  //初始化
  void SeqListInit(SeqList* seqlist);

  //尾插
  void SeqListPushBack(SeqList* seqlist ,SeqListType value);

  //尾删
  void SeqListPopBack(SeqList* seqlist);

  //头插
  void SeqListPushFront(SeqList* seqlist,SeqListType value);

  //头删
  void SeqListPopFront(SeqList* seqlist);

  //给指定位置插入元素
  void SeqListInsert(SeqList* seqlist,size_t pos,SeqListType va

  //删除指定位置的元素
  void SeqListErase(SeqList* seqlist,size_t pos);

  //获取指定位置的值                                           
  int SeqListGet(SeqList* seqlist,size_t pos,SeqListType* value

  //给指定位置设置值
  void SeqListSet(SeqList* seqlist,size_t pos,SeqListType value

  //找到某个元素的下标,返回下标
  int SeqListFindPos(SeqList* seqlist,SeqListType value);

  //删除顺序表中指定的值, 如果存在重复元素, 只删除第一个 
  void SeqListRemove(SeqList* seqlist,SeqListType to_del);

  //删除顺序表中所有相同的元素
  void SeqListRemoveAll(SeqList* seqlist,SeqListType to_del);

  //获取顺序表中元素的个数                                     
  int SeqListSize(SeqList* seqlist);

  //顺序表判空,如果为空,返回1,否则返回0
  int SeqListEmpty(SeqList* seqlist);

  //冒泡排序
  void SeqListBubbleSort(SeqList* seqlist);

  //冒泡排序的扩展,可以指定升序,降序
  //对Cmp比较函数作以下约定
  //如果 a 和 b 满足比较规则,返回1,否则返回0
  //满足比较规则具体值:
  //如果是升序排序,a < b则称为满足比较规则
  typedef int(*Cmp)(SeqListType a,SeqListType b);
  void SeqListBubbleSortEx(SeqList* seqlist,Cmp cmp);

seqlist.c

  1 #include <stdio.h>                                           
  2 #include "seqlist.h"
  3 
  4 void SeqListInit(SeqList* seqlist){
  5     if(seqlist == NULL){
  6         //非法输入
  7         return;
  8     }
  9     seqlist->size = 0;
 10     return;
 11 }
 12 
 13 void SeqListPushBack(SeqList* seqlist,SeqListType value){
 14     if(seqlist == NULL){
 15         //非法输入
 16         return;
 17     }
 18     if(seqlist->size == SeqListMaxSize){
 19         //顺序表满
 20         return;
 21     }
 22     seqlist->data[seqlist->size] = value;
 23     seqlist->size++;
 24     return;
 25 }
 26 
 27 void SeqListPopBack(SeqList* seqlist){
 28     if(seqlist == NULL){                                     
 29         //非法输入
 30         return;
 31     }
 32     if(seqlist->size == 0){
 33         //空顺序表
 34         return;
 35     }
 36     seqlist->size--;
 37         return;
 38 }
 39 
 40 void SeqListPushFront(SeqList* seqlist,SeqListType value){
 41     if(seqlist == NULL){
 42         //非法输入
 43         return;                                              
 44     }
 45     if(seqlist->size == SeqListMaxSize){
 46         //顺序表满
 47         return;
 48     }
 49     seqlist->size++;
 50     size_t i = seqlist->size-1;
 51     for(;i>0;i--){
 52         seqlist->data[i] = seqlist->data[i-1];
 53     }
 54     seqlist->data[0] = value;
 55     return;
 56 }
 57 
 58 void SeqListPopFront(SeqList* seqlist){                      
 59     if(seqlist == NULL){
 60         //非法输入
 61         return;
 62     }
 63     if(seqlist->size == 0){
 64         //空顺序表                                           
 65         return;
 66     }
 67     size_t i = 0;
 68     for(;i<seqlist->size;i++){
 69         seqlist->data[i] = seqlist->data[i+1];
 70     }
 71     seqlist->size--;
 72     return;
 73 }
 74 
 75 void SeqListInsert(SeqList* seqlist,size_t pos,SeqListType va
 76     if(seqlist == NULL){
 77         //非法输入
 78         return;
 79     }
 80     if(seqlist->size == SeqListMaxSize){
 81         //顺序表满
 82         return;
 83     }
 84     seqlist->size++;
 85     size_t i = seqlist->size-1;
 86     for(;i>pos;i--){
 87         seqlist->data[i] = seqlist->data[i-1];
 88     }                                                        
 89     seqlist->data[pos] = value;
 90     return;
 91 }
 92 
 93 void SeqListErase(SeqList* seqlist,size_t pos){
 94     if(seqlist == NULL){
 95         //非法输入
 96         return;
 97     }
 98     if(seqlist->size == 0){
 99         //空顺序表
100         return;
101     }
102     size_t i = pos;
103     for(;i<seqlist->size;i++){                               
104         seqlist->data[i] = seqlist->data[i+1];
105     }
106     seqlist->size--;
107     return;
108 }
109 
110 int SeqListGet(SeqList* seqlist,size_t pos,SeqListType* value
111     if(seqlist == NULL){
112         //非法输入
113         return 0;
114     }
115     if(pos >= seqlist->size){
116         //非法输入
117         return 0;
118     }                                                        
119     *value = seqlist->data[pos];
120     return 1;
121 }
122 
123 void SeqListSet(SeqList* seqlist,size_t pos,SeqListType value
124     if(seqlist == NULL){
125         //非法输入
126         return;
127     }
128     if(pos >= seqlist->size){
129         //非法位置
130         return;
131     }
132     seqlist->data[pos] = value;
133     return;                                                  
134 }
135 
136 int SeqListFindPos(SeqList* seqlist,SeqListType value){
137     if(seqlist == NULL){
138         //非法输入
139         return 0;                                            
140     }
141     size_t i = 0;
142     for(;i<seqlist->size;i++){
143         if(seqlist->data[i] == value){
144             return i;
145         }
146     }
147     return -1;
148 }
149 
150 void SeqListRemove(SeqList* seqlist,SeqListType to_del){
151     if(seqlist == NULL){
152         //非法输入
153         return;
154     }
155     size_t pos = SeqListFindPos(seqlist,to_del);
156     if(pos ==(size_t) -1){
157         //没找到
158         return;
159     }
160     SeqListErase(seqlist,pos);
161     return;
162 }
163                                                              
164 void SeqListRemoveAll(SeqList* seqlist,SeqListType to_del){
165     if(seqlist == NULL){
166         //非法输入
67         return;
168     }
169     while(1){
170         size_t pos = SeqListFindPos(seqlist,to_del);
171             if(pos == (size_t) -1){
172                 break;
173             }
174         SeqListErase(seqlist,pos);
175     }
176     return;
177 }
178                                                              
179 int SeqListSize(SeqList* seqlist){
180     if(seqlist == NULL){
181         //非法输入
182         return 0;
183     }
184     return seqlist->size;
185 }
186 
187 int SeqListEmpty(SeqList* seqlist){
188     if(seqlist == NULL){
189         //非法输入
190         return -1;
191     }
192     if(seqlist->size == 0){
193         return 1;                                            
194     }
195     return 0;
196 }
197 
198 void swap(SeqListType* a,SeqListType* b){
199     SeqListType tmp = *a;                                    
200     *a = *b;
201     *b = tmp;
202 }
203 void SeqListBubbleSort(SeqList* seqlist){
204     if(seqlist == NULL){
205         //非法输入
206         return;
207     }
208     size_t count = 0;
209     for(;count<seqlist->size;count++){
210         size_t i = 0;
211         for(i=0;i<seqlist->size - count - 1;i++){
212             if(seqlist->data[i]>seqlist->data[i+1]){
213                 swap(&seqlist->data[i],&seqlist->data[i+1]);
214             }                                                
215         }
216     }
217     return;
218 }
219 
220 void SeqListBubbleSortEx(SeqList* seqlist,Cmp cmp){
221     if(seqlist == NULL){
222         //非法输入
223         return;
224     }
225     size_t count = 0;
226     for(;count<seqlist->size;count++){
227         size_t cur = 0;
228         for(cur=0;cur<seqlist->size - count - 1;cur++){
229             if(!cmp(seqlist->data[cur],seqlist->data[cur+1]))
230                 swap(&seqlist->data[cur],&seqlist->data[cur+1
231 
232           }
233         }
234     }
235     return;
236 }

猜你喜欢

转载自blog.csdn.net/liru_1996/article/details/80198328
今日推荐