1. 程式人生 > >順序表所有元素逆置

順序表所有元素逆置

題目:設計一個高效的演算法,將順序表的所有元素逆置,要求演算法的空間複雜度為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]);
	}
}
執行結果:




相關推薦

順序所有元素

題目:設計一個高效的演算法,將順序表的所有元素逆置,要求演算法的空間複雜度為O(1)。 演算法思想:掃描順序表的前半部分元素,對於元素L.data[i] (0<=i<L.length/2

順序之就地算法

逆置算法 std 所有 逆置 一個 ++ 循環 順序表 高效 1 #include<stdio.h> 2 #define MAX 10 3 typedef int ElementType; 4 int length=0; 5 int value;

順序的就地

#include <stdio.h> /* 題目:資料結構題集18頁2.21 試寫一個演算法,實現順序表的就地逆置,即利用原表的儲存空間將線性表(a1,a2,...,an)逆置為(an,...,a2,a1) */ #define maxlen 50 #define DATATYPE

【應用】順序的就地

順序表的逆置 描述 讀入一個順序表,實現順序表的就地逆置。 輸入 先輸入一個小於100的正整數n,再從小到大的輸入n個正整數,建立一個順序表,然後實現順序表的就地逆置。 輸出 按順序輸出逆置後的順序表的所有元素,每個元素佔一行。 輸入樣例 3

線性順序儲存-練習題3-順序

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

問題 B: 習題6-5 數組元素

空格 使用 enter size printf 數據 gre content 組元 問題 B: 習題6-5 數組元素逆置 時間限制: 1 Sec 內存限制: 12 MB獻花: 183 解決: 171[獻花][花圈][TK題庫] 題目描述 將一個長度為10的整型數組中

旋轉鏈(所有元素往右移) rotate list

鏈表 color 畫圖 image class 節點 http 就是 思路 [抄題]: 給定一個鏈表,旋轉鏈表,使得每個節點向右移動k個位置,其中k是一個非負數 樣例 給出鏈表1->2->3->4->5->null和k=2 返回4->5

問題 B: 習題6-5 陣列元素

問題 B: 習題6-5 陣列元素逆置 時間限制: 1 Sec  記憶體限制: 12 MB 題目描述 將一個長度為10的整型陣列中的值按逆序重新存放。 如:原來的順序為1,2,3,4,5,6,7,8,9,0,要求改為0,9,8,7,6,5,4,3,2

單鏈反轉(關鍵詞:連結串列/單鏈/反轉/逆轉/

單鏈表反轉 一點解釋 可以拿 1 種最簡單的情況為例,2 個結點的單鏈表,紙筆畫示意圖,程式碼很好理解,不做詳細解釋了。 實現方法 1 def reverseList(head): prev = None while head is not None: cur

jmu-ds-順序區間元素刪除

若一個線性表L採用順序儲存結構儲存,其中所有的元素為整數。設計一個演算法,刪除元素值在[x,y]之間的所有元素,要求演算法的時間複雜度為O(n),空間複雜度為O(1)。 輸入格式: 三行資料,第一行是順

資料結構:單鏈的就地

6-1 帶頭結點的單鏈表就地逆置(10 分)   本題要求編寫函式實現帶頭結點的單鏈線性表的就地逆置操作函式。L是一個帶頭結點的單鏈表,函式ListReverse_L(LinkList &L)要求在不新開闢節點的前提下將單鏈表中的元素進行逆置,如原單鏈表元素依次為1

元素

題目描述 設將n(n>1)個整數存放到一維陣列R中,設計一個演算法,將R中的序列迴圈左移P(0<P<n)個位置,即將R中的資料由{X0,X1,X2,…,Xn-1}變換為{Xp,Xp+1,…,Xn-1,X0,X1,…,Xp-1}。要求:寫出演算法描述 思路分析 要實現

9.28機試 定義兩個陣列,首先把兩個數組合併成一個新陣列,然後把新陣列中的所有元素序排列

public class Demo7 { public static void main(String[] args) { int[]array1 = new int[]{10,20,30};

單鏈的就地(頭插法和遞迴法)【轉】

單鏈表的就地逆置是指輔助空間O(1)的逆置方法,有兩種方法:普通迴圈(頭插法重新建立帶頭節點的新連結串列)和遞迴。下面我們詳細介紹這兩種方法: 方法一:頭插法 演算法思想:逆置連結串列初始為空,表中節點從原連結串列中依次“刪除”,再逐個插入逆置連結串列的表頭(即“頭插

帶頭結點的單鏈實現就地的更優方法

在習慣上,我們在實現連結串列的逆置時都會採用從第一個結點開始遍歷並不斷將連結串列的指向逆置的方法,但這樣做效率其實不高。假設要逆置的連結串列為L,更好的方法是先用指標p儲存L-〉next,再將連結串列L的頭結點置為Null,亦即L-〉next=Null,而後將p所指向的原存

一種高效的方法將陣列中的元素

一般方法是利用Array.Reverse方法,例:Int [] someArray = new int [4] {1,2,3,4,5}; Array.Reverse(someArray); 可以嘗試以下自己寫的方法。 publicstaticvoid DoReversal

C++ 單鏈的 就地 ,以及基本操作

#include "stdafx.h" #define sub(a,b) a-b //沒用 #include <iostream> using namespace std; struct node { int a; node * next; }; int

SDUT 3327 順序應用4:元素位置互換之算法

pre mit inf cep 復雜 部分 set include scrip 順序表應用4:元素位置互換之逆置算法 Time Limit: 10 ms Memory Limit: 570 KiB Problem Description 一個長度為len(

資料結構--C語言--順序元素

#include<stdio.h> #include<stdlib.h> #define OK 1 #define OVERFLOW 0 #define LIST_INIT_SIZE 10 #define LISTINCREMENT 5 typedef struct{

SDUT OJ順序應用4-2:元素位置互換之演算法(資料改進)

順序表應用4-2:元素位置互換之逆置演算法(資料改進) Time Limit: 80 ms Memory Limit: 600 KiB Problem Description 一個長度為len(1<=len<=1000000)的順序表,資料元素的型別為整