专栏首页ShanSan的云原生之路线性表之顺序存储-顺序表

线性表之顺序存储-顺序表

顺序表的操作

  • 向有序顺序表插入一个元素
  • 顺序表的冒泡排序
  • 顺序表的删除操作
  • 顺序表中元素的查找
  • 顺序表的逆置
  • 删除顺序表中的相同元素
  • 向顺序表的指定位置插入元素
  • 打印顺序表

顺序表的存储结构

#define maxsize 100        //存储空间的分配量

//定义顺序表数据类型
typedef struct{
	int data[maxsize];
	int last;              //存放表中最后一个元素的下标
}sequenlist;

顺序表的冒泡排序

void list_bubble_sort(sequenlist *p)//max to min
{
    int i,j;
    int temp;
	for(i=0; i< p->last; i++)//attention
	{
		for(j=0; j< p->last-i; j++)
		{
		    if(p->data[j] < p->data[j+1])
	        {
	            temp = p->data[j];
				p->data[j] = p->data[j+1];
				p->data[j+1] = temp;
			}
	    }
	}
}

顺序表的删除操作

nt delete_1(sequenlist *s,int del) //删除函数
{
	int temp;
	for(int i=0; i <= s->last; i++)
	{
		if(del == s->data[i])
		{
			temp = i;
			for(int j=i; j<s->last; j++)
			{
				s->data[j] = s->data[j+1];
			}
			s->last = s->last - 1;
			return 0;//删除第一个与del相同的元素,函数结束
		}
	}
	//要删的那个元素不在表中
	printf("the element you want to delete is not in the sequenlist!\n");
}

顺序表中元素的查找

int search(sequenlist *s,int key)    //查找函数
{
    for(int i=0; i<= s->last; i++)
    {
    	if(key == s->data[i])
    	{
    		printf("exist !\n");
    		return 0;
		}
	}
	printf("not found !\n");
	return 0;
}

顺序表的逆置

void reverse(sequenlist *s)//逆置函数
{
    int i,j;
    int temp;
    int last_temp = s->last;
	for(i=0; i<= s->last/2; i++)
	{
		temp = s->data[i];
        s->data[i] = s->data[last_temp];
		s->data[last_temp] = temp;
	    last_temp--;
	}
}

删除顺序表中的相同元素

void delete_same(sequenlist *s)//删除表中相同的元素
{
	int i,j;
	int temp;
	for(i=0; i<=s->last; i++)
	{
		for(j=1; j<=s->last; j++)
		{
			if(s->data[j] == s->data[i])//元素相同
			{
			    for(int k=j; k<s->last; k++)
				{
					s->data[k] = s->data[k+1];
				}
				s->last = s->last - 1;
			}
		}
	}
}

向顺序表的指定位置插入元素

int insert(sequenlist *L,int i,int x) //指定位置,插入
{
	int j;
	if(((*L).last) >= maxsize-1)
	{
		printf("the list is overflow!\n");
		return (0);
	}
	else
	{
		if((i<1)||(i>(*L).last+2))
		{
			printf("position is not correct!\n");
			return (0);
		}
		else
		{
			for(j=(*L).last;j>=i-1;j--)
			{
				(*L).data[j+1]=(*L).data[j];
			}
			(*L).last=(*L).last+1;
			(*L).data[i-1]=x;
			return (0);
		}
	}
}

向顺序表的指定位置插入元素

int insert(sequenlist *L,int i,int x) //指定位置,插入
{
	int j;
	if(((*L).last) >= maxsize-1)
	{
		printf("the list is overflow!\n");
		return (0);
	}
	else
	{
		if((i<1)||(i>(*L).last+2))
		{
			printf("position is not correct!\n");
			return (0);
		}
		else
		{
			for(j=(*L).last;j>=i-1;j--)
			{
				(*L).data[j+1]=(*L).data[j];
			}
			(*L).last=(*L).last+1;
			(*L).data[i-1]=x;
			return (0);
		}
	}
}

打印顺序表

void print_list(sequenlist *s)   //打印顺序表
{
	int i;
	for(i=0; i<=s->last; i++)
	{
		printf("%3d",s->data[i]);
	}
}

试着煲下汤

/*
* author: shansan.top
* date: 2018/12/12
* version: 1.0
*/

#include<stdio.h>
#define maxsize 100

//定义顺序表数据类型
typedef struct{
	int data[maxsize];
	int last;
}sequenlist;

int search(sequenlist *s,int key)    //查找函数
{
    for(int i=0; i<= s->last; i++)
    {
    	if(key == s->data[i])
    	{
    		printf("exist !\n");
    		return 0;
		}
	}
	printf("not found !\n");
	return 0;
}

int delete_1(sequenlist *s,int del) //删除函数
{
	int temp;
	for(int i=0; i <= s->last; i++)
	{
		if(del == s->data[i])
		{
			temp = i;
			for(int j=i; j<s->last; j++)
			{
				s->data[j] = s->data[j+1];
			}
			s->last = s->last - 1;
			return 0;//删除第一个与del相同的元素,函数结束
		}
	}
	//要删的那个元素不在表中
	printf("the element you want to delete is not in the sequenlist!\n");
}

void print_list(sequenlist *s)   //打印顺序表
{
	int i;
	for(i=0; i<=s->last; i++)
	{
		printf("%3d",s->data[i]);
	}
}

void reverse(sequenlist *s)//逆置函数
{
    int i,j;
    int temp;
    int last_temp = s->last;
	for(i=0; i<= s->last/2; i++)
	{
		temp = s->data[i];
        s->data[i] = s->data[last_temp];
		s->data[last_temp] = temp;
	    last_temp--;
	}
}

void list_bubble_sort(sequenlist *p)//max to min
{
    int i,j;
    int temp;
	for(i=0; i< p->last; i++)//attention
	{
		for(j=0; j< p->last-i; j++)
		{
		    if(p->data[j] < p->data[j+1])
	        {
	            temp = p->data[j];
				p->data[j] = p->data[j+1];
				p->data[j+1] = temp;
			}
	    }
	}
}

void insert_in_order_list(sequenlist *s,int value)//有序表中插入元素
{
	int i,j;
	int count=0;
	//int temp = s->last+1;
	for(i=0; i<=s->last; i++)
	{
		count++;
		if( value <= s->data[i])
		{
			s->last = s->last + 1;
			for(j=s->last; j>i; j--)
			{
				s->data[j] = s->data[j-1];
			}
			s->data[i] = value;
			return ;//结束函数
		}
	}
	//printf("i=%d",i);
	//printf("s->last=%d\n",s->last);
	if(i > s->last-1)
	{
		s->last = s->last + 1;
		s->data[s->last] = value;
	}
}

int insert(sequenlist *L,int i,int x) //指定位置,插入
{
	int j;
	if(((*L).last) >= maxsize-1)
	{
		printf("the list is overflow!\n");
		return (0);
	}
	else
	{
		if((i<1)||(i>(*L).last+2))
		{
			printf("position is not correct!\n");
			return (0);
		}
		else
		{
			for(j=(*L).last;j>=i-1;j--)
			{
				(*L).data[j+1]=(*L).data[j];
			}
			(*L).last=(*L).last+1;
			(*L).data[i-1]=x;
			return (0);
		}
	}
}

void delete_same(sequenlist *s)//删除表中相同的元素
{
	int i,j;
	int temp;
	for(i=0; i<=s->last; i++)
	{
		for(j=1; j<=s->last; j++)
		{
			if(s->data[j] == s->data[i])//元素相同
			{
			    for(int k=j; k<s->last; k++)
				{
					s->data[k] = s->data[k+1];
				}
				s->last = s->last - 1;
			}
		}
	}
}

int main()
{
	sequenlist p={{1,3,2,6,5,4,9,7,8},8};
	//这里有9个数,但数组下表是从0开始的,所以 p.last = 8
	print_list(&p);
	printf("\n");

	//查找

	printf("please input a value which you want: ");
	int value;//C++语法可以临时定义一个变量,C语言不可以(需放在开头)。
	scanf("%d",&value);
	//search(&p,10);
	search(&p,value);
	print_list(&p);
	printf("\n\n");

	//删除表中的指定元素
	delete_1(&p,8);
	printf("after delete:\n");
	print_list(&p);


	//逆置顺序表
	printf("\n\nafter reverse:\n");
	reverse(&p);
	print_list(&p);

	//冒泡排序
	printf("\nafter sort:\n");
	printf("\n");

	//list_bubble_sort(&try_1);
	list_bubble_sort(&p);
	print_list(&p);


	//往有序顺序表中插入一个元素
	printf("\n\n");
    sequenlist try_1 = {{1,2,3,5,6,7},5};
    print_list(&try_1);

	printf("\n");
	printf("please input the value that you wan to insert into the sequenlist: ");
	int data;
	scanf("%d",&data);
	insert_in_order_list(&try_1,data);
	//insert_in_order_list(&try_1,9);
	print_list(&try_1);

	//删除表中相同的元素
	printf("\n\n");
	sequenlist try_2= {{1,1,2,2,3,3,4,4},7};
	print_list(&try_2);
	printf("\ndelete the same element:\n");
	delete_same(&try_2);
	print_list(&try_2);
	printf("\n");


	//另一种玩法
	int n;
	int i;
	printf("\nplease input the number of elements: ");
	scanf("%d",&n);
	printf("please input %d values:\n",n);
	sequenlist try_3;
	try_3.last = n-1;//注意,数组的小标从0开始
	for(i=0; i<=try_3.last; i++)
	{
		scanf("%d",&try_3.data[i]);
	}
	print_list(&try_3);
	printf("\n\n");

	//在指定位置插入
	insert(&try_3,1,22);
	print_list(&try_3);

    return 0;
}

程序运行结果

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • V8带来的JS性能优化

    二、解释型语言:支持动态类型,弱类型,在程序运行的时候才进行编译,而编译前需要确定变量的类型,效率比较低,对不同系统平台有较大的兼容性。

    Cloud-Cloudys
  • SQLAlchemy建立数据库模型之间的关系

    在这里我们希望可以在Book类中存在这样一个属性:通过调用它可以获取对应的作者的记录,这类返回单个值的关系属性称为标量关系属性

    Cloud-Cloudys
  • git clone后如何checkout到remote branch

    通常情况使用git clone github_repository_address下载下来的仓库使用git branch查看当前所有分支时只能看到master分...

    Cloud-Cloudys
  • WebService_04_JS调用WebService

    在之间的介绍中提到过,WebService的底层数据传输本质上就是一种特殊逇HTTP的POST请求。

    Learning_斌
  • Dart语言进阶语法(二)

    Dart中的类与Java中的相似,不同的是,Dart中没有private、public这些成员访问修饰符。如果是类私有的成员,不希望外面访问,只需要在成员变量之...

    arcticfox
  • 每天一道剑指offer-求1+2+3+...+n

    使用逻辑判断语,具体看代码 把(n-1)>=0放在最开始的判断上,利用&&操作符的性质,只有在(n-1)>=0的条件下才会执行后面的语句,temp = temp...

    乔戈里
  • 迷宫问题(bfs的应用)

    问题描述: 定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示:  int maze[5][5] = {         ...

    用户1215536
  • 微服务在微信的架构实践

    微服务的理念与腾讯一直倡导的“大系统小做”有很多相通之处,本文将分享微信后台架构的服务发现、通信机制、集群管理等基础能力与其上层服务划分原则、代码管理规则等。

    Java架构师历程
  • 微博推荐算法如何设计

    在介绍微博推荐算法之前,我们先聊一聊推荐系统和推荐算法。有这样一些问题:推荐系统适用哪些场景?用来解决什么问题、具有怎样的价值?效果如何衡量? 推荐系统诞生很早...

    机器学习AI算法工程
  • 微博推荐算法简述

    在介绍微博推荐算法之前,我们先聊一聊推荐系统和推荐算法。有这样一些问题:推荐系统适用哪些场景?用来解决什么问题、具有怎样的价值?效果如何衡量?

    week

扫码关注云+社区

领取腾讯云代金券