今天学习了数据结构中的顺序表相关内容,老师布置了简单的联系
首先在seqlist.c文件中创建顺序表
#include#include #include #include"./seqlist.h" //创建顺序表 seqList* listCreate() { //在堆区申请一个顺序表的空间,将申请地址给S seqList *S = (seqList*)malloc(sizeof(seqList)); if(NULL == S) { printf("申请空间失败n"); return NULL; } memset(S->data, 0, sizeof(S->data)); S->len = 0; //顺序表长度初始化 printf("创建成功n"); return S; }
以下是功能段函数:
然后写顺序表判空以及判满函数
//判空
int listEmpty(seqList *S)
{
if(NULL==S)
{
printf("所给顺序表不合法n");
exit(0);
}
return S->len==0? 1: 0; //0表示非空
}
//判满
int listFull(seqList *S)
{
return S->len==MAX? 1:0;
}
添加元素函数
//添加元素
int listAdd(seqList *S, datatype num )
{
if( listFull(S) )
{
printf("表满,添加失败n");
return -1;
}
//添加逻辑
S->data[S->len] = num;
//len变化
S->len++;
printf("添加成功n");
}
任意位置插入
//任意位置插入
int listInsertPos(seqList *S, int pos, datatype e) //表、位置、值
{
//判断
if( listFull(S) )
{
printf("表满添加失败!n");
return -1;
}
if(pos<0 || pos>S->len-1)
{
printf("数据不合法n");
return -1;
}
//腾空
for(int i=S->len-1; i>=pos; i--)
{
S->data[i+1] = S->data[i];
}
//插入
S->data[pos] = e;
S->len++;
printf("插入成功!n");
return 1;
}
任意位置删除
//任意位置删除
void listDeletePos(seqList *S, int pos) //表、位置
{
//判断
if( poslen && pos >= 0)
{
for(int i=pos; ilen-1; i++)
{
S->data[i] = S->data[i+1];
}
S->len--;
printf("删除成功n");
}
else
{
printf("数据不合法n");
}
}
按值查找,返回对应位置下标
//按值查找,返回对应位置
int listSearchValue(seqList *S, datatype e, int *p)
{
int i=0;
for(i=0; ilen; i++)
{
if(e == S->data[i])
{
return i;
}
}
if(i == S->len)
{
(*p)++; //用于判断是否失败,如果*p发生改变,主函数就不再输出接收的值
printf("无对应值!n");
}
}
按位置查找,返回位置对应的值:
//按位置查找,返回值
datatype listSearchPos(seqList *S, int pos, int *p)
{
if( pos>=0 && pos<=S->len )
{
return S->data[pos];
}else
{
printf("查找失败!n");
(*p)++; //用于判断是否失败,如果*p发生改变,主函数就不再输出接收的值
}
}
按输入的值修改表内值
//按值修改
int list_UpdateValue( seqList *S, datatype new_e, datatype old_e)
{
int i=0;
for(i=0; ilen; i++)
{
if(S->data[i] == old_e)
{
S->data[i] = new_e;
}
}
printf("修改完成!n");
}
按位置下标修改值
//按位置修改
int list_UpdatePos(seqList *S,int pos, datatype new_e)
{
//判断逻辑
if(listEmpty(S) || pos<0 || pos>S->len-1)
{
printf("修改失败n");
return -1;
}
//修改逻辑
S->data[pos]= new_e;
printf("修改成功n");
listShow(S);
return 0;
}
接下来是最最基础的两种排序:冒泡排序以及选择排序
//冒泡排序(升序)
void list_BubbleSort(seqList *S)
{
for(int i=1; ilen; i++)
{
for(int j=0; jlen-i; j++)
{
if( S->data[j] > S->data[j+1] )
{
datatype temp;
temp = S->data[j];
S->data[j] = S->data[j+1];
S->data[j+1] = temp;
}
}
}
}
//选择排序(降序)
void list_SelectSort(seqList *S)
{
int i,j;
int max; //最大值下标
datatype temp; //交换变量
for(i=0; ilen-1; i++)
{
max = i; //把第一个值当做最大值记录下标
for(j=i+1; jlen; j++)
{
if(S->data[max]data[j]) //如果遇到值比第一个下标为max的值大
{ //交换下标
max = j;
}
} //一轮遍历后,交换下标为i与下标为max的值
temp = S->data[max];
S->data[max] = S->data[i];
S->data[i] = temp;
}
}
消除重复元素(去重)
//去重
void listDeleteRepeat(seqList *S)
{
for(int i=0; ilen; i++) //从第一个数开始遍历
{
for(int j=i+1; jlen; j++ ) //从第i个数开始,把之后的与之相同的值删除
{
if(S->data[i] == S->data[j])
{
listDeletePos(S, j); //调用删除函数
j--; //j前移,防止漏删
}
}
}
}
释放表:
//释放表
void listFree(seqList *S)
{
if(NULL != S)
{
free(S);
}
S = NULL; //防止野指针
printf("释放成功n");
printf("请不要忘记主函数置NULL,祝君武运昌隆n");
}
接下来是头文件声明:
创建seqlist.h文件
#ifndef __SEQLIST_H__
#define __SEQLIST_H__
#define MAX 20
typedef int datatype; //把int类型重命名成datatype
typedef struct
{
datatype data[MAX]; //表示顺序表数组
int len; //表示顺序表长度
}seqList;
//创建顺序表
seqList* listCreate();
//判空
int listEmpty(seqList *S);
//判满
int listFull(seqList *S);
//遍历
void listShow(seqList *S);
//添加元素
int listAdd(seqList *S, datatype num );
//任意位置插入
int listInsertPos(seqList *S, int pos, datatype e); //任意位置插入
//任意位置删除
void listDeletePos(seqList *S, int pos);
//按值查找,返回对应位置
int listSearchValue(seqList *S, datatype e, int *p);
//按位置查找,返回值
datatype listSearchPos(seqList *S, int pos, int *p);
//按值修改
int list_UpdateValue( seqList *S, datatype new_e, datatype old_e);
//按位置修改
int list_UpdatePos(seqList *S,int pos, datatype new_e);
//升序排序(冒泡)
void list_BubbleSort(seqList *S);
//降序排序(选择)
void list_SelectSort(seqList *S);
//去重
void listDeleteRepeat(seqList *S);
//释放表
void listFree(seqList *S);
#endif
最后一步,用菜单框架写主函数main.c:
#include#include #include #include"./seqlist.h" int flag=0; //全局变量 int main(int argc, const char *argv[]) { seqList *S = listCreate(); if(NULL==S) { return -1; } while(1) { int select=0; printf("欢迎使用数据结构:顺序表n"); printf("--1:添加元素n"); printf("--2:任意位置插入元素n"); printf("--3:任意位置删除元素n"); printf("--4:按值查找元素,返回对应位置n"); printf("--5:按位置查找,返回值n"); printf("--6:按值修改元素n"); printf("--7:按位置修改元素n"); printf("--8:升序排序(冒泡)n"); printf("--9:降序排序(选择)n"); printf("--10:去重n"); printf("--11:遍历n"); printf("--12:退出,并释放表n"); printf("*******************************n"); printf("请选择您所要尝试的功能 >>>"); scanf("%d",&select); switch(select) { case 1: { int i,num; datatype e; printf("请输入元素个数:"); scanf("%d",&num); for(i=0; i 至此,完毕



