数据结构day1
seqlist.h (库文件)
下面展示 源代码
。
#ifndef __SEQLIST_H__
#define __SEQLIST_H__
#define MAX 20
typedef int datatype;
typedef struct
{
datatype data[MAX];
int len;
}seqList;
//创建顺序表
seqList *listCreate();
//添加元素
int listAdd(seqList *S, datatype e);
//判空
int listempty(seqList *S);
//判满
int listFull(seqList *S);
//遍历
void listShow(seqList *S);
//任意位置插入
int listInsertPos(seqList *S, int pos, datatype e);
//删除
int listDeletePos(seqList *S, int pos);
//按值查找成功后返回下标
int listSearchValue(seqList *S, datatype e);
//按位置查找成功后返回值
datatype listSearchPos(seqList *S, int pos);
//按值修改
int listUpdateValue(seqList *S, datatype old_e, datatype new_e);
//按位置修改
int listUpdatePos(seqList *S, int pos, datatype new_e);
//排序
void listSort(seqList *S);
//去重
void listUnique(seqList *S);
//选择排序降序
void listChooseSort(seqList *S);
//释放表
void listFree(seqList **S);
#endif
seqlist.c (函数封装)
1、作业函数
1.1 按值修改。
//按值修改
int listUpdateValue(seqList *S, datatype old_e, datatype new_e)
{
int i;
if(listEmpty(S))
{
printf("修改失败,表为空\n");
return -1;
}
for(i=0; i<S->len; i++)
{
if(S->data[i] == old_e)
{
S->data[i] = new_e;
printf("修改成功\n");
return 0;
}
}
if(i == S->len)
{
printf("修改失败,旧值不存在\n");
return -2;
}
}
1.2按位置查找返回值
//按位置查找返回值
datatype listSearchPos(seqList *S, int pos)
{
if(listEmpty(S))
{
return -1; //判断为空返回-1
}
else if(pos<0 || pos>=S->len)
{
return -2; //输入不合法返回-2
}
for(int i=0; i<S->len; i++)
{
if(pos == i)
{
return S->data[i];
}
}
}
主函数内容
//按位置查找返回值
res = listSearchPos(S, 8);
if(res >= 0)
{
printf("查找成功,值为%d\n", res);
}
else if(res == -1)
{
printf("查找失败,表为空\n");
}
else if(res == -2)
{
printf("查找失败,输入位置不合法\n");
}
1.3选择排序降序
//选择排序降序
void listChooseSort(seqList *S)
{
int i, j;
int max, temp, index;
for(i=0; i<S->len; i++)
{
index = i;
max = S->data[i];
for(j=i+1; j<S->len; j++)
{
if(S->data[j] > max)
{
max = S->data[j];
index = j;
}
}
temp = S->data[i];
S->data[i] = S->data[index];
S->data[index] = temp;
}
}
2、全部函数
下面展示 源代码
。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#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表示非空,1表示空
}
//判满
int listFull(seqList *S)
{
return S->len==MAX ? 1:0; //0表示不满,1表示满
}
//添加元素
int listAdd(seqList *S, datatype e)
{
//判断逻辑
if(listFull(S))
{
printf("表满,添加失败\n");
return -1;
}
//添加逻辑
S->data[S->len] = e;
//表的变化
S->len++;
printf("添加成功\n");
return 0;
}
//遍历函数
void listShow(seqList *S)
{
//判断逻辑
if(listEmpty(S))
{
printf("表为空\n");
return;
}
printf("目前顺序表中元素分别是:");
for(int i=0; i<S->len; i++)
{
printf("%d\t", S->data[i]);
}
printf("\n");
}
//任意位置插入
int listInsertPos(seqList *S, int pos, datatype e)
{
if(listFull(S))
{
printf("表已满\n");
return -1;
}
else if(pos<0 || pos>S->len)
{
printf("输入的位置不合法\n");
return -2;
}
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 0;
}
//删除
int listDeletePos(seqList *S, int pos)
{
if(listEmpty(S))
{
printf("表为空\n");
return -1;
}
else if(pos<0 || pos>S->len-1)
{
printf("输入位置不合法\n");
return -2;
}
for(int i=pos; i<S->len; i++)
{
S->data[i] = S->data[i+1];
}
S->len--;
printf("删除成功\n");
return 0;
}
//按值查找返回下标
int listSearchValue(seqList *S, datatype e)
{
if(listEmpty(S))
{
return -1;
}
for(int i=0; i<S->len; i++)
{
if(S->data[i] == e)
{
return i;
}
}
return -2;
}
//按位置查找返回值
datatype listSearchPos(seqList *S, int pos)
{
if(listEmpty(S))
{
return -1;
}
else if(pos<0 || pos>=S->len)
{
return -2;
}
for(int i=0; i<S->len; i++)
{
if(pos == i)
{
return S->data[i];
}
}
}
//按值修改
int listUpdateValue(seqList *S, datatype old_e, datatype new_e)
{
int i;
if(listEmpty(S))
{
printf("修改失败,表为空\n");
return -1;
}
for(i=0; i<S->len; i++)
{
if(S->data[i] == old_e)
{
S->data[i] = new_e;
printf("修改成功\n");
return 0;
}
}
if(i == S->len)
{
printf("修改失败,旧值不存在\n");
return -2;
}
}
//按位置修改
int listUpdatePos(seqList *S, int pos, datatype new_e)
{
if(listEmpty(S))
{
printf("修改失败,表为空\n");
return -1;
}
else if(pos<0 || pos>=S->len)
{
printf("修改失败,输入的位置不合法\n");
return -2;
}
for(int i=0; i<S->len; i++)
{
if(i == pos)
{
S->data[i] = new_e;
printf("修改成功\n");
return 0;
}
}
}
//排序
void listSort(seqList *S)
{
int i, j;
datatype temp;
if(listEmpty(S))
{
printf("排序失败,表为空\n");
}
for(i=1; i<S->len; i++)
{
for(j=0; j<S->len-i; j++)
{
if(S->data[j] > S->data[j+1])
{
temp = S->data[j];
S->data[j] = S->data[j+1];
S->data[j+1] = temp;
}
}
}
}
//去重
void listUnique(seqList *S)
{
int i, j, k;
if(S->len<=1)
{
printf("去重失败\n");
}
for(i=0; i<S->len; i++)
{
for(j=i+1; j<S->len; j++)
{
if(S->data[i] == S->data[j])
{
listDeletePos(S, j);
j--;
}
}
}
printf("去重成功\n");
}
//选择排序降序
void listChooseSort(seqList *S)
{
int i, j;
int index;
int max, temp;
for(i=0; i<S->len; i++)
{
index = i;
max = S->data[i];
for(j=1; j<S->len-i; j++)
{
if(S->data[j] > max)
{
max = S->data[j];
index = j;
}
}
temp = S->data[i];
S->data[i] = S->data[index];
S->data[index] = temp;
}
}
//释放表
void listFree(seqList **S)
{
if(NULL != *S)
{
free(*S);
}
*S = NULL;
printf("释放成功\n");
}
main.c (主函数)
下面展示 源代码
。
#include<stdio.h>
#include<stdlib.h>
#include"seqlist.h"
int main(int argc, const char *argv[])
{
seqList *S = listCreate();
if(NULL == S)
{
return -1;
}
//调用添加函数
listAdd(S, 7);
listAdd(S, 2);
listAdd(S, 5);
listShow(S);
//任意位置插入
listInsertPos(S, 3, 7);
listInsertPos(S, 4, 7);
listInsertPos(S, 5, 5);
listInsertPos(S, 6, 7);
listShow(S);
//任意位置删除
listDeletePos(S, 6);
listShow(S);
//按值查找
int res = listSearchValue(S, 8);
if(res>=0)
{
printf("查找成功,下标为%d\n", res);
}
else if(res == -1)
{
printf("表为空,查找失败\n");
}
else if(res == -2)
{
printf("查找失败,没有该值\n");
}
//按位置查找返回值
res = listSearchPos(S, 8);
if(res >= 0)
{
printf("查找成功,值为%d\n", res);
}
else if(res == -1)
{
printf("查找失败,表为空\n");
}
else if(res == -2)
{
printf("查找失败,输入位置不合法\n");
}
//按值修改
listUpdateValue(S, 10, 100);
listShow(S);
//按位置修改
listUpdatePos(S, 8, 10);
listShow(S);
//排序
listSort(S);
listShow(S);
//去重
listUnique(S);
listShow(S);
//选择排序降序
listChooseSort(S);
listShow(S);
//释放表
listFree(&S);
return 0;
}