这次对顺序表进行一些简单的操作,比如插入(头插法,尾插法)删除(头删法,尾删法)查找 ,排序,打印进一步了解顺序表。
SeqList.h
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef _AAA_
#define AAA
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#define NUMBER 10
#define Datatype int
typedef struct student
{
Datatype data[NUMBER];//数据
int sz;//存放数据的个数
}student, *men;
//初始化
void InitSeqList(men pSeq);
//尾部插入
void PushBack(men pSeq);
//尾部删除
void PopBack(men pSeq);
//头部插入
void PushFront(men pSeq);
//头部删除
void PopFront(men pSeq);
//查找指定元素
int Find(men pSeq, Datatype data);
//指定位置插入
void Insert(men pSeq, int pos, Datatype data);
//删除指定位置元素
void Erase(men pSeq, int pos);
//删除指定元素
void Remove(men pSeq, Datatype data);
//删除所有的指定元素
void RemoveALL(men pSeq, Datatype data);
//返回顺序表的大小
int Size(men pSeq);
//判断顺序表是否为空
int Empty(men pSeq);
//冒泡排序
void BubbleSort(men pSeq);
//选择排序
void SelectSort(men pSeq);
//选择排序的优化
void SelectSortOP(men pSeq);
//二分查找
int BinarySearch(men pSeq, Datatype data);
//二分查找递归写法
int BinarySearch_R(men pSeq, int left, int right, Datatype d);
//打印
void PrintSeqList(men pSeq);
#endif//AAA
源.c
#include"SeqList.h"
//*************初始化**********
void InitSeqList(men pSeq)
{
assert(pSeq != NULL);
pSeq->sz = 0;
memset(pSeq->data, 0, sizeof(pSeq->data));
}
//**********打印*************
void PrintSeqList(men pSeq)
{
int i = 0;
for(i = 0; i < pSeq->sz; i++)
{
printf("%d ", pSeq->data[i] );
}
printf("\n");
}
//**************尾插法**********
void PushBack(men pSeq)
{
int i = 0;
int j = 0;
int number = 0;
assert(pSeq);
if(pSeq->sz == NUMBER)
{
printf("顺序表已满\n");
return ;
}
printf("请输入你要输入的数据的个数:");
scanf("%d", &number );
if(number > NUMBER - pSeq->sz)
{
printf("没有那么多的元素\n");
return ;
}
for(i = 0; i < number; i++)
{
printf("请输入你要输入的元素");
scanf("%d", &j);
pSeq->data[i] = j;
pSeq->sz++;
}
}
//************尾部删除法************
void PopBack(men pSeq)
{
int i = 0;
assert(pSeq);
if(pSeq->sz == 0)
{
printf("顺序表已空\n");
return ;
}
printf("一次要删除的元素的个数:");
scanf("%d", &i);
if(i > pSeq->sz)
{
printf("没有那么多的元素\n");
return ;
}
pSeq->sz = pSeq->sz - i;//改变他记录的元素个数即可。
}
void PushFront(men pSeq)//头插法
{
int i = 0;
int j = 0;
int number = 0;
int value = 0;
assert(pSeq);
if(pSeq->sz == NUMBER)
{
printf("顺序表已满\n");
return ;
}
printf("请输入要插入的元素的个数:");
scanf("%d", &number);
if(number > NUMBER - pSeq->sz)
{
printf("没有那么多的元素\n");
return ;
}
for(j = 0; j < number; j++)
{
for(i = pSeq->sz; i > 0; i--)
{
pSeq->data[i] = pSeq->data[i-1];
}
printf("请输入要插入的元素\n");
scanf("%d", &value);
pSeq->data[0] = value;
pSeq->sz++;
}
}
//************头删法***********
void PopFront(men pSeq)
{
int i = 0;
int j = 0;
int number = 0;
int value = 0;
assert(pSeq);
if(pSeq->sz == 0)
{
printf("顺序表已空\n");
return ;
}
printf("请输入要删除的元素的个数:");
scanf("%d", &number);
if(number > pSeq->sz)
{
printf("没有那么多的元素\n");
return ;
}
for(j = 0; j < number; j++)
{
for(i = 0; i < pSeq->sz-1; i++)
{
pSeq->data[i] = pSeq->data[i+1];
}
pSeq->sz--;
}
}
//*********查找*********
int Find(men pSeq, Datatype data)
{
int i = 0;
assert(pSeq);
for(i = 0; i < pSeq->sz; i++)
{
if(pSeq->data[i] == data)
return i;
}
return -1;
}
//*********指定位置插入**********
void Insert(men pSeq, int pos, Datatype data)
{
int i = 0;
assert(pSeq&& pos >= 0 && pos < NUMBER);
if(pSeq->sz == NUMBER)
{
printf("顺序表已满\n");
return ;
}
for(i = pSeq->sz; i > pos; i--)
{
pSeq->data[i] = pSeq->data[i-1];
}
pSeq->sz++;
pSeq->data[pos] = data;
}
//**********删除指定位置元素************
void Erase(men pSeq, int pos)
{
int i = 0;
assert(pSeq && pos >= 0 && pos < NUMBER);
for(i = pos; i < pSeq->sz-1 ;i++)
{
pSeq->data[i] = pSeq->data[i+1];
}
pSeq->sz--;
}
//************删除指定元素***********
void Remove(men pSeq, Datatype data)
{
int i = 0;
int j = 0;
assert(pSeq);
for(i = 0; i < pSeq->sz ;i++)
{
if(pSeq->data[i] ==data)
{
for(j = i; j < pSeq->sz-1; j++)
{
pSeq->data[j] = pSeq->data[j+1];
}
pSeq->sz--;
return ;
}
}
pSeq->sz--;
}
//***********删除所有的指定元素 ************
void RemoveALL(men pSeq, Datatype data)
{
int i = 0;
int j = 0;
assert(pSeq);
for(i = 0; i < pSeq->sz; i++)
{
if(pSeq->data[i] != data)
{
pSeq->data[j] = pSeq->data[i];
j++;
}
}
pSeq->sz = j;
}
//********返回顺序表的大小************
int Size(men pSeq)
{
return (pSeq->sz);
}
//*******判断顺序表是否为空**********
int Empty(men pSeq)
{
return (pSeq->sz == 0 ? 0 : 1);
}
//**********冒泡排序***********
void BubbleSort(men pSeq)
{
int i = 0;
int j = 0;
int flag = 0;
assert(pSeq);
for(i = 0; i < pSeq->sz-1; i++)
{
flag = 0; //记录状态,如果已经有序就不再便利下去
for(j = 0; j < pSeq->sz - 1 - i; j++)
{
if(pSeq->data[j] > pSeq->data[j+1])
{
Datatype tmp = pSeq->data[j];
pSeq->data[j] = pSeq->data[j+1];
pSeq->data[j+1] = tmp;
flag = 1;
}
}
if(0 == flag)//如果有序就退出循环
break;
}
}
//*************二分查找***********
int BinarySearch(men pSeq, Datatype data)
{
int left = 0;
int right = pSeq->sz -1;
int mid = 0;
while(left <= right)
{
mid = left + (right - left)/2;
if(pSeq->data[mid] > data)
right = mid - 1;
else if(pSeq->data[mid] < data)
left = mid + 1;
else
return mid;
}
return -1;//没找到时返回-1
}
//**********二分查找递归写法***********
int BinarySearch_R(men pSeq, int left, int right, Datatype data)
{
int mid = left + (left+right)/2;
if(left > right)//没找到的情况
return -1;
else if(pSeq->data[mid] > data)
return BinarySearch_R(pSeq, left, mid-1, data);
else if(pSeq->data[mid] < data)
return BinarySearch_R(pSeq, mid+1, right, data);
else //找到的情况
return mid;
}
//***********选择排序**************
void SelectSort(men pSeq)
{
int i = 0;
int j = 0;
int ret = 0;
int tmp = pSeq->data[0];
for(i = 0; i < pSeq->sz-1; i++)
{
tmp = pSeq->data[i];
for(j = i; j < pSeq->sz; j++)
{
if(pSeq->data[j] < tmp)
{
tmp = pSeq->data[j];
ret = j;
}
}
pSeq->data[ret] = pSeq->data[i];
pSeq->data[i] = tmp;
}
}
//选择排序的优化
void SelectSortOP(men pSeq)//一次找出最大值和最小值
{
int i = 0;
int j = 0;
for(i = 0; i < (pSeq->sz)/2; i++)
{
int maxpos = i;//记录每次便利中最大数的下标
int minpos = i;//记录每次便利中最小数的下标
for(j = i+1; j < pSeq->sz-i; j++)
{
if(pSeq->data[j] > pSeq->data[maxpos])
{
maxpos = j;
}
if(pSeq->data[j] < pSeq->data[minpos])
{
minpos = j;
}
}
if(maxpos != pSeq->sz-1-i)//如果最大的数的位置正是你要放的位置就不变
{
Datatype tmp = pSeq->data[pSeq->sz-1-i];
pSeq->data[pSeq->sz-1-i] = pSeq->data[maxpos];
pSeq->data[maxpos] = tmp;
}
if(minpos == pSeq->-1-i)//防止特殊情况(比如:4 3 2 1这种情况下,上面已经交换过一次,如果下面在交换一次的话相当于没变)
{
minpos = maxpos;
}
if(minpos != i)//如果最小的数的位置正是你要放的位置就不变
{
Datatype tmp = pSeq->data[i];
pSeq->data[i] = pSeq->data[minpos];
pSeq->data[minpos] = tmp;
}
}
}
主函数.c
#include"SeqList.h"
void Text()
{
int data = 0;
int i = 0;
int pos = 0;
student pSeq;
//初始化
InitSeqList(&pSeq);
//尾插法
PushBack(&pSeq);
PrintSeqList(&pSeq);
//尾部删除
PopBack(&pSeq);
PrintSeqList(&pSeq);
//头部插入
PushFront(&pSeq);
PrintSeqList(&pSeq);
//头部删除
PopFront(&pSeq);
PrintSeqList(&pSeq);
//查找
printf("请输入要查找的元素为:");
scanf("%d", &data);
i =Find(&pSeq, data);
if(i == -1)
printf("找不到\n");
else
printf("下标为:%d\n", i);
PrintSeqList(&pSeq);
//指定位置插入
printf("请输入要插入的下标和元素为:");
scanf("%d%d", &pos,&data);
Insert(&pSeq, pos, data);
PrintSeqList(&pSeq);
//删除指定位置元素
printf("请输入要删除的元素的下标:");
scanf("%d", &pos);
Erase(&pSeq, pos);
PrintSeqList(&pSeq);
//**********删除指定元素************
printf("请输入要删除的元素为:");
scanf("%d", &data);
Remove(&pSeq, data);
PrintSeqList(&pSeq);
//*********删除所有的指定元素********
printf("请输入要删除的元素为:");
scanf("%d", &data);
RemoveALL(&pSeq, data);
PrintSeqList(&pSeq);
//********返回顺序表的大小**********
i = Size(&pSeq);
printf("顺序表的大小为%d\n", i);
//判断顺序表是否为空
i = Empty(&pSeq);
if(i == 0)
printf("顺序表为空\n");
else
printf("顺序表不为空\n");
//冒泡排序
printf("冒泡排序为\n");
BubbleSort(&pSeq);
PrintSeqList(&pSeq);
//二分查找
printf("请输入要查找的元素为:");
scanf("%d", &data);
BinarySearch( &pSeq, data);
i = BinarySearch(&pSeq, data);
if(i == -1)
printf("找不到\n");
else
printf("下标为:%d\n", i);
PrintSeqList(&pSeq);
//二分查找递归写法
printf("请输入要查找的元素为:");
scanf("%d", &data);
i = BinarySearch_R(&pSeq, 0, pSeq.sz-1, data);
if(i == -1)
printf("找不到\n");
else
printf("下标为:%d\n", i);
PrintSeqList(&pSeq);
//选择排序
printf("选择排序为:\n");
SelectSort(&pSeq);
PrintSeqList(&pSeq);
//选择排序的优化
printf("优化后选择排序为:\n");
SelectSortOP(&pSeq);
PrintSeqList(&pSeq);
}
int main()
{
Text();
system("pause");
return 0;
}