最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實(shí)現(xiàn)順序表的基本操作指南(注釋很詳細(xì))

 更新時(shí)間:2021年10月12日 14:24:47   作者:__ericZhao  
線性表是最簡單的數(shù)據(jù)結(jié)構(gòu),而順序表又是最簡單的線性表,其基本思想是用一段地址連續(xù)的儲(chǔ)存單元依次存儲(chǔ)線性表的數(shù)據(jù)元素,下面這篇文章主要給大家介紹了關(guān)于C語言實(shí)現(xiàn)順序表的基本操作,需要的朋友可以參考下

創(chuàng)建一個(gè)結(jié)構(gòu)體用于存放順序表相關(guān)數(shù)據(jù)

#define SEQTYPE int
typedef struct SeqList
{
	SEQTYPE* data;
	int size;		//有效數(shù)據(jù)個(gè)數(shù)
	int capacity;	//容量
}SeqList;

初始化順序表

void SeqListInit(SeqList* pq)
{
	CheckNull(pq);

	pq->data = NULL;
	pq->capacity = 0;
	pq->size = 0;
}

插入元素

  1. 插入到表頭;
  2. 插入到指定位置;
  3. 插入到尾部;

先檢查容量是否夠用

void CheckCapacity(SeqList* pq)
{
	CheckNull(pq);
	
	//如果空間滿了,擴(kuò)容
	if (pq->size >= pq->capacity)
	{
		int newcapacity = pq->capacity == 0 ? 4 : pq->capacity * 2;

		SEQTYPE* new = (SEQTYPE*)realloc(pq->data, sizeof(SEQTYPE) * newcapacity);
		if (new == NULL)
		{
			perror("realloc");
			exit(-1);
		}

		pq->data = new;
		pq->capacity = newcapacity;

	}
	puts("增容成功");
}

//往順序表指定位置插入數(shù)據(jù)
void SeqListInsert(SeqList* pq, int pos)
{
	CheckNull(pq);
	assert(pos <= pq->size);
	SEQTYPE InsertVal;
	if (pos == -1)
	{
		printf("請(qǐng)分別輸入添加的數(shù)據(jù)和位置,空格隔開:>");
		scanf("%d %d", &InsertVal, &pos);
		if (pos > pq->size)
		{
			printf("請(qǐng)正確輸入\n");
			return;
		}
	}
	else
	{
		printf("請(qǐng)輸入添加的數(shù)據(jù):>");
		scanf("%d", &InsertVal);
	}
	//檢查容量是否足夠
	CheckCapacity(pq);


	//插入數(shù)據(jù)
	int end = pq->size;
	int begin = pos;

	while (begin < end)
	{
		pq->data[end] = pq->data[end - 1];
		--end;
	}
	pq->data[pos] = InsertVal;
	++pq->size;
	printf("添加成功\n");
}

//往順序表末位置插入數(shù)據(jù)
void SeqListPushBack(SeqList* pq)
{
	CheckNull(pq);
	SeqListInsert(pq, pq->size);
}

//往順序表首位置插入數(shù)據(jù)
void SeqListPushFront(SeqList* pq)
{
	CheckNull(pq);
	SeqListInsert(pq, 0);
}

刪除元素

  1. 刪除首元素;
  2. 刪除指定位置元素;
  3. 刪除尾部元素;
//從順序表指定位置刪除數(shù)據(jù)
void SeqListErase(SeqList* pq, int pos)
{
	CheckNull(pq);

	if (pos == -1)
	{
		printf("請(qǐng)輸入要?jiǎng)h除數(shù)據(jù)的位置:>");
		scanf("%d", &pos);
		if (pos < 0 || pos >= pq->size)
		{
			printf("請(qǐng)正確輸入\n");
			return;
		}
	}

	int begin = pos;
	int end = pq->size - 1;
	while (begin < end)
	{
		pq->data[begin] = pq->data[begin + 1];
		++begin;
	}

	--pq->size;
	puts("刪除成功");
}

//從順序表末位置刪除數(shù)據(jù)
void SeqListPophBack(SeqList* pq)
{
	CheckNull(pq);
	SeqListErase(pq, pq->size - 1);
}

//從順序表首位置刪除數(shù)據(jù)
void SeqListPophFront(SeqList* pq)
{
	CheckNull(pq);
	SeqListErase(pq, 0);
}

元素修改

  1. 找到目標(biāo)元素;
  2. 直接修改該元素的值;
//修改順序表指定位置數(shù)據(jù)
void SeqListModify(SeqList* pq)
{
	CheckNull(pq);
	int pos;
	SEQTYPE x;
	printf("請(qǐng)輸入修改的位置和新的數(shù)據(jù),空格隔開:>");
	scanf("%d %d", &pos, &x);
	if (pos < 0 && pos >= pq->size)
	{
		printf("請(qǐng)正確輸入\n");
		return;
	}


	pq->data[pos] = x;
	puts("修改成功");
}

查找元素

查找目標(biāo)元素,算法多種,比如二分,插值等等,這里使用順序查找算法,具體代碼如下:

//查找所需數(shù)據(jù)是否存在順序表中
void SeqListFindData(SeqList* pq)
{
	CheckNull(pq);
	SEQTYPE x;

	printf("請(qǐng)輸入要查找的數(shù)據(jù):>");
	scanf("%d", &x);

	for (int i = 0; i < pq->size; i++)
	{
		if (pq->data[i] == x)
		{
			printf("所需查詢數(shù)據(jù)存在,下標(biāo)為:>%d\n", i);
			return;
		}
	}
	printf("找不到\n");

}

排序元素

//排序順序表
void SeqListSort(SeqList* pq)
{
	CheckNull(pq);

	int option = 0;
	printf("輸入0為升序,1為降序:>");
	scanf("%d", &option);

	for (int i = 0; i < pq->size - 1; i++)
	{
		for (int j = 0; j < pq->size - i - 1; j++)
		{
			if (pq->data[j] > pq->data[j + 1])
			{
				SEQTYPE tmp = pq->data[j];
				pq->data[j] = pq->data[j + 1];
				pq->data[j + 1] = tmp;
			}
		}
	}

	if (option)
	{
		SeqListReverse(pq);
		return;
	}

}

元素反轉(zhuǎn)

//順序表反轉(zhuǎn)
void SeqListReverse(SeqList* pq)
{
	CheckNull(pq);

	int left = 0;
	int right = pq->size - 1;

	while (left < right)
	{
		SEQTYPE tmp = pq->data[left];
		pq->data[left] = pq->data[right];
		pq->data[right] = tmp;
		++left;
		--right;
	}

}

源碼

  • 以上是順序表常用的功能操作,下面附上完整代碼,VS2019環(huán)境

SeqList.c

#include "SeqList.h"


void CheckNull(SeqList* pq)
{
	if (pq == NULL)
	{
		perror("pq::");
		exit(-1);
	}
}

//初始化順序表
void SeqListInit(SeqList* pq)
{
	CheckNull(pq);

	pq->data = NULL;
	pq->capacity = 0;
	pq->size = 0;
}


void SeqListDestory(SeqList* pq)
{
	CheckNull(pq);

	free(pq->data);
	pq->data = NULL;

	pq->size = 0;
	pq->capacity = 0;

}

void CheckCapacity(SeqList* pq)
{
	CheckNull(pq);
	
	//如果空間滿了,擴(kuò)容
	if (pq->size >= pq->capacity)
	{
		int newcapacity = pq->capacity == 0 ? 4 : pq->capacity * 2;

		SEQTYPE* new = (SEQTYPE*)realloc(pq->data, sizeof(SEQTYPE) * newcapacity);
		if (new == NULL)
		{
			perror("realloc");
			exit(-1);
		}

		pq->data = new;
		pq->capacity = newcapacity;

	}
	puts("增容成功");
}

void SeqListPrint(SeqList* pq)
{
	CheckNull(pq);
	if (pq->size == 0)
		printf("\n");
	else
	{
		for (int i = 0; i < pq->size; i++)
		{
			printf("%d ", pq->data[i]);
		}
		puts("\n--------------------------------------");
	}

}

//往順序表末位置插入數(shù)據(jù)
void SeqListPushBack(SeqList* pq)
{
	CheckNull(pq);
	SeqListInsert(pq, pq->size);
}

//往順序表首位置插入數(shù)據(jù)
void SeqListPushFront(SeqList* pq)
{
	CheckNull(pq);
	SeqListInsert(pq, 0);
}

//往順序表指定位置插入數(shù)據(jù)
void SeqListInsert(SeqList* pq, int pos)
{
	CheckNull(pq);
	assert(pos <= pq->size);
	SEQTYPE InsertVal;
	if (pos == -1)
	{
		printf("請(qǐng)分別輸入添加的數(shù)據(jù)和位置,空格隔開:>");
		scanf("%d %d", &InsertVal, &pos);
		if (pos > pq->size)
		{
			printf("請(qǐng)正確輸入\n");
			return;
		}
	}
	else
	{
		printf("請(qǐng)輸入添加的數(shù)據(jù):>");
		scanf("%d", &InsertVal);
	}
	//檢查容量是否足夠
	CheckCapacity(pq);


	//插入數(shù)據(jù)
	int end = pq->size;
	int begin = pos;

	while (begin < end)
	{
		pq->data[end] = pq->data[end - 1];
		--end;
	}
	pq->data[pos] = InsertVal;
	++pq->size;
	printf("添加成功\n");

}

//從順序表指定位置刪除數(shù)據(jù)
void SeqListErase(SeqList* pq, int pos)
{
	CheckNull(pq);

	if (pos == -1)
	{
		printf("請(qǐng)輸入要?jiǎng)h除數(shù)據(jù)的位置:>");
		scanf("%d", &pos);
		if (pos < 0 || pos >= pq->size)
		{
			printf("請(qǐng)正確輸入\n");
			return;
		}
	}

	int begin = pos;
	int end = pq->size - 1;
	while (begin < end)
	{
		pq->data[begin] = pq->data[begin + 1];
		++begin;
	}

	--pq->size;
	puts("刪除成功");

}

//從順序表末位置刪除數(shù)據(jù)
void SeqListPophBack(SeqList* pq)
{
	CheckNull(pq);
	SeqListErase(pq, pq->size - 1);
}

//從順序表首位置刪除數(shù)據(jù)
void SeqListPophFront(SeqList* pq)
{
	CheckNull(pq);
	SeqListErase(pq, 0);
}

//修改順序表指定位置數(shù)據(jù)
void SeqListModify(SeqList* pq)
{
	CheckNull(pq);
	int pos;
	SEQTYPE x;
	printf("請(qǐng)輸入修改的位置和新的數(shù)據(jù),空格隔開:>");
	scanf("%d %d", &pos, &x);
	if (pos < 0 && pos >= pq->size)
	{
		printf("請(qǐng)正確輸入\n");
		return;
	}


	pq->data[pos] = x;
	puts("修改成功");
}

//查找順序表指定位置數(shù)據(jù)
void SeqListFindPos(SeqList* pq)
{
	CheckNull(pq);
	int pos;
	printf("請(qǐng)輸入要查找數(shù)據(jù)的位置:>");
	scanf("%d", &pos);
	if (pos < 0 && pos >= pq->size)
	{
		printf("請(qǐng)正確輸入\n");
		return;
	}

	for (int i = 0; i < pq->size; i++)
	{
		if (pq->data[i] == pq->data[pos])
		{
			printf("查找位置的數(shù)據(jù)為:>%d\n", pq->data[pos]);
			break;
		}
	}

}

//查找所需數(shù)據(jù)是否存在順序表中
void SeqListFindData(SeqList* pq)
{
	CheckNull(pq);
	SEQTYPE x;

	printf("請(qǐng)輸入要查找的數(shù)據(jù):>");
	scanf("%d", &x);

	for (int i = 0; i < pq->size; i++)
	{
		if (pq->data[i] == x)
		{
			printf("所需查詢數(shù)據(jù)存在,下標(biāo)為:>%d\n", i);
			return;
		}
	}
	printf("找不到\n");

}



//排序順序表
void SeqListSort(SeqList* pq)
{
	CheckNull(pq);

	int option = 0;
	printf("輸入0為升序,1為降序:>");
	scanf("%d", &option);

	for (int i = 0; i < pq->size - 1; i++)
	{
		for (int j = 0; j < pq->size - i - 1; j++)
		{
			if (pq->data[j] > pq->data[j + 1])
			{
				SEQTYPE tmp = pq->data[j];
				pq->data[j] = pq->data[j + 1];
				pq->data[j + 1] = tmp;
			}
		}
	}

	if (option)
	{
		SeqListReverse(pq);
		return;
	}

}


//順序表反轉(zhuǎn)
void SeqListReverse(SeqList* pq)
{
	CheckNull(pq);

	int left = 0;
	int right = pq->size - 1;

	while (left < right)
	{
		SEQTYPE tmp = pq->data[left];
		pq->data[left] = pq->data[right];
		pq->data[right] = tmp;
		++left;
		--right;
	}

}


test.c

#include "SeqList.h"



void menu()
{
	printf("######################################################\n");
	printf("#####       1.  Print        2.  Insert          #####\n");
	printf("#####       3.  PushFront    4.  PushBack        #####\n");
	printf("#####       5.  PopFront     6.  PopBack         #####\n");
	printf("#####       7.  FindPos      8.  FindData        #####\n");
	printf("#####       9.  Modify       10. Erase           #####\n");
	printf("#####       11. EMPTY        12. Sort            #####\n");
	printf("#####       13. Reverse      0.  Exit            #####\n");
	printf("######################################################\n");
}

enum Option
{
	EXIT,
	PRINT,
	INSERT,
	PUSHFRONT,
	PUSHBACK,
	POPFRONT,
	POPBACK,
	FINDPOS,
	FINDDATA,
	MODIFY,
	ERASE,
	EMPTY,
	SORT,
	REVERSE,
};

int main()
{
	int option = 0;
	int posi = -1;

	SeqList s;

	SeqListInit(&s);

	do
	{
		menu();
		printf("請(qǐng)選擇:>");
		scanf("%d", &option);
		switch (option)
		{
		case PRINT:
			SeqListPrint(&s);
			break;

		case INSERT:
			SeqListInsert(&s, posi);
			break;

		case PUSHFRONT:
			SeqListPushFront(&s);
			break;

		case PUSHBACK:
			SeqListPushBack(&s);
			break;

		case POPFRONT:
			SeqListPophFront(&s);
			break;

		case POPBACK:
			SeqListPophBack(&s);
			break;

		case FINDPOS:
			SeqListFindPos(&s);
			break;

		case FINDDATA:
			SeqListFindData(&s);
			break;
		case MODIFY:
			SeqListModify(&s);
			break;

		case ERASE:
			SeqListErase(&s, posi);
			break;

		case EMPTY:
			SeqListDestory(&s);
			break;

		case SORT:
			SeqListSort(&s);
			break;

		case REVERSE:
			SeqListReverse(&s);
			break;

		case EXIT:
			SeqListDestory(&s);
			printf("退出\n");
			break;

		default:
			printf("請(qǐng)正確輸入\n");
			break;
		}
	} while (option);

	return 0;
}

SeqList.h

#pragma once

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <errno.h>
#include <string.h>


//

#define SEQTYPE int
typedef struct SeqList
{
	SEQTYPE* data;
	int size;		//有效數(shù)據(jù)個(gè)數(shù)
	int capacity;	//容量
}SeqList;

//初始化順序表
void SeqListInit(SeqList* pq);

//銷毀順序表
void SeqListDestory(SeqList* pq);

//打印順序表
void SeqListPrint(SeqList* pq);

//往順序表指定位置插入數(shù)據(jù)
void SeqListInsert(SeqList* pq, int pos);

//往順序表末位置插入數(shù)據(jù)
void SeqListPushBack(SeqList* pq);

//往順序表首位置插入數(shù)據(jù)
void SeqListPushFront(SeqList* pq);

//從順序表指定位置刪除數(shù)據(jù)
void SeqListErase(SeqList* pq, int pos);

//從順序表末位置刪除數(shù)據(jù)
void SeqListPophBack(SeqList* pq);

//從順序表首位置刪除數(shù)據(jù)
void SeqListPophFront(SeqList* pq);


//修改順序表指定位置數(shù)據(jù)
void SeqListModify(SeqList* pq);


//查找順序表指定位置數(shù)據(jù)
void SeqListFindPos(SeqList* pq);

//查找所需數(shù)據(jù)是否存在順序表中
void SeqListFindData(SeqList* pq);

//排序順序表
void SeqListSort(SeqList* pq);

//順序表反轉(zhuǎn)
void SeqListReverse(SeqList* pq);

總結(jié)

到此這篇關(guān)于C語言實(shí)現(xiàn)順序表的基本操作指南的文章就介紹到這了,更多相關(guān)C語言實(shí)現(xiàn)順序表基本操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++操作MySQL的實(shí)現(xiàn)示例

    C++操作MySQL的實(shí)現(xiàn)示例

    這篇文章主要介紹了C++操作MySQL的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • C語言數(shù)據(jù)結(jié)構(gòu)與算法之排序總結(jié)(一)

    C語言數(shù)據(jù)結(jié)構(gòu)與算法之排序總結(jié)(一)

    這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)與算法中的插入類和交換類的各種排序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2021-12-12
  • Visual?C++?6.0添加一個(gè)對(duì)話框的實(shí)現(xiàn)步驟

    Visual?C++?6.0添加一個(gè)對(duì)話框的實(shí)現(xiàn)步驟

    VC6.0是微軟公司推出的一款集成開發(fā)環(huán)境,本文主要介紹了Visual?C++?6.0添加一個(gè)對(duì)話框的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • 解決vscode下調(diào)試c/c++程序一閃而過的問題(Windows)

    解決vscode下調(diào)試c/c++程序一閃而過的問題(Windows)

    這篇文章主要介紹了解決vscode下調(diào)試c/c++程序一閃而過(Windows),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • C語言實(shí)現(xiàn)直角坐標(biāo)轉(zhuǎn)換為極坐標(biāo)的方法

    C語言實(shí)現(xiàn)直角坐標(biāo)轉(zhuǎn)換為極坐標(biāo)的方法

    這篇文章主要介紹了C語言實(shí)現(xiàn)直角坐標(biāo)轉(zhuǎn)換為極坐標(biāo)的方法,涉及C語言進(jìn)行三角函數(shù)與數(shù)值運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • 深入分析C++中聲明與定義的區(qū)別

    深入分析C++中聲明與定義的區(qū)別

    C++學(xué)了這么多年你知道為什么定義類時(shí),類的定義放在.h文件中,而類的實(shí)現(xiàn)放在cpp文件中。它們?yōu)槭裁茨軌蜿P(guān)聯(lián)到一起呢?你知道什么東西可以放在.h文件中,什么不能。什么東西又可以放在cpp文件中。如果你忘記了或是壓根就不明白,那么讀過此文你會(huì)清晰無比??!
    2014-09-09
  • C++指針和數(shù)組:字符和字符串、字符數(shù)組的關(guān)聯(lián)和區(qū)別

    C++指針和數(shù)組:字符和字符串、字符數(shù)組的關(guān)聯(lián)和區(qū)別

    字符串是一種重要的數(shù)據(jù)類型,但是c語言并沒有顯示的字符串?dāng)?shù)據(jù)類型,因?yàn)樽址宰址A康男问匠霈F(xiàn)或者存儲(chǔ)于字符數(shù)組中。在C++標(biāo)準(zhǔn)模板庫(STL)中提供了string類,實(shí)現(xiàn)了對(duì)字符串的封裝。
    2022-12-12
  • C語言指針入門學(xué)習(xí)面面觀

    C語言指針入門學(xué)習(xí)面面觀

    這篇文章主要介紹了C語言指針的一些基礎(chǔ)知識(shí),指針可以說是C語言入門學(xué)習(xí)中的頭等大事,文中從數(shù)組和函數(shù)等多方面剖析C中指針的作用,需要的朋友可以參考下
    2016-02-02
  • C語言題目:有多少張桌子--并查集

    C語言題目:有多少張桌子--并查集

    并查集是一種用于管理分組的數(shù)據(jù)結(jié)構(gòu)。它具備兩個(gè)操作:(1)查詢?cè)豠和元素b是否為同一組 (2) 將元素a和b合并為同一組,需要的朋友可以參考下
    2021-09-09
  • C++對(duì)cin輸入字符的判斷及分段函數(shù)處理方法示例

    C++對(duì)cin輸入字符的判斷及分段函數(shù)處理方法示例

    這篇文章主要介紹了C++對(duì)cin輸入字符的判斷及分段函數(shù)處理方法,結(jié)合實(shí)例形式分析了C++輸入判斷及處理相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09

最新評(píng)論

铅山县| 友谊县| 博罗县| 修水县| 盈江县| 濉溪县| 赤壁市| 阳新县| 宁远县| 新宁县| 南康市| 龙江县| 北川| 苗栗县| 辛集市| 乌鲁木齐县| 合川市| 勐海县| 瑞金市| 镶黄旗| 五寨县| 潼关县| 阳信县| 正定县| 麻江县| 黎川县| 桐庐县| 宜川县| 松溪县| 灵台县| 上杭县| 会宁县| 茂名市| 桓仁| 莱芜市| 吴堡县| 吴江市| 景谷| 河西区| 宣恩县| 英超|