顺序表所有元素逆置


题目:设计一个高效的算法,将顺序表的所有元素逆置,要求算法的空间复杂度为O(1)。

算法思想:扫描顺序表的前半部分元素,对于元素L.data[i] (0<=i<L.length/2),将其余后半部分对应元素L.data[L.lengtn-i-1]进行交换。

空间复杂度:

    算法的空间复杂度S(n),定义为该算法所耗费的存储空间,它是问题规模n的函数。渐近空间复杂度也常简称为空间复杂度,记作S(n)=O(g(n))。

    一个上机程序除了需要存储空间来存放本身所用指令、常数、变量和输入数据外,也需要一些对数据进行操作的工作单元和存储一些为实现计算所需信息的辅助空间,若输入数据所占空间只取决于问题本身,和算法无关,则只需分析除输入和程序之外的额外空间。

    算法原地工作是指算法所需辅助空间是常量,即O(1)。


自己写的核心代码(算法):

void Reverse_Sq(LIST *list)
{
	int p;
	int i = 0;
	int j = list->length - 1;
	while (i<list->length / 2 && j>=list->length / 2)
	{
            p = list->base[i];
			list->base[i] = list->base[j];
			list->base[j] = p;
			i++;
			j--;
	}

我这里用到了i和j两个变量,参考答案只用到了i就可以实现,是根据上述算法思想写的,可以参考上述算法思想来实现。


自己上机实践完整代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define N 8
typedef struct
{
	int * base;
	int length;
	int listsize;
}LIST;

void Init_LIST(LIST* list)
{
	list->listsize = 100;
	list->base = (int*)malloc(list->listsize*sizeof(int));
	list->length = 0;
}

void Reverse_Sq(LIST *list)
{
	int p;
	int i = 0;
	int j = list->length - 1;
	while (i<list->length / 2 && j>=list->length / 2)
	{
            p = list->base[i];
			list->base[i] = list->base[j];
			list->base[j] = p;
			i++;
			j--;
	}
		
			

		
	
}

int main()
{
	LIST mylist;
	Init_LIST(&mylist);

	printf("请输入mylist里数据:\n");
	for (int i = 0; i < N; i++)
	{
		scanf("%d", &mylist.base[i]);
		mylist.length++;
	}

	Reverse_Sq(&mylist);

	printf("请输出mylist里数据:\n");
	for (int i = 0; i < N; i++)
	{
		printf("%d ", mylist.base[i]);
	}
}


运行结果:




  • 6
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
动态顺序表是指顺序表的长度可以动态增长或缩短,其实现方式是使用动态内存分配函数(如malloc、realloc、free)来动态分配、释放内存。 输入元素逆置即将输入的元素按照与输入顺序相反的顺序存储到顺序表中。下面是一个示例代码: ```c #include <stdio.h> #include <stdlib.h> #define INIT_SIZE 10 // 初始分配大小 #define INCREMENT 5 // 增量 typedef struct { int *data; // 动态数组 int length; // 当前长度 int size; // 当前分配的存储容量 } SqList; // 动态顺序表 // 初始化动态顺序表 void initList(SqList *L) { L->data = (int *)malloc(INIT_SIZE * sizeof(int)); // 分配初始存储空间 if (L->data == NULL) { printf("Error: memory allocation failed!\n"); exit(1); } L->length = 0; L->size = INIT_SIZE; } // 在动态顺序表中插入元素 void insert(SqList *L, int e) { if (L->length == L->size) { // 空间已满,需重新分配内存 L->data = (int *)realloc(L->data, (L->size + INCREMENT) * sizeof(int)); if (L->data == NULL) { printf("Error: memory reallocation failed!\n"); exit(1); } L->size += INCREMENT; } L->data[L->length++] = e; // 插入元素 } // 逆置动态顺序表中的元素 void reverse(SqList *L) { int i, temp; for (i = 0; i < L->length / 2; i++) { // 前后交换元素 temp = L->data[i]; L->data[i] = L->data[L->length - i - 1]; L->data[L->length - i - 1] = temp; } } // 输出动态顺序表中的元素 void printList(SqList L) { int i; for (i = 0; i < L.length; i++) { printf("%d ", L.data[i]); } printf("\n"); } int main() { SqList L; int i, n; initList(&L); // 初始化动态顺序表 printf("Please input the number of elements: "); scanf("%d", &n); printf("Please input the elements: "); for (i = 0; i < n; i++) { int e; scanf("%d", &e); insert(&L, e); // 插入元素 } printf("The original list is: "); printList(L); reverse(&L); // 逆置元素 printf("The reversed list is: "); printList(L); free(L.data); // 释放内存 return 0; } ``` 在上述代码中,initList函数用于初始化动态顺序表,insert函数用于在动态顺序表中插入元素,reverse函数用于逆置动态顺序表中的元素,printList函数用于输出动态顺序表中的元素。在main函数中,首先输入元素个数和元素值,然后调用insert函数将元素插入动态顺序表中,输出原始的动态顺序表,接着调用reverse函数逆置动态顺序表中的元素,最后输出逆置后的动态顺序表。最后,需要调用free函数释放动态分配的内存。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值