顺序表的习题

  • Post author:
  • Post category:其他




一、题目

题目:实现顺序表各种基本运算的算法

要求:

1、建立一个顺序表,输入n个元素并输出;

2、查找线性表中的最大元素并输出;

3、在线性表的第i个元素前插入一个正整数x;

4、删除线性表中的第j个元素;

5、将线性表中的元素按升序排列;

6、将线性表中的元素就地逆序(只允许用一个暂存单元);



二、源代码

为了方便大家食用,直接讲代码放出来,大家可以直接复制去运行的试一下。

#define _CRT_SECURE_NO_WARNINGS 1 
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SLType;
typedef struct seqlist
{
	SLType* a;
	int size;
	int capicity;
}SL;
SL sl;
//线性表的初始化
void SLinit(SL* ps)
{
	assert(ps);

	ps->a = NULL;
	ps->capicity = ps->size = 0;
}
//开辟空间
void SLcapicity(SL* ps)
{
	assert(ps);

	if (ps->size == ps->capicity)
	{
		int newcapicity = ps->capicity == 0 ? 4 : ps->capicity * 2;
		int* tmp = (int*)realloc(ps->a, newcapicity * sizeof(SLType));
		if (tmp == NULL)
		{
			printf("realloc fail\n");
			exit(-1);
		}
		ps->a = tmp;
		ps->capicity = newcapicity;
	}
}
//输入元素
SL_scanf(SL* ps)
{
	assert(ps);

	printf("请输入你要输入几个元素\n");
	int n;
	scanf("%d", &n);
	printf("请输入%d个元素\n", n);
	for (int i = 0; i < n; i++)
	{
		SLcapicity(&sl);
		scanf("%d", &(ps->a[i]));
		ps->size++;
		ps->capicity++;
	}
}
//打印顺序表
void SLprint(SL*ps)
{
	assert(ps);

	int i = 0;
	for (int i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->a[i]);
	}
	printf("\n");
}
//查找线性表中的最大元素并输出
int SLmax(SL* ps)
{
	assert(ps);

	int max = ps->a[0];
	for (int i = 1; i < ps->size; i++)
	{
		if (ps->a[i] > max)
		{
			max = ps->a[i];
		}
	}
	return max;
}
//在线性表的第i个元素前插入一个正整数x
void SLinsert(SL* ps,int i, SLType x)
{
	assert(ps);
	assert(i > 0 && i <= ps->size);

	int end = ps->size;
	while (i <= end)
	{
		ps->a[end] = ps->a[end - 1];
		end--;
	}
	ps->a[i - 1] = x;
	ps->size++;
}
//删除线性表中的第j个元素
void SLdelete(SL* ps, int j)
{
	assert(ps);
	assert(j > 0 && j <= ps->size);

	while (j - 1 <= ps->size)
	{
		ps->a[j - 1] = ps->a[j];
		j++;
	}
	ps->size--;
}
//对顺序表的元素进行排序
void SLsort(SL* ps)
{
	assert(ps);

	for (int j = 0; j < ps->size - 1; j++)
	{
		for (int i = 0; i < ps->size - 1-j; i++)
		{
			if (ps->a[i] > ps->a[i + 1])
			{
				int tmp = 0;
				tmp = ps->a[i];
				ps->a[i] = ps->a[i + 1];
				ps->a[i + 1] = tmp;
			}
		}
	}
}
//逆序线性表
void SLreserve(SL* ps)
{
	int* left = ps->a;
	int* right = ps->a + ps->size - 1;
	while (left < right)
	{
		int tmp = 0;
		tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}


//测试
void test()
{
	//初始化线性表
	SLinit(&sl);
	//开辟空间
	SLcapicity(&sl);
	//输入元素
	SL_scanf(&sl);
	//打印顺序表
	SLprint(&sl);
	//查找最大的值
	int max=SLmax(&sl);
	printf("最大的值是%d\n", max);
	//在线性表的第i个元素前插入一个正整数x
	printf("请输入你要在哪个位置前插入什么元素\n");
	int x,i;
	scanf("%d%d",&i, &x);
	SLinsert(&sl,i,x);
	//打印顺序表
	SLprint(&sl);
	//删除线性表中的第j个元素
	int j;
	printf("请输入你要删除哪个位置的元素\n");
	scanf("%d", &j);
	SLdelete(&sl, j);
	//打印顺序表
	SLprint(&sl);
	//将线性表中的元素按升序排列
	SLsort(&sl);
	//打印顺序表
	printf("按照从小到大排列\n");
	SLprint(&sl);
	//将线性表中的元素就地逆序(只允许用一个暂存单元)
	SLreserve(&sl);
	//打印顺序表
	printf("逆序后的结果是\n");
	SLprint(&sl);
}
int main()
{
	test();
	return 0;
}



三、运行结果

在这里插入图片描述



总结


努力是最好的天赋,所以行动起来吧!

如果觉得浩克写的还不错的话,记得关注浩克奥,我们一起努力!

在这里插入图片描述



版权声明:本文为m0_62397453原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。