顺序表

来源:互联网 发布:图片文字识别软件 编辑:程序博客网 时间:2024/05/21 21:39

顺序表的是计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。顺序表是将表中的元素(节点)一个接一个存入一组连续的存储单元中。

静态顺序表,大小已知,实现基本的增删改查。

由于顺序表是一个依次存储的线性结构,在插入或者删除节点时可以有头插头删,尾插尾删。

我们可以定义一个结构体,用来保存表的数据和数据的个数。

接下来折半查找顺序表可以实现以下功能:

1:尾插

2:尾删

3:头插

4:头删

5:在给定位置插入元素

6:删除给定位置的元素

7:删除给定的元素

8:删除几个相同的元素

9:实现顺序表的几种排序如:冒泡排序,选择排序,插入排序

10:折半查找

头文件

#define _CRT_SECURE_NO_WARNINGS 1#ifndef __SEQLIST__#define __SEQLIST__#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>#define MAX_SIZE 10typedef int  datatype;typedef struct Seqlist{    datatype arr[MAX_SIZE];//存放表的数据;    size_t size;//数据的个数;}Seqlist;void Init(Seqlist* seq);//初始化;void PrintSeqlist(Seqlist *seq);//打印顺序表;//实现增删改查;void  Pushback(Seqlist *seq, datatype x);void Popback(Seqlist *seq, datatype x);void PushFront(Seqlist *seq, datatype x);void PopFront(Seqlist *seq, datatype x);void Insert(Seqlist *seq, datatype x,size_t pos);int Find(Seqlist *seq, datatype x);void Erase(Seqlist *seq, size_t pos);void Remove(Seqlist *seq, datatype x);void Removall(Seqlist *seq, datatype x);void BubbleSort(Seqlist *seq);void SelsectSort(Seqlist *seq);void InsertSort(Seqlist *seq, datatype x);int BinarySearch(Seqlist *seq, datatype x);#endif
一.实现一个顺序表的初始化。

//初始化void Init(Seqlist *seq){assert(seq);seq->size= 0;//顺序表的初始化;memset(seq, 0, sizeof(datatype)*MAX_SIZE);}
二.然后是打印顺序表。
//打印void PrintSeqlist(Seqlist *seq){assert(seq);int i = 0;for (; i < seq->size; i++){printf(" %d ", seq->arr[i]);}printf("\n");}
三.尾插,判断这个表是否满了,没满就继续插入数据。
//尾插void  Pushback(Seqlist *seq, datatype x){assert(seq);if (seq->size == MAX_SIZE){printf("list is full\n");exit(0);}seq->arr[seq->size] = x;seq->size++;}

四.尾删要考虑是否为空表。

//尾删void Popback(Seqlist *seq, datatype x){assert(seq);//空表//不为空if (seq->size == 0){printf("list is empty\n");exit(0);}seq->size--;}
五.头插

//头插

void PushFront(Seqlist*seq, datatype x)

{assert(seq);if (seq->size == MAX_SIZE)//表满;{printf("list is full\n");exit(0);}int i = 0;for (i = seq->size; i >= 0;i--){seq->arr[i] = seq->arr[i-1];}seq->arr[0] = x;seq->size++;}

六.头删,判断顺序表是否为空。

//头删void PopFront(Seqlist *seq, datatype x){assert(seq);if (seq->size == 0){printf("list is enpty\n");exit(0);}int i = 0;for (i = 0; i < seq->size;i++){seq->arr[i] = seq->arr[i+1];}seq->size--;}

七.在指定位置插入元素

//插入void Insert(Seqlist *seq, datatype x, size_t pos){assert(seq);if (seq->size == MAX_SIZE || (pos<1 && pos > MAX_SIZE+1)){printf("list is full\n");exit(0);}int i = 0;for (i = seq->size-1; i >= pos; i--){seq->arr[i+1] = seq->arr[i];}seq->arr[pos] = x;seq->size++;}

八.删除指定位置的元素,原理就是找到所在的位置,然后后一个把前一个覆盖即可。

//删除指定位置的元素;void Erase(Seqlist *seq, size_t pos){assert(seq);if (seq->size == 0){printf("list is empty\n");exit(0);}int i = 0;for (i= pos; i < seq->size; i++){seq->arr[i] = seq->arr[i + 1];}seq->size--;}

九.删除给定的元素用两个循环,第一次找到元素,break,第二次循环左移把要删除的元素覆盖即可。

//删出给定元素void Remove(Seqlist *seq, datatype x){assert(seq);if (seq->size == 0){printf("list is empty\n");exit(0);}int i = 0;for (i = 0; i < seq->size;i++){if (seq->arr[i] == x){break;}}if (i == seq->size){printf("删除的元素不存在\n");exit(0);}int j = 0;for (j = i + 1; j < seq->size; j++){seq->arr[j - 1] = seq->arr[j];}seq->size--;}

十.删除几个相同的元素,外循环控制移动的步数,内循环从开始删除的位置开始,后面把前面覆盖。

//删除出现相同的元素void Removall(Seqlist *seq, datatype x){assert(seq);if (seq->size == 0){printf("list is full");exit(0);}int i = 0;for (i = 0; i < seq->size; i++){if (x == seq->arr[i]){int j = 0;for (j = i; j < seq->size - 1; j++){seq->arr[j] = seq->arr[j + 1];}seq->size--;i--;}}}

十一.冒泡排序,此处是升序排序。

//冒泡排序void BubbleSort(Seqlist *seq){assert(seq);int i = 0;int flag = 1;for (; i < seq->size; i++){int j = 0;flag = 0;for (j = 0; j < seq->size - i - 1; j++){if (seq->arr[j]>seq->arr[j+1]){int tmp = seq->arr[j];seq->arr[j] = seq->arr[j + 1];seq->arr[j + 1] = tmp;flag = 1;}}if (flag != 1){break;}}}

十二.插入排序,原理将一个无序数插入到一个有序的序列中。

//插入排序void InsertSort(Seqlist *seq){assert(seq);int i = 0;for (i = 1; i < seq->size; i++){   int tmp = seq->arr[i];   int j = 0;   for (j = i - 1; j >= 0; j--)   {   if (seq->arr[j]>tmp)   {   seq->arr[j + 1] = seq->arr[j];   }   else   {   break;   }   }   seq->arr[j+1] = tmp;}}
十三.选择排序找到最小值,然后依次与其他的比较。
//选择排序void SelsectSort(Seqlist *seq){assert(seq);int i = 0;for (i = 0; i < seq->size-1; i++){int min =i;int j = 0;for (j = i+1; j < seq->size; j++){if ((seq->arr[min]) >(seq->arr[j])){min = j;}}if (seq->arr[min] != seq->arr[i]){int tmp = seq->arr[i];seq->arr[i] = seq->arr[min];seq->arr[min] = tmp;}}}
十四.折半查找,每一次使规模缩小一半,查找比较高效。

//二分查找int BinarySearch(Seqlist *seq, datatype x){assert(seq);int left = 0;int right = seq->size - 1;if (seq->size == 0){printf("list is empty\n");}if (left > right){return;}while (left <= right){int mid = left + ((left + right) >> 1);if (seq->arr[mid] == x){printf("找到了%d\n",x);break;}  else if (seq->arr[mid] < x)  {left = mid + 1;  }  else    {right = mid - 1;   }}}
主函数的实现:

//尾插尾删测试void test1(){Seqlist seq;Init(&seq);Pushback(&seq, 1);Pushback(&seq, 2);Pushback(&seq, 3);Pushback(&seq, 4);Popback(&seq, 3);Popback(&seq, 4);PrintSeqlist(&seq);}//头插头删测试void test2(){Seqlist seq;Init(&seq);PushFront(&seq, 1);PushFront(&seq, 2);PushFront(&seq, 3);PushFront(&seq, 4);PushFront(&seq, 5);PushFront(&seq, 6);PopFront(&seq, 6);PopFront(&seq, 5);PrintSeqlist(&seq);}//插入删除测试void test3(){Seqlist seq;Init(&seq);Pushback(&seq, 1);Pushback(&seq, 3);Pushback(&seq, 4);Insert(&seq,2,2);PrintSeqlist(&seq);Erase(&seq, 4);PrintSeqlist(&seq);}//测试删除给定的某个元素,删除几个相同元素void test4(){Seqlist seq;Init(&seq);Pushback(&seq, 1);Pushback(&seq, 2);Pushback(&seq, 2);Pushback(&seq, 2);Pushback(&seq, 3);Pushback(&seq, 4);PrintSeqlist(&seq);Remove(&seq, 4);PrintSeqlist(&seq);Removall(&seq, 2);PrintSeqlist(&seq);}//测试几种排序void test5(){Seqlist seq;Init(&seq);Pushback(&seq, 5);Pushback(&seq, 2);Pushback(&seq, 4);Pushback(&seq, 3);Pushback(&seq, 1);PrintSeqlist(&seq);BubbleSort(&seq);PrintSeqlist(&seq);Pushback(&seq, 4);Pushback(&seq, 3);SelsectSort(&seq);PrintSeqlist(&seq);InsertSort(&seq);PrintSeqlist(&seq);}//测试折半查找void test6(){Seqlist seq;Init(&seq);Pushback(&seq, 1);Pushback(&seq, 2);Pushback(&seq, 3);Pushback(&seq, 4);;BinarySearch(&seq, 1);PrintSeqlist(&seq);}int main(){test1();test2();test3();test4();test5();test6();system("pause");return 0;}


















1 0
原创粉丝点击