栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数据结构基础——顺序表联系

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构基础——顺序表联系

今天学习了数据结构中的顺序表相关内容,老师布置了简单的联系

首先在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 

至此,完毕

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1018124.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号