成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

RobinTang / 1971人閱讀

摘要:創(chuàng)建一個(gè)結(jié)構(gòu)體用于存放順序表相關(guān)數(shù)據(jù)有效數(shù)據(jù)個(gè)數(shù)容量初始化順序表插入元素插入到表頭插入到指定位置插入到尾部先檢查容量是否夠用如果空間滿了,擴(kuò)容增

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

#define SEQTYPE inttypedef 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ù)和位置,空格隔開(kāi):>");		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ù),空格隔開(kāi):>");	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ù)和位置,空格隔開(kāi):>");		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ù),空格隔開(kāi):>");	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)
            
                     
             
               

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/122330.html

相關(guān)文章

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<