(C语言)顺序表之动态实现
2016-06-01 18:36
393 查看
点击打开链接(静态实现版)
http://blog.csdn.net/snow_5288/article/details/51520287
头文件:
review again:
头文件:
测试代码:
函数实现:
http://blog.csdn.net/snow_5288/article/details/51520287
头文件:
#define _CRT_SECURE_NO_WARNINGS 1 #ifndef _SEQLIST_H__ #define _SEQLIST_H__ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<assert.h> #define MAX 2 #define CHANGE_MAX 2 typedef int TYPE; typedef struct Seqlist { TYPE *data;//顺序表的最大容量 int sz;//当前顺序表的容量 int capacity;//顺序表能存储的最大容量 }Seqlist,*pSeqlist; enum OP { EXIT, PRINT, PUSH_BACK, POP_BACK, PUSH_FRONT, POP_FRONT, INSERT_POS, REMMOVE_POS, REMMOVE_ALL, SORT, BIN_SEARCH }; void menu();//打印菜单 void check_capacity(pSeqlist seq);//检查是否需要扩容 void destroy(pSeqlist seq);//释放动态申请的空间 void init_seqlist(pSeqlist seq);//初始化顺序表 void print_seqlist(pSeqlist seq);//打印顺序表 void push_back(pSeqlist seq,TYPE x);//删除顺序表的尾部元素 void pop_back(pSeqlist seq);//在顺序表的尾部插入一个元素 void push_front(pSeqlist seq,TYPE x);//删除顺序表的首部元素 void pop_front(pSeqlist seq);//在顺序表的首部插入一个元素 void insert_pos(pSeqlist seq,TYPE pos,TYPE x);//在特定位置插入元素x void remmove_pos(pSeqlist seq, TYPE x);//删除顺序表中的特定元素x void remmove_all(pSeqlist seq,TYPE x);//删除所有值为x的元素 void sort(pSeqlist seq);//排序顺序表(可通过冒泡排序,快速排序,选择排序等多种排序方法) int binary_search(pSeqlist seq,TYPE x);//二分查找顺序表中特定元素x #endif//_SEQLIST_H__主函数部分:
#include"seq.h" int main() { TYPE x=0; int input=1; int sz=0; int pos=0; int ret=0; Seqlist seq; init_seqlist(&seq); while(input) { menu(); printf("请输入一个你要进行的操作:"); scanf("%d",&input); switch(input) { case PRINT: print_seqlist(&seq); break; case PUSH_BACK: printf("一个你要添加的元素:"); scanf("%d",&x); push_back(&seq,x); break; case POP_BACK: pop_back(&seq); break; case PUSH_FRONT: printf("一个你要添加的元素:"); scanf("%d",&x); push_front(&seq,x); break; case POP_FRONT: pop_front(&seq); break; case INSERT_POS: printf("请输入你要添加的位置:"); scanf("%d",&pos); printf("一个你要添加的元素:"); scanf("%d",&x); insert_pos(&seq,pos,x); break; case REMMOVE_POS: printf("请输入你要删除的位置:"); scanf("%d",&pos); remmove_pos(&seq,pos); break; case REMMOVE_ALL: printf("一个你要删除的元素:"); scanf("%d",&x); remmove_all(&seq,x); break; case SORT: sort(&seq); break; case BIN_SEARCH: printf("一个你要查找的元素:"); scanf("%d",&x); ret=binary_search(&seq,x); printf("你要查找的数为:%d\n",ret); break; case EXIT: destroy(&seq); seq.data=NULL; break; } } system("pause"); return 0; }代码实现:
#define _CRT_SECURE_NO_WARNINGS 1 #include"seq.h" void menu() { printf("********************\n"); printf("***1.print_seqlist**\n"); printf("***2.push_back******\n"); printf("***3.pop_back*******\n"); printf("***4.push_front*****\n"); printf("***5.pop_front******\n"); printf("***6.insert_pos*****\n"); printf("***7.remmove_pos****\n"); printf("***8.remmove_all****\n"); printf("***9.sort***********\n"); printf("**10.binary_search**\n"); printf("**0.exit***********\n"); } void check_capacity(pSeqlist seq)//检查是否需要扩容 { if(seq->sz==seq->capacity)//说明人数已达到可容纳人数的最大值 { TYPE *tmp=(TYPE *)realloc(seq->data,(seq->capacity+CHANGE_MAX)*sizeof(TYPE)); if(tmp==NULL) { printf("out of memory\n"); exit(EXIT_FAILURE); } else { seq->data=tmp; seq->capacity+=CHANGE_MAX; } } } void init_seqlist(pSeqlist seq)//初始化顺序表 { seq->data=(TYPE *)malloc(MAX*sizeof(TYPE));//动态申请空间 if(seq->data==NULL) { printf("out of memory.\n"); exit(EXIT_FAILURE); } seq->sz=0; seq->capacity=MAX; memset(seq->data,0,MAX*sizeof(TYPE)); } void print_seqlist(pSeqlist seq)//打印顺序表 { int i=0; for(;i<seq->sz;i++) { printf("%d ",seq->data[i]); } printf("\n"); } void push_back(pSeqlist seq,TYPE x)//顺序表的尾部插入元素x { assert(seq); check_capacity(seq);//插入元素前先检查是否需要扩容 seq->data[seq->sz]=x; seq->sz++; } void pop_back(pSeqlist seq)//在顺序表的尾部一个删除元素 { assert(seq); if(seq->sz == 0) { printf("顺序表已空\n"); return ; } else { seq->sz--; } } void push_front(pSeqlist seq,TYPE x)//顺序表的首部插入元素x { int i=0; assert(seq); check_capacity(seq);//插入元素前先检查是否需要扩容 for(i=0; i<seq->sz; i++) { seq->data[seq->sz+i]=seq->data[seq->sz-1+i]; } seq->data[0]=x; seq->sz++; } void pop_front(pSeqlist seq)//在顺序表的首部删除一个元素 { assert(seq); if(seq->sz==0) { printf("顺序表已空!\n"); return; } else { int i=0; for(i=0; i<seq->sz; i++) seq->data[i]=seq->data[i+1]; seq->sz--; } } void insert_pos(pSeqlist seq,TYPE pos,TYPE x)//在特定位置插入元素x { int i=0; assert(seq); check_capacity(seq);//插入元素前先检查是否需要扩容 for(i=seq->sz-1; i>=pos; i--) { seq->data[i+1]=seq->data[i];seq->sz++; } seq->data[pos]=x; seq->sz++; } void remmove_pos(pSeqlist seq, TYPE x)//删除顺序表中的特定元素x { assert(seq); if(seq->sz==0) { printf("顺序表已空!\n"); } else { int i=0; for(i=0; i<seq->sz; i++) { if(seq->data[i]==x) { seq->data[i]=seq->data[i+1]; } } seq->sz--; } } void remmove_all(pSeqlist seq,TYPE x)//删除所有值为x的元素 { if(seq->sz==0) { printf("顺序表已空!\n"); } else { int count=0; int i=0; assert(seq); for(i=0; i<seq->sz; i++) { if(seq->data[i]==x) { count++; seq->data[i]=seq->data[i+1]; } } seq->sz=seq->sz-count; } } void sort(pSeqlist seq)//排序顺序表(可通过冒泡排序,快速排序,选择排序等多种排序方法) { if(seq->sz==0) { printf("顺序表为空!\n"); } else { int i=0; int j=0; assert(seq); for(i=0; i<seq->sz; i++) { for(j=0; j<seq->sz-i; j++) { if(seq->data[j]>seq->data[j+1]) { TYPE tmp=0; tmp=seq->data[j]; seq->data[j]=seq->data[j+1]; seq->data[j+1]=tmp; } } } } } int binary_search(pSeqlist seq,TYPE x)//二分查找顺序表中特定元素x { int left=0; int right=seq->sz-1; int mid=(right-left)/2+left; assert(seq); if(seq->sz==0) { printf("顺序表为空!\n"); } else { Seqlist pseq; sort(&pseq);//勿忘二分查找的前提必须为有序数组 while(left<right) { if(seq->data[x]<seq->data[mid]) { right=mid-1; } else if(seq->data[x]>seq->data[mid]) { left=mid+1; } else { return seq->data[mid]; } left--; right++; } return seq->data[mid]; printf("查找成功!\n"); } return seq->data[mid]; } void destroy(pSeqlist seq)//释放动态申请的空间 { free(seq->data); seq->data=NULL; seq->sz=0; seq->capacity=0; }
review again:
头文件:
#ifndef __SEQLIST_H__ #define __SEQLIST_H__ //#pragma once #include<stdio.h> #include<stdlib.h> #include<string.h> #include<assert.h> typedef int Datatype; typedef struct SeqList { Datatype *arr; int size; int capacity; }SeqList,*pseq; enum OP { EXIT, PRINT_SEQLIST, PUSHBACK, POPBACK, PUSHFRONT, POPFRONT, INSERT, ERASE, FIND, REMMOVE, REMMOVE_ALL, EMPTY, SIZE, BUBBLE_SORT, SELECT_SORT, BINARY_SEARCH, CLEAR }; void init_seqlist(pseq seq); void check_capacity(pseq seq); void print_seqlist(pseq seq); void pushback(pseq seq,Datatype x); void popback(pseq seq); void pushfront(pseq seq,Datatype x); void popfront(pseq seq); void insert(pseq seq,int pos,Datatype x); void erase(pseq seq,int pos); int find(pseq seq,Datatype x); void remmove(pseq seq,Datatype x); void remmove_all(pseq seq,Datatype x); void empty(pseq seq); int size(pseq seq); void bubble_sort(pseq seq); void select_sort(pseq seq); //int binary_search(pseq seq,Datatype x); int binary_search(pseq seq,int left,int right,Datatype x); void clear(pseq seq); void destroy(pseq seq); #endif //__SEQLIST_H__<span style="color:#ff0000;"> </span>
测试代码:
#define _CRT_SECURE_NO_WARNINGS 1 #include"m_seqlist.h" void menu() { printf("0.exit*************1.print_SeqList*****\n"); printf("2.pushback*********3.pophback**********\n"); printf("4.pushfront********5.popfront**********\n"); printf("6.insert***********7.erase*************\n"); printf("8.find*************9.remmove***********\n"); printf("10.remmove_all*****11.empty************\n"); printf("12.size************13.bubble_sort******\n"); printf("14.select_sort*****15.binary_search****\n"); printf("16.clear*******************************\n"); } int main() { int input = 1; SeqList seqlist; init_seqlist(&seqlist); while(1) { menu(); printf("请输入你要操作的菜单选项:"); scanf("%d",&input); switch(input) { case PRINT_SEQLIST: print_seqlist(&seqlist); break; case PUSHBACK: { Datatype x = 0; printf("请输入你要插入的元素:"); scanf("%d",&x); pushback(&seqlist,x); } break; case POPBACK: popback(&seqlist); break; case PUSHFRONT: { Datatype x = 0; printf("请输入你要插入的元素:"); scanf("%d",&x); pushfront(&seqlist,x); } break; case POPFRONT: popfront(&seqlist); break; case INSERT: { Datatype x = 0; int pos = 0; printf("请输入你要插入的元素:"); scanf("%d",&x); printf("请输入你要插入的位置:"); scanf("%d",&pos); insert(&seqlist,pos,x); } break; case ERASE: { int pos = 0; printf("请输入你要擦除插入的位置:"); scanf("%d",&pos); erase(&seqlist,pos); } break; case FIND: { int ret = 0; Datatype x = 0; printf("请输入你要查找的元素:"); scanf("%d",&x); ret=find(&seqlist,x); if(ret!=-1) printf("你要查找的元素第一次出现的下标为:%d\n",ret); else printf("你要查找的元素不存在\n"); } break; case REMMOVE: { Datatype x = 0; printf("请输入你要删除的元素:"); scanf("%d",&x); remmove(&seqlist,x); } break; case REMMOVE_ALL: { Datatype x = 0; printf("请输入你要删除的元素:"); scanf("%d",&x); remmove_all(&seqlist,x); } break; case EMPTY: empty(&seqlist); break; case SIZE: { int ret = size(&seqlist); printf("顺序表中共有%d个元素\n",ret); } break; case BUBBLE_SORT: bubble_sort(&seqlist); break; case SELECT_SORT: select_sort(&seqlist); break; case BINARY_SEARCH: { int ret = 0; Datatype x = 0; printf("请输入你要查找的元素:"); scanf("%d",&x); //ret = binary_search(&seqlist,x); ret = binary_search(&seqlist,0,seqlist.size-1,x); if(ret == -1) printf("没找到要查找元素\n"); else printf("查找元素的下标为:%d\n",ret); } break; case CLEAR: clear(&seqlist); break; case 0: destroy(&seqlist); exit(0); break; default: printf("参数错误,请重新输入\n"); break; } } system("pause"); return 0; }
函数实现:
#define _CRT_SECURE_NO_WARNINGS 1 #include"m_seqlist.h" void init_seqlist(pseq seq) { assert(seq); seq->arr = (Datatype *)malloc(3*sizeof(Datatype));//起初先分配3个空间 if(NULL == seq->arr) { printf("out of memory.\n"); exit(1); } else { memset(seq->arr,0,3*sizeof(Datatype)); seq->size = 0; seq->capacity = 3; } } void check_capacity(pseq seq) { Datatype *temp = NULL; assert(seq); if(seq->size >= seq->capacity)//说明容量不够了,需要扩容 { temp = (Datatype *)realloc(seq->arr,(3+seq->capacity*2)*sizeof(Datatype)); if(NULL == temp) { printf("out of memory.\n"); exit(1); } else { seq->arr = temp; seq->capacity += 3+seq->capacity*2; } } } void print_seqlist(pseq seq) { int i = 0; assert(seq); for(i=0; i<seq->size; i++) { printf("%d->",seq->arr[i]); } printf("end\n"); } void pushback(pseq seq,Datatype x) { assert(seq); check_capacity(seq); seq->arr[seq->size++] = x; printf("插入成功\n"); } void popback(pseq seq) { assert(seq); if(seq->size==0) printf("顺序表已空\n"); else { //方法1: seq->size--;//将最后一个元素删除即可 ////方法2:调用擦除函数实现 //erase(seq,seq->size-1); printf("删除成功\n"); } } void pushfront(pseq seq,Datatype x) { int i = 0; assert(seq); check_capacity(seq); // //方法1(如果顺序表的元素与顺序无关) //seq->arr[seq->size]=seq->arr[0];//将首元素保存到最后位置 //seq->arr[0]=x; //seq->size++; ////方法2:调用插入函数 //insert(seq,0,x); ////方法3: //int i = 0; //for(i=seq->size; i>0; i--)//移动元素 //{ // seq->arr[i] = seq->arr[i-1]; //} //seq->arr[0] = x;//插入元素 //seq->size++; //方法4: for(i=seq->size-1; i>=0; i--)//移动元素 { seq->arr[i+1] = seq->arr[i]; } seq->arr[0] = x;//插入元素 seq->size++; printf("插入成功\n"); } void popfront(pseq seq) { assert(seq); if(seq->size == 0) printf("顺序表已空\n"); else { // //方法1(如果顺序表的元素与顺序无关) //seq->arr[0]=seq->arr[seq->size-1];//将首元素保存到最后 //seq->size--; ////方法2:直接调用擦除函数 //erase(seq,0); ////方法3: //int i = 0; //for(i=0; i<seq->size-1; i++)//移动元素 //{ // seq->arr[i] = seq->arr[i+1]; //} //seq->size--; //方法4: int i = 0; for(i = 1; i<seq->size; i++)//移动元素 { seq->arr[i-1] = seq->arr[i]; } seq->size--; } printf("删除成功\n"); } void insert(pseq seq,int pos,Datatype x) { int i = 0; assert(seq); check_capacity(seq); ////方法1: // int i = 0; //for(i=seq->size; i>pos; i--) //{ // seq->arr[i] = seq->arr[i-1]; //} //seq->arr[pos] = x; //seq->size++; //方法2: for(i=seq->size-1; i>=pos; i--) { seq->arr[i+1] = seq->arr[i]; } seq->arr[pos] = x; seq->size++; printf("插入成功\n"); } void erase(pseq seq,int pos) { assert(seq); if(seq->size==0) printf("顺序表已空\n"); else { int i = 0; for(i=pos; i<seq->size-1; i++) { seq->arr[i] = seq->arr[i+1]; } seq->size--; printf("擦除成功\n"); } } int find(pseq seq,Datatype x) { int i = 0; assert(seq); for(i=0; i<seq->size; i++) { if(seq->arr[i] == x) return i;//返回首次出现位置的下标 } return -1; } void remmove(pseq seq,Datatype x) { assert(seq); if(seq->size==0) printf("顺序表已空\n"); else { int i = 0; for(i=0; i<seq->size; i++) { if(seq->arr[i]==x) { int j = 0; for(j=i; j<seq->size; j++)//移动元素 { seq->arr[j]=seq->arr[j+1]; } } } seq->size--; printf("删除成功\n"); } } void remmove_all(pseq seq,Datatype x) { assert(seq); if(seq->size==0) printf("顺序表已空\n"); else { // //方法1:找一个删一个 //int i = 0; //int count = 0; //for(i=0; i<seq->size; ++i) //{ // if(seq->arr[i] == x) // { // int j = 0; // for(j=i; j<seq->size; j++)//移动元素 // { // seq->arr[j]=seq->arr[j+1]; // } // seq->size--; // } //} //方法2: int i = 0; int count = 0; assert(seq); for(i=0; i<seq->size; i++) { seq->arr[i-count]=seq->arr[i]; if(seq->arr[i] == x) count++; } seq->size-=count; } printf("删除成功\n"); } void empty(pseq seq) { assert(seq); if(seq->size == 0) printf("顺序表为空\n"); else printf("顺序表不为空\n"); } int size(pseq seq) { assert(seq); return seq->size; } void bubble_sort(pseq seq) { // //普通写法 //int i = 0; //int flag = 0; //assert(seq); //for(i=0; i<seq->size-1; i++) //{ // int j = 0; // flag = 0; // for(j=0; j<seq->size-1-i; j++) // { // if(seq->arr[j]>seq->arr[j+1])//升序 // { // Datatype temp = seq->arr[j]; // seq->arr[j] = seq->arr[j+1]; // seq->arr[j+1] = temp; // flag = 1; // } // } // if(flag == 0) // break; //} //自由选择升序或排序 int option = 0; int i = 0; int flag = 0; assert(seq); printf("请输入你的选择:(0.升序 1.降序)"); scanf("%d",&option); for(i=0; i<seq->size-1; i++) { int j = 0; flag = 0; for(j=0; j<seq->size-1-i; j++) { if(option == 0) { if(seq->arr[j]>seq->arr[j+1])//升序 { Datatype temp = seq->arr[j]; seq->arr[j] = seq->arr[j+1]; seq->arr[j+1] = temp; flag = 1; } } else if(option == 1) { if(seq->arr[j]<seq->arr[j+1])//降序 { Datatype temp = seq->arr[j]; seq->arr[j] = seq->arr[j+1]; seq->arr[j+1] = temp; flag = 1; } } } if(flag == 0) break; } printf("排序成功\n"); } void select_sort(pseq seq) { ; } //int binary_search(pseq seq,Datatype x)//假设顺序表已经按升序排列好 //{ // int left = 0; // int right = 0; // int mid = 0; // assert(seq); // ////方法1,前闭后闭区间 // /*right = seq->size-1; // while(left <= right) // { // mid = left + ((right - left)>>1); // if(seq->arr[mid] > x) // right = mid-1; // else if(seq->arr[mid] < x) // left = mid+1; // else // return mid; // } // return -1;*/ // // ////方法2:前闭后开区间 // //right = seq->size; // //while(left < right) // //{ // // mid = (left & right)+((left ^ right)>>1); // // if(seq->arr[mid] > x) // // right = mid; // // else if(seq->arr[mid] < x) // // left = mid+1; // // else // // return mid; // //} // //return -1; //} //方法3:递归实现 int binary_search(pseq seq,int left,int right,Datatype x)//假设顺序表已经按升序排列好 { int mid = 0; assert(seq); if(left > right) return -1; mid = left + ((right - left)>>1); if(seq->arr[mid] > x) return binary_search(seq,left,mid-1,x); else if(seq->arr[mid] < x) return binary_search(seq,mid+1,right,x); else return mid; } void clear(pseq seq) { assert(seq); seq->size = 0; } void destroy(pseq seq) { assert(seq); free(seq->arr); seq->arr = NULL; }
相关文章推荐
- 设计模式C++实现(13)——中介者模式
- 设计模式C++实现(12)——备忘录模式
- 设计模式C++实现(11)——装饰模式
- 设计模式C++实现(10)——桥接模式
- 设计模式C++实现(9)——享元模式
- 设计模式C++实现(8)——代理模式
- 设计模式C++实现(7)——外观模式、组合模式
- c++-引用一维数组
- 2016年第七届蓝桥杯C/C++程序设计本科B组决赛
- (C++)虚析构函数
- 第十三周【项目 1分数类中的运算符重载】
- C++中的头文件和源文件的学习
- C++ 初始化列表
- cpp 4个类型转换
- C/C++中static关键字详解
- C++的头文件和实现文件分别写什么
- 第10章 C语言及程序设计提高例程-37 操作字符串数组
- c语言实现的的map
- C++多继承中虚基类
- 第13周项目2--动物这样叫(2)