####本片博客主要包含顺序表以下几个操作:
1、 初始化顺序表
2、 尾部插入
3、 尾部删除
4、头部插入
5、头部删除
6、 指定位置插入
7、 指定位置删除
8、 删除指定元素(第一次出现的那一个)
9、 删除所有指定元素 (三种方法)
10、查找指定元素 ,返回其下标,没有那个元素就返回 -1
11、返回顺序表大小
12、判断顺序表是否为空
13、冒泡排序
14、选择排序
15、选择排序的优化
16、二分查找(非递归写法)
17、二分查找 (递归写法)
18、打印顺序表内容
1、头文件 SequList.h
#ifndef __SeqLIst_h__
#define __SeqLIst_h__
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define MAX 10
typedef int DataType;
typedef struct SeqList
{
DataType data[MAX];
int sz;
}SeqList;
//显示内容
void show(SeqList *pList);
//初始化
void SeqListInit (SeqList *pList);
//尾部插入
void SeqListPushBack (SeqList *pList, DataType d);
//尾部删除
void SeqListPopBack (SeqList *pList);
//头部插入
void SeqListPushFront (SeqList *pList, DataType d);
//头部删除
void SeqListPopFront (SeqList *pList);
//指定位置插入
void SeqLIstInsert (SeqList *pList, int pos, DataType d);
//删除指定位置元素
void SeqLIstErase (SeqList *pList, int pos);
//删除指定元素
void SeqListRemove(SeqList *pList, DataType d);
//删除所有的指定元素 (方法一)
void SeqListRemoveAll_1(SeqList *pList, DataType d);
//删除所有的指定元素 (方法二)
void SeqListRemoveAll_2(SeqList *pList, DataType d);
//删除所有的指定元素 (方法三)
void SeqListRemoveAll_3(SeqList *pList, DataType d);
//查找指定元素
int SeqListFind (SeqList *pList, DataType d);
//返回顺序表大小
int SeqListsz (SeqList *pList);
//判断顺序表是否为空
int Empty(SeqList *pList);
//冒泡排序
void BubbleSort (SeqList *pList);
//选择排序
void SelectSort (SeqList *pList);
//选择排序的优化
void SelectSort_OP (SeqList *pList);
//二分查找
int BinarySearch (SeqList *pList, DataType d);
//二分查找递归写法
int BinarySearch_R(SeqList *pList, int left, int right, DataType d);
#endif
2、主要函数 代码 main.c
#include "SeqList.h"
void show(SeqList *pList)
{
int i = 0;
assert (pList != NULL);
printf ("顺序表内容:\n");
for (i=0; i<pList->sz; i++)
{
printf ("%d ", pList->data[i]);
}
printf ("\n");
}
void SeqListInit (SeqList *pList)
{
assert (pList != NULL);
memset (pList->data, 0, sizeof (DataType)*MAX);
pList->sz = 0;
printf ("初始化成功!!\n");
}
void SeqListPushBack (SeqList *pList, DataType d)
{
assert (pList != NULL);
if (pList->sz == MAX)
{
printf ("顺序表已满,无法插入!\n");
return ;
}
pList->data[pList->sz] = d;
pList->sz ++;
printf ("插入成功\n");
}
void SeqListPopBack (SeqList *pList)
{
assert (pList != NULL);
if (pList->sz == 0)
{
printf ("顺序表为空,无法删除!\n");
return ;
}
pList->sz --;
printf ("删除成功\n");
show (pList);
}
void SeqListPushFront (SeqList *pList, DataType d)
{
int i = 0;
assert (pList != NULL);
if (pList->sz == MAX)
{
printf ("顺序表已满,无法插入!\n");
return ;
}
for (i=pList->sz; i>0; i--)
{
pList->data[i] = pList->data[i-1];
}
pList->data[0] = d;
pList->sz++;
printf ("插入成功\n");
show (pList);
}
void SeqListPopFront (SeqList *pList)
{
int i = 0;
assert (pList != NULL);
if (pList->sz == 0)
{
printf ("顺序表为空,无法删除!\n");
return ;
}
for (i=0; i<pList->sz; i++)
{
pList->data[i] = pList->data[i+1];
}
pList->sz --;
printf ("删除成功\n");
show (pList);
}
void SeqLIstInsert (SeqList *pList, int pos, DataType d)
{
int i = 0;
assert (pList != NULL && pos>0 && pos<pList->sz);
if (pList->sz == MAX)
{
printf ("顺序表已满,无法插入!\n");
return ;
}
for (i=pList->sz; i>=pos; i--)
{
pList->data[i] = pList->data[i-1];
}
pList->data[pos-1] = d;
pList->sz ++;
printf ("插入成功");
show (pList);
}
void SeqLIstErase (SeqList *pList, int pos)
{
int i = 0;
assert (pList != NULL);
if (pList->sz == 0)
{
printf ("顺序表为空,无法删除!\n");
return ;
}
for (i=pos-1; i<pList->sz-1;i++)
{
pList->data[i] = pList->data[i+1];
}
pList->sz --;
printf ("删除成功\n");
show(pList);
}
void SeqListRemove(SeqList *pList, DataType data)//删除指定元素
{
int i = 0;
assert (pList != NULL);
if (pList ->sz == 0)
{
printf ("顺序表为空,无法删除!!!\n");
return;
}
for (i=0; i<pList->sz; i++)
{
if (pList ->data [i] == data)
{
for (; i<pList->sz -1; i++)
{
pList->data[i] = pList->data[i+1];
}
pList->sz --;
printf ("删除指定元素成功!!!\n");
return;
}
}
printf ("没有该元素,无法删除!!!\n");
}
void SeqListRemoveAll_1(SeqList *pList, DataType data)//删除所有指定元素(方法一)
{
int i = 0, j = 0;
int tmp = pList->sz ;
assert (pList != NULL);
if (pList->sz == 0)
{
printf ("顺序表为空,无法删除!!!\n");
return;
}
for (i=0; i<pList->sz; i++)
{
if(pList->data[i] == data)
{
for (j=i; j<pList->sz-1; j++)
{
pList->data[j] = pList->data[j+1];
}
pList->sz --;
i--;
}
}
if (tmp == pList->sz)
{
printf ("没有该元素,无法删除!!!\n");
}
else
{
printf ("所有指定元素(方法一)删除成功!!!\n");
}
show (pList);
}
void SeqListRemoveAll_2(SeqList *pList, DataType data)//删除所有指定元素(方法二)
{
int i = 0, j = 0;
DataType p[MAX] = {0};
if (p == NULL)
{
perror ("malloc:");
return;
}
assert (pList != NULL);
if (pList->sz == 0)
{
printf ("顺序表为空,无法删除!!!\n");
return;
}
for (i=0; i<pList->sz; i++)
{
if (pList->data[i] != data)
{
p[j] = pList->data [i];
j++;
}
}
memcpy (pList->data,p, sizeof(p));
pList->sz = j;
printf("删除指定元素(方法二)成功!!!\n");
show(pList);
}
void SeqListRemoveAll_3(SeqList *pList, DataType d)
{
int i = 0, j = 0;
assert (pList != NULL);
if (pList->sz == 0)
{
printf ("顺序表为空,无法删除!\n");
return ;
}
for (i=0; i<pList->sz; i++)
{
if (pList->data[i] != d)
{
pList->data[j] = pList->data[i];
j++;
}
}
pList->sz = j;
printf ("删除成功\n");
show (pList);
}
int SeqListFind (SeqList *pList, DataType d)//找到返回下标,找不到返回-1
{
int i = 0, j = 0;
assert (pList != NULL);
for (i=0; i<pList->sz; i++)
{
if (pList->data[i] == d)
{
printf ("找到了,");
return i;
}
}
printf("找不到\n");
return -1;
}
int SeqListsz (SeqList *pList)
{
return pList->sz;
}
int Empty(SeqList *pList)//为空返回1,不为空返回0
{
return (pList->sz == 0);//如果pList->sz == 0 ,顺序表为空 返回1 如果pList->sz != 0 顺序表不为空,返回零
}
void swap (int *p, int *q)
{
int tmp = *p;
*p = *q;
*q = tmp;
}
void BubbleSort (SeqList *pList)
{
int i = 0, j = 0;
int state = 0;
assert (pList != NULL);
for (i=0; i<pList->sz-1; i++)
{
state = 0;
for (j=0; j<pList->sz-1-i; j++)
{
if (pList->data[j] > pList->data[j+1])
{
swap (pList->data+j, pList->data+j+1);
state = 1;
}
}
if (state == 0)
{
break;
}
}
printf ("冒泡排序成功\n");
show (pList);
}
void SelectSort (SeqList *pList)
{
int i = 0, j = 0;
int maxPos = 0;
assert (pList != NULL);
for (i=0; i<pList->sz-1; i++)
{
maxPos = 0;
for (j=1; j<=pList->sz-1-i; j++)
{
if (pList->data[j] > pList->data[maxPos])
{
maxPos = j;
}
}
swap (pList->data+pList->sz-1-i, pList->data+maxPos);
}
printf ("选择排序成功\n");
show (pList);
}
void SelectSort_OP (SeqList *pList)
{
int left = 0, right = pList->sz-1;
assert (pList != NULL);
while (left < right)
{
int minPos = left;
int maxPos = left;
int i = 0;
for (i=left+1; i<=right; i++)
{
if (pList->data[i] > pList->data[maxPos])
{
maxPos = i;
}
if (pList->data[i] < pList->data[minPos])
{
minPos = i;
}
}
if (maxPos != right)
{
swap (pList->data+maxPos, pList->data+right);
}
if (minPos == right)
{
minPos = maxPos;
}
if (minPos != left)
{
swap (pList->data+minPos, pList->data+left);
}
left ++;
right --;
}
printf ("选择排序成功\n");
show (pList);
}
int BinarySearch (SeqList *pList, DataType d)//找到返回下标,找不到返回-1
{
int left = 0, right = pList->sz-1;
int mid = (left+right)/2;
assert (pList != NULL);
while (left < right)
{
if (pList->data[mid] > d)
{
right = mid - 1;
}
if (pList->data[mid] < d)
{
left = left + 1;
}
if (pList->data[mid] == d)
{
printf ("找到了,");
return mid;
}
}
printf ("找不到该元素!\n");
return -1;
}
int BinarySearch_R(SeqList *pList, int left, int right, DataType d)
{
int mid = (right + left)/2;
assert (pList != NULL);
if (pList->data [mid] > d)
{
return BinarySearch_R (pList, left, mid-1, d);
}
else if (pList->data [mid] < d)
{
return BinarySearch_R (pList, mid+1, right, d);
}
else
{
return mid;
}
if (left > right)
{
return -1;
}
}
3、测试功能代码 test.c
#include "SeqList.h"
void test_SeqListPushBack ()
{
SeqList pList;
printf ("测试尾插:\n");
SeqListInit (&pList);
SeqListPushBack(&pList, 1);
SeqListPushBack(&pList, 2);
SeqListPushBack(&pList, 3);
SeqListPushBack(&pList, 4);
show(&pList);
printf ("\n");
}
void test_SeqListPopBack ()
{
SeqList pList;
printf ("测试尾删\n");
SeqListInit (&pList);
SeqListPushBack(&pList, 1);
SeqListPushBack(&pList, 2);
SeqListPushBack(&pList, 3);
SeqListPushBack(&pList, 4);
show(&pList);
SeqListPopBack (&pList);
printf ("\n");
}
void test_PushFront()
{
SeqList pList;
printf ("测试头插:\n");
SeqListInit (&pList);
SeqListPushBack(&pList, 1);
SeqListPushBack(&pList, 2);
SeqListPushBack(&pList, 3);
SeqListPushBack(&pList, 4);
show(&pList);
SeqListPushFront(&pList, 10);
SeqListPushFront(&pList, 11);
printf ("\n");
}
void teat_SeqListPopFront()
{
SeqList pList;
printf ("测试头删:\n");
SeqListInit (&pList);
SeqListPushBack(&pList, 1);
SeqListPushBack(&pList, 2);
SeqListPushBack(&pList, 3);
SeqListPushBack(&pList, 4);
show(&pList);
SeqListPopFront(&pList);
SeqListPopFront(&pList);
printf ("\n");
}
void teat_SeqLIstInsert ()
{
SeqList pList;
printf ("指定位置插入:\n");
SeqListInit (&pList);
SeqListPushBack(&pList, 1);
SeqListPushBack(&pList, 2);
SeqListPushBack(&pList, 3);
SeqListPushBack(&pList, 4);
show(&pList);
SeqLIstInsert (&pList, 2, 100);
printf ("\n");
}
void test_SeqLIstErase()
{
SeqList pList;
SeqListInit (&pList);
printf ("指定位置删除\n");
SeqListPushBack(&pList, 1);
SeqListPushBack(&pList, 2);
SeqListPushBack(&pList, 3);
SeqListPushBack(&pList, 4);
show(&pList);
SeqLIstErase(&pList, 2);
printf ("\n");
}
void test_SeqListRemove()
{
SeqList pList;
printf ("删除指定元素(第一次出现):\n");
SeqListInit (&pList);
SeqListPushBack(&pList, 1);
SeqListPushBack(&pList, 2);
SeqListPushBack(&pList, 3);
SeqListPushBack(&pList, 4);
show(&pList);
SeqListRemove(&pList,3);
printf ("\n");
}
void test_SeqListRemoveAll()
{
SeqList pList;
printf ("删除指定元素(所有):\n");
SeqListInit (&pList);
SeqListPushBack(&pList, 1);
SeqListPushBack(&pList, 3);
SeqListPushBack(&pList, 3);
SeqListPushBack(&pList, 4);
SeqListPushBack(&pList, 4);
SeqListPushBack(&pList, 5);
SeqListPushBack(&pList, 5);
show(&pList);
SeqListRemoveAll_1(&pList, 5);
SeqListRemoveAll_2(&pList, 4);
SeqListRemoveAll_3(&pList, 3);
printf ("\n");
}
void test_SeqListFind ()
{
int ret = 0;
SeqList pList;
printf ("查找元素:\n");
SeqListInit (&pList);
SeqListPushBack(&pList, 1);
SeqListPushBack(&pList, 2);
SeqListPushBack(&pList, 3);
SeqListPushBack(&pList, 4);
show(&pList);
ret = SeqListFind (&pList, 3);
if (ret != -1)
{
printf ("下标是:%d\n", ret);
}
ret = SeqListFind (&pList, 13);
if (ret != -1)
{
printf ("下标是:%d\n", ret);
}
printf ("\n");
}
void test_SeqListsz()
{
SeqList pList;
SeqListInit (&pList);
SeqListPushBack(&pList, 1);
SeqListPushBack(&pList, 2);
SeqListPushBack(&pList, 3);
SeqListPushBack(&pList, 4);
printf ("顺序表长度是:%d\n", SeqListsz (&pList));
printf ("\n");
}
void test_Bubblesort ()
{
SeqList pList;
printf ("冒泡排序:\n");
SeqListInit (&pList);
SeqListPushBack(&pList, 4);
SeqListPushBack(&pList, 3);
SeqListPushBack(&pList, 2);
SeqListPushBack(&pList, 1);
show(&pList);
BubbleSort (&pList);
printf ("\n");
}
void test_SelectSort()
{
SeqList pList;
printf ("选择排序:\n");
SeqListInit (&pList);
SeqListPushBack(&pList, 5);
SeqListPushBack(&pList, 4);
SeqListPushBack(&pList, 3);
SeqListPushBack(&pList, 0);
SeqListPushBack(&pList, 2);
SeqListPushBack(&pList, 1);
show(&pList);
SelectSort(&pList);
printf ("\n");
}
void test_SelectSort_OP()
{
SeqList pList;
printf ("选择排序优化:\n");
SeqListInit (&pList);
SeqListPushBack(&pList, 5);
SeqListPushBack(&pList, 4);
SeqListPushBack(&pList, 3);
SeqListPushBack(&pList, 0);
SeqListPushBack(&pList, 2);
SeqListPushBack(&pList, 1);
show(&pList);
SelectSort_OP(&pList);
printf ("\n");
}
void test_BinarySearch ()
{
int ret = 0;
SeqList pList;
printf ("二分查找(非递归):\n");
SeqListInit (&pList);
SeqListPushBack(&pList, 1);
SeqListPushBack(&pList, 2);
SeqListPushBack(&pList, 3);
SeqListPushBack(&pList, 4);
SeqListPushBack(&pList, 5);
SeqListPushBack(&pList, 6);
show (&pList);
ret = BinarySearch (&pList, 3);
if (ret != -1)
{
printf ("下标是:%d\n", ret);
}
printf ("\n");
}
void test_BinarySearch_R()
{
int ret = 0;
SeqList pList;
printf ("二分查找(递归):\n");
SeqListInit (&pList);
SeqListPushBack(&pList, 1);
SeqListPushBack(&pList, 2);
SeqListPushBack(&pList, 3);
SeqListPushBack(&pList, 4);
SeqListPushBack(&pList, 5);
SeqListPushBack(&pList, 6);
show (&pList);
ret = BinarySearch_R (&pList, 0, pList.sz-1, 3);
if (ret != -1)
{
printf ("下标是:%d\n", ret);
}
printf ("\n");
}
void test_Empty()
{
int ret = 0;
SeqList pList;
SeqListInit (&pList);
SeqListPushBack(&pList, 1);
SeqListPushBack(&pList, 2);
ret = Empty (&pList);
if (!ret)
{
printf ("顺序表非空\n");
}
else
{
printf ("顺序表为空\n");
}
SeqListPopFront(&pList);
SeqListPopFront(&pList);
ret = Empty (&pList);
if (!ret)
{
printf ("顺序表非空\n");
}
else
{
printf ("顺序表为空\n");
}
}
int main()
{
test_SeqListPushBack ();
test_SeqListPopBack ();
test_PushFront();
teat_SeqListPopFront();
teat_SeqLIstInsert ();
test_SeqLIstErase();
test_SeqListRemove();
test_SeqListRemoveAll();
test_SeqListFind ();
test_SeqListsz();
test_Bubblesort ();
test_SelectSort();
test_SelectSort_OP();
test_BinarySearch ();
test_BinarySearch_R();
test_Empty();
system ("pause");
return 0;
}