c語言順序表的基本操作
阿新 • • 發佈:2019-02-01
下面是順序表的基本操作,c語言版的資料結構書上寫的操作都實現了
因為總體程式碼太長如果寫在一個class中要近500行,閱讀和修改都不方便,所以採用分開寫,希望大家以後寫較長的程式時也採用這種方法,自己執行的所有功能都能實現,而且個人感覺介面還是比較人性化的,大家還有什麼意見或者程式有什麼問題都可以在評論區提出,我會及時修改的。
seqlist.h #ifndef SEQLIST_H #define SEQLIST_H #include <stdio.h> #include <malloc.h> #define SEQLISR_INIT_SIZE 5 #define INC_SIZE 3 typedef int ElemType; typedef struct Seqlist { ElemType *base;//指標域 int capacity;//順序表容量 int size;//表的大小 }Seqlist; void create_list(Seqlist *list);//順序表元素的輸入 bool Inc(Seqlist *list);//增加順序表的容量 void InitSeqlist(Seqlist *list);//初始化順序表 void push_back(Seqlist *list,ElemType x);//在順序表的末尾插入元素 void push_front(Seqlist *list,ElemType x);//在順序表的頭部插入元素 void show_list(Seqlist *list);//顯示順序表的元素 void pop_back(Seqlist *list);//刪除順序表的最後一個元素 void pop_front(Seqlist *list);//刪除順序表的第一個元素 void insert_pos(Seqlist *list,int pos,ElemType x);//在順序表的指定位置插入資料 int find(Seqlist *list,ElemType key);//查詢元素key的下標 int length(Seqlist *list);//求順序表的長度 void delete_pos(Seqlist *list,int pos);//刪除順序表中指定位置的資料 void delete_val(Seqlist *list,int key);//刪除順序表中值為key的元素 void sort(Seqlist *list);//氣泡排序 void reverse(Seqlist *list);//逆置順序表 void clear(Seqlist *list);//清除順序表中的所有元素 void destroy(Seqlist *list);//摧毀順序表 void merge(Seqlist *lt,Seqlist *la,Seqlist *lb);//吧兩個表合為一個表 #endif // SEQLIST_H
seqlist.cpp #include "seqlist.h" void InitSeqlist(Seqlist *list)//初始化順序表,建立一個名字為List的線性表,list通過結構體定義 { list->base=(ElemType*)malloc(sizeof(ElemType)*SEQLISR_INIT_SIZE);//對錶list分配空間 if(!list->base) exit(-1); list->capacity=SEQLISR_INIT_SIZE;//順序表的容量 list->size=0;//順序表的大小/長度,表示當前順序表中無任何內容 } bool Inc(Seqlist *list)//增加順序表的容量 { ElemType *newbase=(ElemType*)realloc(list,sizeof(ElemType)*(list->capacity+INC_SIZE));//重新分配記憶體空間,增減INC個容量 if(newbase==NULL) printf("記憶體分配失敗!"); list->base=newbase; list->capacity+=INC_SIZE; } void create_list(Seqlist *list) { int i,x; printf("請確定輸入元素的個數:"); scanf("%d",&i); printf("請輸入元素\n"); for(int j=0; j<i; j++) { scanf("%d",&x); list->base[j]=x; } list->size=i; } void push_back(Seqlist *list,ElemType x)//在順序表的尾部插入元素 { if(list->size>=list->capacity&&!Inc(list)) { printf("順序表已滿,無法在尾部插入新元素"); return; } list->base[list->size]=x; list->size++; } void push_front(Seqlist *list,ElemType x)//在順序表頭部插入新元素 { if(list->size>=list->capacity&&!Inc(list)) { printf("順序表已滿,無法在尾部插入新元素"); return; } for(int i=list->size; i>0; i--) { list->base[i]=list->base[i-1]; } list->base[0]=x; list->size++; } void show_list(Seqlist *list)//順序表的列印輸出 { for(int i=0; i<list->size; i++) { printf("%d\n",list->base[i]); } } void pop_front(Seqlist *list)//刪除表頭元素 { if(list->size==0) { printf("順序表為空,無法刪除元素"); return; } for(int i=0; i<list->size-1; i++) { list->base[i]=list->base[i+1]; } list->size--; } void pop_back(Seqlist *list)//刪除最後一個元素 { if(list->size==0) { printf("順序表為空,無法刪除元素"); return; } list->size--;//這也太聰明瞭,直接減少一個元素 } int length(Seqlist *list) { return list->size; } void insert_pos(Seqlist *list,int pos,ElemType x)//在指定位置插入元素 { if(pos<0||pos>list->size) { printf("插入位置不合法,無法插入元素"); return; } if(list) for(int i=list->size; i>pos; i--) { list->base[i]=list->base[i-1]; } list->base[pos]=x; list->size++; } int find(Seqlist *list,ElemType key)//尋找key的位置 { for(int i=0; i<list->size; i++) { if(list->base[i]==key) return i; } return -1; } void delete_pos(Seqlist *list,int pos)//刪除指定位置的元素 { if(pos<0||pos>=list->size) { printf("刪除位置不合法"); return; } for(int i=pos; i<list->size-1; i++) { list->base[i]=list->base[i+1]; } list->base--; } void delete_val(Seqlist *list,int key)//刪除指定元素 { int pos=find(list,key); if(pos==-1) { printf("順序表中沒有這個元素"); return; } delete_pos(list,pos); } void sort(Seqlist *list) { for (int i = 0; i < list->size - 1; i++) //排序的趟數(例如5個數據需要比較4趟) { for (int j = 0; j < list->size - 1 - i; j++) //每一趟比較中的比較次數(例如5個數據在第0趟需要比較4次) { if (list->base[j] > list->base[j + 1]) { ElemType temp = list->base[j]; list->base[j] = list->base[j + 1]; list->base[j + 1] = temp; } } } } void reverse(Seqlist *list)//將順序表倒置 { if(list->size==0||list->size==1) return; int low=0,high=list->size-1; while(low<high) { ElemType temp=list->base[low]; list->base[low]=list->base[high]; list->base[high]=temp; low++; high--; } } void clear(Seqlist *list) { list->size=0; } void destroy(Seqlist *list)//摧毀順序表 { free(list->base); list->base=NULL; list->capacity=0; list->size=0; } void merge(Seqlist *lt,Seqlist *la,Seqlist *lb)//把兩個順序表合併為一個 { lt->capacity=la->size+lb->size; lt->base=(ElemType*)malloc(sizeof(ElemType)*lt->capacity); if(!lb->base) exit(-1); int ia=0,ib=0,ic=0; while(ia<la->size&&ib<lb->size) { if(la->base[ia]<lb->base[ib]) { lt->base[ic++]=la->base[ia++]; } else { lt->base[ic++]=lb->base[ib++]; } } while(ia<la->size) { lt->base[ic++]=la->base[ia++]; } while(ib<lb->size) { lt->base[ic++]=lb->base[ib++]; } lt->size=la->size+lb->size; show_list(lt); }
#include "seqlist.h" int main() { Seqlist list; InitSeqlist(&list); //create_list(&list); ElemType item; int pos; int select=1; printf("*******************************************\n"); printf("*[1] push_back [2] push_front *\n"); printf("*[3] show_list [4] pop_back *\n"); printf("*[5] pop_front [6] insert_pos *\n"); printf("*[7] find [8] length *\n"); printf("*[9] delete_pos [10] delete_value *\n"); printf("*[11] sort [12] reverse *\n"); printf("*[13] clear [14] merge *\n"); printf("*[0] quit_system *\n"); printf("*******************************************\n"); while(select) { printf("請選擇:>>"); scanf("%d",&select); if(select==0) break; switch(select) { case 1: printf("請輸入要插入的資料(-1結束)"); while(scanf("%d",&item),item!=-1) { push_back(&list,item); } break; case 2: printf("請輸入要插入的資料(-1結束)"); while(scanf("%d",&item),item!=-1) { push_front(&list,item); } break; case 3: show_list(&list); break; case 4: pop_back(&list); break; case 5: pop_front(&list); break; case 6: printf("請輸入要插入的資料:"); scanf("%d",&item); printf("請輸入要插入的位置:"); scanf("%d",&pos); insert_pos(&list,pos,item); break; case 7: printf("請輸入要查詢的資料:"); scanf("%d",&item); pos=find(&list,item); if(pos=-1) printf("要查詢的元素不在順序表中"); else printf("查詢元素的在順序表中的下標位置為:%d\n",pos); break; case 8: printf("順序表的長度為%d",length(&list)); break; case 9: printf("請輸入要刪除的值的下標位置:"); scanf("%d",&pos); delete_pos(&list,pos); break; case 10: printf("請輸入喲啊刪除的值"); scanf("%d",&item); delete_val(&list,item); break; case 11: sort(&list); break; case 12: reverse(&list); break; case 13: clear(&list); break; case 14: Seqlist mylist,yourlist; ElemType item1,item2; InitSeqlist(&mylist); InitSeqlist(&yourlist); printf("請輸入順序表1中的元素值"); while(scanf("%d",&item1),item1!=-1) { push_back(&mylist,item1); } printf("請輸入順序表2中的元素值"); while(scanf("%d",&item2),item2!=-1) { push_back(&yourlist,item2!=-1); } merge(&list,&mylist,&yourlist); destroy(&mylist); destroy(&yourlist); break; case 15: create_list(&list);//順序表的建立,輸入資料 break; default: printf("輸入的選擇錯誤"); break; } } destroy(&list); }