国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【數(shù)據(jù)結(jié)構(gòu)】順序表---C語言版

這篇具有很好參考價(jià)值的文章主要介紹了【數(shù)據(jù)結(jié)構(gòu)】順序表---C語言版。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言:

順序表是一種常見的數(shù)據(jù)結(jié)構(gòu),今天就讓我來帶領(lǐng)大家一起學(xué)習(xí)一下吧!
不會再休息,一分一毫了,OK,let’s go!

一、線性表

  1. 線性表(linear list)是n個(gè)具有相同特性的數(shù)據(jù)元素的有限序列。 線性表是一種在實(shí)際中廣泛使
    用的數(shù)據(jù)結(jié)構(gòu),常見的線性表:順序表、鏈表、棧、隊(duì)列、字符串
  2. 線性表在邏輯上是線性結(jié)構(gòu),也就說是連續(xù)的一條直線。但是在物理結(jié)構(gòu)上并不一定是連續(xù)的,
    線性表在物理上存儲時(shí),通常以數(shù)組和鏈?zhǔn)浇Y(jié)構(gòu)的形式存儲。

【數(shù)據(jù)結(jié)構(gòu)】順序表---C語言版,數(shù)據(jù)結(jié)構(gòu),c語言,開發(fā)語言

二、順序表

1.順序表的概念及結(jié)構(gòu):

順序表是用一段物理地址連續(xù)的存儲單元依次存儲數(shù)據(jù)元素的線性結(jié)構(gòu),一般情況下采用數(shù)組存
儲。在數(shù)組上完成數(shù)據(jù)的增刪查改。

2.順序表的分類:

順序表一般可以分為:

  1. 靜態(tài)順序表:使用定長數(shù)組存儲元素。
//順序表的靜態(tài)存儲
#define N 7
typedef int SLDataType;
 
typedef struct SeqList
{
	SLDataType array[N];//定長數(shù)組
	size_t size;//有效數(shù)據(jù)的個(gè)數(shù)
}SeqList;

【數(shù)據(jù)結(jié)構(gòu)】順序表---C語言版,數(shù)據(jù)結(jié)構(gòu),c語言,開發(fā)語言
2. 動態(tài)順序表:使用動態(tài)開辟的數(shù)組存儲。

typedef struct SeqList
{
	SLDataType* array;//指向動態(tài)開辟的數(shù)組
	size_t size;//有效數(shù)據(jù)的個(gè)數(shù)
	size_t capacity;//容量
}SeqList;

【數(shù)據(jù)結(jié)構(gòu)】順序表---C語言版,數(shù)據(jù)結(jié)構(gòu),c語言,開發(fā)語言

3.順序表缺陷:

  1. 順序表缺陷:

(1)動態(tài)增容有性能消耗。

(2)當(dāng)頭部插入數(shù)據(jù)時(shí),需要挪動數(shù)據(jù)

三、順序表的代碼實(shí)現(xiàn):

1.頭文件:

#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef int SLDataType;

typedef struct SeqList
{
	SLDataType* s;//順序表的名稱(頭指針?。?/span>

	int size;//儲存的有效個(gè)數(shù)!
	int capacity;//整塊空間的大??!
}SL;


//初始化
void SLInit(SL* ps);
//銷毀
void SLDestory(SL* ps);
//打印
void SLPrint(SL* ps);



//管理數(shù)據(jù):增刪查改

//尾插
void PushBack(SL* ps, SLDataType x);
//頭插
void PushFront(SL* ps, SLDataType x);

//尾刪
void PopBack(SL* ps);
//頭刪
void PopFront(SL* ps);

//判斷是否擴(kuò)容
void SLCheckCapacity(SL* ps);

//在pos位置之前插入數(shù)據(jù)
void SLInsert(SL* ps, int pos, SLDataType x);

2.函數(shù)文件:

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>
#include "SeqList.h"

//初始化函數(shù)
void SLInit(SL* ps)
{
	assert(ps);

	//創(chuàng)建空間
	ps->s = (SLDataType*)malloc(sizeof(SLDataType)*4);
	if (ps->s == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}

	ps->size = 0;
	ps->capacity = 4;
}

//銷毀函數(shù)
void SLDestory(SL* ps)
{
	free(ps);

	ps->s = NULL;
	ps->size = ps->capacity = 0;
}

//打印函數(shù)
void SLPrint(SL* ps)
{
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->s[i]);
	}
	printf("\n");
}


//判斷是否擴(kuò)容
void SLCheckCapacity(SL* ps)
{
	assert(ps);

	if (ps->size == ps->capacity)
	{
		//需要擴(kuò)容
		SLDataType* tmp = (SLDataType*)realloc(ps->s, sizeof(SLDataType) * ps->capacity * 2);//擴(kuò)大了原來容量的二倍。

		//SLDataType* tmp = (SLDataType*)realloc(ps->s, 2 * ps->capacity);標(biāo)準(zhǔn)的錯(cuò)誤寫法!
		//如果空間不夠用,要對一些元素進(jìn)行擴(kuò)容。我們擴(kuò)容的標(biāo)準(zhǔn):就是為這些元素申請它 自身大小 整數(shù)倍 的空間!所以說為什么要sizeof(數(shù)據(jù)類型),然后再乘以擴(kuò)大的容量的倍數(shù)
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(-1);
		}
		ps->s = tmp;
		ps->capacity *= 2;
	}
	
}

//尾插
void PushBack(SL* ps, SLDataType x)
{
	//檢查容量
	SLCheckCapacity(ps);

	ps->s[ps->size] = x;
	ps->size++;
}

//尾刪
void PopBack(SL* ps)
{
	assert(ps);

	ps->size--;

}

//頭插(利用一個(gè)end指針從后往前拷貝?。?/span>
void PushFront(SL* ps, SLDataType x)
{
	assert(ps);

	//檢查容量
	SLCheckCapacity(ps);

	int end = ps->size - 1;
	while (end >= 0)
	{
		ps->s[end+1] = ps->s[end];
		end--;
	}
	ps->s[0] = x;
	ps->size++;
}


//頭刪
void PopFront(SL* ps)
{
	assert(ps);

	int begin = 0;
	while (begin < ps->size-1)
	{
		ps->s[begin] = ps->s[begin + 1];
		begin++;
	}
	ps->size--;
}


//在pos位置之前插入數(shù)據(jù)
void SLInsert(SL* ps, int pos, SLDataType x)

{
	assert(ps);
	assert(pos >= 0 && pos < ps->size);

	SLCheckCapacity( ps);

	int end = ps->size - 1;
	while (end >= pos)
	{
		ps->s[end+1] = ps->s[end];
		end--;
	}
	ps->s[pos] = x;
	ps->size++;
}

3.測試文件:

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>
#include "SeqList.h"



void test1()
{
	SL s1;
	SLInit(&s1);

	PushFront(&s1, 1);
	PushFront(&s1, 2);
	PushFront(&s1, 3);
	PushFront(&s1, 4);
	PushFront(&s1, 5);

	SLPrint(&s1);

	PopFront(&s1);
	PopFront(&s1);
	PopFront(&s1);

	SLPrint(&s1);

}


void test2()
{
	SL s2;

	SLInit(&s2);

	PushBack(&s2,1);
	PushBack(&s2,2);
	PushBack(&s2,3);
	PushBack(&s2,4);
	PushBack(&s2,5);

	SLPrint(&s2);

	PopBack(&s2);
	PopBack(&s2);
	PopBack(&s2);

	SLPrint(&s2);
}


void test3()
{
	SL s2;

	SLInit(&s2);

	PushBack(&s2, 1);
	PushBack(&s2, 2);
	PushBack(&s2, 3);
	PushBack(&s2, 4);
	PushBack(&s2, 5);

	SLPrint(&s2);

	SLInsert(&s2, 3, 6);//在下標(biāo)為3的數(shù)據(jù)之前插入一個(gè)6

	SLPrint(&s2);
}

int main()
{

	//test1();//測試頭插,頭刪

	//test2();//測試尾插 尾刪

	test3();//測試在pos位置之前插入數(shù)據(jù)!
	return 0;

}

【數(shù)據(jù)結(jié)構(gòu)】順序表---C語言版,數(shù)據(jù)結(jié)構(gòu),c語言,開發(fā)語言

四、順序表的相關(guān)OJ題:

(1)原地移除數(shù)組中所有的元素val:

1.題目描述:

1.原地移除數(shù)組中所有的元素val,要求時(shí)間復(fù)雜度為O(N),空間復(fù)雜度為O(1)。OJ鏈接:OJ鏈接
【數(shù)據(jù)結(jié)構(gòu)】順序表---C語言版,數(shù)據(jù)結(jié)構(gòu),c語言,開發(fā)語言

2.思路表述:

【數(shù)據(jù)結(jié)構(gòu)】順序表---C語言版,數(shù)據(jù)結(jié)構(gòu),c語言,開發(fā)語言

3.代碼實(shí)現(xiàn):

int removeElement(int* nums, int numsSize, int val) 
{
    int src=0;
    int dst=0;
    while(src<numsSize)
    {
        if(nums[src]!=val)
        {
            nums[dst++]=nums[src++];
        }
        else
        {
            src++;
        }
    }
    return dst;//返回的是:新數(shù)組的長度,因?yàn)樽詈笠徊匠鲅h(huán)的時(shí)候,dst已經(jīng)++了,所以說直接返回dst就行了
}

(2)刪除有序數(shù)組中的重復(fù)項(xiàng)

1.題目描述:

【數(shù)據(jù)結(jié)構(gòu)】順序表---C語言版,數(shù)據(jù)結(jié)構(gòu),c語言,開發(fā)語言

2.思路表述:

還使用雙下標(biāo)法:
【數(shù)據(jù)結(jié)構(gòu)】順序表---C語言版,數(shù)據(jù)結(jié)構(gòu),c語言,開發(fā)語言

3.代碼實(shí)現(xiàn):

int removeDuplicates(int* nums, int numsSize) 
{
    int dst=1;
    int src=0;
    while(dst<numsSize)
    {
        if(nums[dst]!=nums[src])
        {
          //nums[++src]=nums[dst++];//這里的src一定要是前置++,先++,然后再賦值。
          
          src++;
          nums[src]=nums[dst];
          dst++;
        }
        else
        {
            
            dst++;
        }
    }
    return src+1;
}

(3)合并兩個(gè)有序數(shù)組

1.題目描述:

【數(shù)據(jù)結(jié)構(gòu)】順序表---C語言版,數(shù)據(jù)結(jié)構(gòu),c語言,開發(fā)語言

2.思路表述:

使用3下標(biāo)法
【數(shù)據(jù)結(jié)構(gòu)】順序表---C語言版,數(shù)據(jù)結(jié)構(gòu),c語言,開發(fā)語言

3.代碼實(shí)現(xiàn):

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) 
{
   int end1=m-1;
   int end2=n-1;
   int end=m+n-1;
   while(end1>=0&&end2>=0)
   {
       if(nums1[end1]>nums2[end2])
       {
           nums1[end--]=nums1[end1--];
       }
       else
       {
           nums1[end--]=nums2[end2--];
       }
   }
   //因?yàn)橛胣ums1的初始長度是m+n,所以不會擔(dān)心數(shù)組大小不夠用。
   //下面這個(gè)循環(huán)是針對:比如說nums1中的所有數(shù)字都插到自己數(shù)組后面了,但是因?yàn)閮蓚€(gè)數(shù)組都是有序的,所以我只需要把nums2中的全部數(shù)字依次放到nums1前面就行了。
   while(end2>=0)
   {
       nums1[end--]=nums2[end2--];
   }
}

好了,今天的分享就到這里了
如果對你有幫助,記得點(diǎn)贊??+關(guān)注哦!
我的主頁還有其他文章,歡迎學(xué)習(xí)指點(diǎn)。關(guān)注我,讓我們一起學(xué)習(xí),一起成長吧!

【數(shù)據(jù)結(jié)構(gòu)】順序表---C語言版,數(shù)據(jù)結(jié)構(gòu),c語言,開發(fā)語言文章來源地址http://www.zghlxwxcb.cn/news/detail-756864.html

到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)】順序表---C語言版的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 順序表—C語言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)

    順序表—C語言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)

    本期帶大家一起來用C語言代碼實(shí)現(xiàn)順序表?????? 順序表是一段物理地址連續(xù)的存儲單元,依次存儲數(shù)據(jù)元素的線性結(jié)構(gòu)。分為靜態(tài)順序表與動態(tài)順序表。 ?? ?? ?? 靜態(tài)順序表 :使用定長數(shù)組用來存儲數(shù)據(jù) 優(yōu)點(diǎn) :操作簡單,代碼實(shí)現(xiàn)容易 缺點(diǎn) :定長數(shù)組很受限制,數(shù)

    2023年04月24日
    瀏覽(29)
  • 數(shù)據(jù)結(jié)構(gòu)(C語言)——順序表詳解

    數(shù)據(jù)結(jié)構(gòu)(C語言)——順序表詳解

    數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)存儲和組織數(shù)據(jù)的方式。常用的數(shù)據(jù)結(jié)構(gòu)有:數(shù)組(Array)、棧(Stack)、隊(duì)列(Queue)、鏈表(Linked List)、樹(Tree)、圖(Graph)、堆(Heap)等;而數(shù)據(jù)結(jié)構(gòu)又可以通過邏輯結(jié)構(gòu)與物理結(jié)構(gòu)進(jìn)行分類,邏輯結(jié)構(gòu)是指數(shù)據(jù)元素之間的邏輯關(guān)系,也就是數(shù)據(jù)元

    2024年04月16日
    瀏覽(23)
  • 【數(shù)據(jù)結(jié)構(gòu)|C語言版】順序表

    【數(shù)據(jù)結(jié)構(gòu)|C語言版】順序表

    各位小伙伴大家好!小編來給大家講解一下數(shù)據(jù)結(jié)構(gòu)中順序表的相關(guān)知識。 【概念】數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)存儲、組織數(shù)據(jù)的?式。 數(shù)據(jù)結(jié)構(gòu)是指相互之間存在?種或多種特定關(guān)系的數(shù)據(jù)元素的集合 數(shù)據(jù)結(jié)構(gòu)反映數(shù)據(jù)的內(nèi)部構(gòu)成,即數(shù)據(jù)由那部分構(gòu)成,以什么?式構(gòu)成,以及數(shù)

    2024年04月16日
    瀏覽(21)
  • 數(shù)據(jù)結(jié)構(gòu)——順序表(C語言版)

    順序表是數(shù)據(jù)結(jié)構(gòu)中最基本的一種線性表,它以一段連續(xù)的存儲空間來存儲數(shù)據(jù)元素,元素之間的順序由它們在內(nèi)存中的位置來決定。在C語言中,我們通常使用數(shù)組來實(shí)現(xiàn)順序表。 目錄 順序表的結(jié)構(gòu)定義 順序表的基本操作 應(yīng)用實(shí)例 順序表的結(jié)構(gòu)定義 首先,我們需要定義一

    2024年04月10日
    瀏覽(21)
  • 【數(shù)據(jù)結(jié)構(gòu)】順序表---C語言版

    【數(shù)據(jù)結(jié)構(gòu)】順序表---C語言版

    順序表是一種常見的數(shù)據(jù)結(jié)構(gòu),今天就讓我來帶領(lǐng)大家一起學(xué)習(xí)一下吧! 不會再休息,一分一毫了,OK,let’s go! 線性表(linear list)是n個(gè)具有 相同特性的數(shù)據(jù)元素 的有限序列。 線性表是一種在實(shí)際中廣泛使 用的數(shù)據(jù)結(jié)構(gòu), 常見的線性表:順序表、鏈表、棧、隊(duì)列、字符

    2024年02月04日
    瀏覽(21)
  • 數(shù)據(jù)結(jié)構(gòu)c語言版:順序表

    數(shù)據(jù)結(jié)構(gòu)c語言版:順序表

    ? ? 順序表是一種 線性數(shù)據(jù)結(jié)構(gòu) ,它由一組連續(xù)的存儲單元組成,用來存儲具有相同數(shù)據(jù)類型的元素。順序表中的元素按照邏輯順序依次存放,并且可以通過索引來訪問和修改元素。 ? ? ? ? 兩種:靜態(tài)順序表和動態(tài)順序表。 靜態(tài)順序表: 靜態(tài)順序表使用 靜態(tài)數(shù)組 來實(shí)現(xiàn)

    2024年02月02日
    瀏覽(21)
  • 數(shù)據(jù)結(jié)構(gòu)順序表(C語言實(shí)現(xiàn))

    數(shù)據(jù)結(jié)構(gòu)順序表(C語言實(shí)現(xiàn))

    ????????從本章開始就是開始數(shù)據(jù)結(jié)構(gòu)的開端,本章將會寫出數(shù)據(jù)結(jié)構(gòu)中的順序表的代碼實(shí)現(xiàn),多會以注釋的方法來描述一些細(xì)節(jié)(注釋是我們程序員必須常用的工具)。 ? ? ? ? 話不多說安全帶系好,發(fā)車?yán)玻ńㄗh電腦觀看)。 附:紅色,部分為重點(diǎn)部分;藍(lán)顏色為需

    2024年02月10日
    瀏覽(26)
  • 【數(shù)據(jù)結(jié)構(gòu)】C語言實(shí)現(xiàn)順序表

    【數(shù)據(jù)結(jié)構(gòu)】C語言實(shí)現(xiàn)順序表

    順序表是用順序存儲方式存放的線性表(可以理解為數(shù)組的存儲方式),表中的元素在內(nèi)存中彼此相鄰。 靜態(tài)存儲:在定義時(shí)就確定了順序表的大小,并且之后順序表的大小不會改變(即使之后空間不夠用了,也無法增加) 動態(tài)存儲:線性表的大小可以根據(jù)需要更改(順序

    2024年02月08日
    瀏覽(22)
  • 【數(shù)據(jù)結(jié)構(gòu)|C語言版】順序表應(yīng)用

    【數(shù)據(jù)結(jié)構(gòu)|C語言版】順序表應(yīng)用

    上期回顧: 【數(shù)據(jù)結(jié)構(gòu)|C語言版】順序表 個(gè)人主頁: C_GUIQU 各位小伙伴大家好!上期小編給大家講解了數(shù)據(jù)結(jié)構(gòu)中的順序表,接下來講講順序表該如何應(yīng)用。 (1)能夠保存聯(lián)系人的姓名、年齡、性別、電話、住址 (2)添加聯(lián)系人信息 (3)刪除聯(lián)系人信息 (4)修改聯(lián)系人信

    2024年04月16日
    瀏覽(23)
  • 數(shù)據(jù)結(jié)構(gòu)(C語言):順序表就地逆置

    設(shè)計(jì)一個(gè)算法,實(shí)現(xiàn)將順序表就地逆置 ,即利用原順序表的存儲單元將數(shù)據(jù)元素序列(a0,a1,…,an-1)逆置為(an-1,…, a1,a0)。 本題所使用的數(shù)據(jù)結(jié)構(gòu)定義如下: 順序表的數(shù)據(jù)結(jié)構(gòu)定義: 1 、定義兩數(shù)交換函數(shù)。 2 、用循環(huán)遍歷順序表中的元素,依次調(diào)用兩數(shù)交換函數(shù),將順

    2024年02月08日
    瀏覽(13)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包