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

追夢之旅【數(shù)據結構篇】——詳解C語言動態(tài)實現(xiàn)順序表

這篇具有很好參考價值的文章主要介紹了追夢之旅【數(shù)據結構篇】——詳解C語言動態(tài)實現(xiàn)順序表。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


動態(tài)方式建立順序表 金良兵,追夢之旅【數(shù)據結構篇】,數(shù)據結構,c語言,算法

? ?
??博客昵稱:博客小夢
??最喜歡的座右銘:全神貫注的上吧!??!
??作者簡介:一名熱愛C/C++,算法等技術、喜愛運動、熱愛K歌、敢于追夢的小博主!

??博主小留言:哈嘍!??各位CSDN的uu們,我是你的博客好友小夢,希望我的文章可以給您帶來一定的幫助,話不多說,文章推上!歡迎大家在評論區(qū)嘮嗑指正,覺得好的話別忘了一鍵三連哦!??
動態(tài)方式建立順序表 金良兵,追夢之旅【數(shù)據結構篇】,數(shù)據結構,c語言,算法

前言??

? ? 哈嘍各位友友們??,我今天又學到了很多有趣的知識,現(xiàn)在迫不及待的想和大家分享一下!??我僅已此文,手把手帶領大家學習C語言動態(tài)實現(xiàn)順序表~ 都是精華內容,可不要錯過喲!??!??????

順序表概念及結構??

? ?在實現(xiàn)順序表之前,我們先要了解一下什么是順序表,它的大概結構是怎么樣的?其實順序表是用一段物理地址連續(xù)的存儲單元依次存儲數(shù)據元素線性結構,一般情況下采用數(shù)組存儲。在數(shù)組上完成數(shù)據的增刪查改。
動態(tài)方式建立順序表 金良兵,追夢之旅【數(shù)據結構篇】,數(shù)據結構,c語言,算法

順序表一般可以分為:

  1. 靜態(tài)順序表:使用定長數(shù)組存儲元素。
  2. 動態(tài)順序表:使用動態(tài)開辟的數(shù)組存儲。

其實靜態(tài)實現(xiàn)和動態(tài)實現(xiàn)的方法都差不多,但是相比而言動態(tài)實現(xiàn)的順序表的性能更優(yōu),實際應用的價值更大,比較靈活。

實現(xiàn)大概思路分析:

首先在頭文件先定義結構體和各個功能函數(shù)的聲明,并把有關的頭文件包含上去。各個函數(shù)如何實現(xiàn)的,主要是對各個函數(shù)的實現(xiàn),用到realloc動態(tài)開辟新節(jié)點的空間,用assert斷言確保指針有效,通過畫圖來幫助理清代碼實現(xiàn)的思路,指針的指向如何,要考慮哪些情況。然后再測試代碼中,將上述代碼都進行測試,顯示結果。

功能函數(shù)的具體實現(xiàn)分析:??

尾插函數(shù)具體實現(xiàn):

設計思路分析:

  • 首先設計一個檢查容量的函數(shù),保證有空間才能進行插入操作。
  • 將size為下標的元素改為x,別忘了將size++。
  • 或者實現(xiàn)任意插函數(shù)之后,而尾插作為其一種特殊情況,可以通過調用任意插函數(shù)來實現(xiàn)尾插的功能
//尾插
void SeqListPushBack(SL* p, DataSeqList x)
{
	/*SeqListCheckCapacity(p);
	p->arr[p->size] = x;
	p->size++;*/
	SeqListInsert(p, p->size, x);
}

尾刪函數(shù)具體實現(xiàn):

設計思路分析:

  • 先assert檢查順序表的元素個數(shù),如果沒有元素就不用再刪了
  • 直接將size減減即可。這樣其有效個數(shù)就少了一個,十分簡單。
  • 或者實現(xiàn)任意刪函數(shù)之后,而尾刪作為其一種特殊情況,可以通過調用任意刪函數(shù)來實現(xiàn)尾刪的功能
//尾刪
void SeqListPopBack(SL* p)
{
	/*assert(p->size);
	p->size--;*/
	SeqListEraes(p, p->size - 1);
}

頭插函數(shù)具體實現(xiàn):

設計思路分析:

  • 首先設計一個檢查容量的函數(shù),保證有空間才能進行插入操作。
  • 注意挪動數(shù)據如何挪,將控制條件控制好即可。
  • 將首元素改為x,別忘了將size++。
  • 或者實現(xiàn)任意插函數(shù)之后,而頭插作為其一種特殊情況,可以通過調用任意插函數(shù)來實現(xiàn)頭插的功能
//頭插
void SeqListPushFront(SL* p, DataSeqList x)
{
	//SeqListCheckCapacity(p);
	挪動數(shù)據
	//int end = p->size - 1;
	//while (end >= 0)
	//{
	//	p->arr[end + 1] = p->arr[end];
	//	end--;
	//}
	//p->arr[0] = x;
	//p->size++;
	SeqListInsert(p,0, x);
}

頭刪插函數(shù)具體實現(xiàn):

設計思路分析:

  • 先assert檢查順序表的元素個數(shù),如果沒有元素就不用再刪了。
  • 注意數(shù)據挪動,可以采用畫圖分析的方法控制挪動數(shù)據的控制條件。
  • 不要忘了將size-減減。
  • 或者實現(xiàn)任意刪函數(shù)之后,而頭刪作為其一種特殊情況,可以通過調用任意刪函數(shù)來實現(xiàn)頭刪的功能
//頭刪
void SeqListPopFront(SL* p)
{
	刪完就不用刪了
	//assert(p->size);
	//int begin = 1;
	//while (begin < p->size)
	//{
	//	p->arr[begin - 1] = p->arr[begin];
	//	begin++;
	//}
	//p->size--;
	SeqListEraes(p, 0);
}

任意插函數(shù)具體實現(xiàn):

設計思路分析:

  • 先判斷容量,有空間才進行插入操作。
  • 檢查插入的合法性,在pos >= 0 && pos <= p->size 的范圍才能進行插入
  • 注意數(shù)據挪動,可以采用畫圖分析的方法控制挪動數(shù)據的控制條件。
  • 別忘了將size加加
//任意插
void SeqListInsert(SL* p,int pos ,DataSeqList x)
{
	SeqListCheckCapacity(p);
	assert(pos >= 0 && pos <= p->size);
	int end = p->size - 1;
	while (end >= pos)
	{
		p->arr[end + 1] = p->arr[end];
		end--;
	}
	p->arr[pos] = x;
	p->size++;

}

任意刪函數(shù)具體實現(xiàn):

設計思路分析:

  • 先判斷順序表有沒有數(shù)據,沒有就不用刪了。
  • 檢查刪的位置的合法性,在pos >= 0 && pos < p->size的范圍才能進行刪除。
  • 注意數(shù)據挪動,可以采用畫圖分析的方法控制挪動數(shù)據的控制條件。
  • 別忘了將size減減。
//任意刪
void SeqListEraes(SL* p, int pos)
{
	//刪完就不用刪了
	assert(p->size);
	//刪的合法性判斷
	assert(pos >= 0 && pos < p->size);
	int begin = pos+1;
	while (begin < p->size)
	{
		p->arr[begin - 1] = p->arr[begin];
		begin++;
	}
	p->size--;
}

銷毀順序表函數(shù)具體實現(xiàn):

設計思路分析:
因為順序表的空間建立是動態(tài)開辟的,動態(tài)開辟的空間需要手動free釋放

/銷毀
void SeqListDestory(SL* p)
{
	free(p->arr);
	p->arr = NULL;
	p->capacity = p->size = 0;
}

查找函數(shù)具體實現(xiàn):

設計思路分析:
這個比較簡單,直接寫個循環(huán)遍歷一遍,找到了x就返回它的下標,找不到返回-1.

//查找
int SeqListFind(SL* p, DataSeqList x)
{
	assert(p);
	for (int i = 0; i < p->size; i++)
	{
		if (p->arr[i] == x)
		{
			return i;
		}
	}
	return -1;
}

檢查容量函數(shù)具體實現(xiàn):

設計思路分析:

  • 分為沒有空間和空間滿了兩種情況進行。
  • 如果沒有空間,就顯動態(tài)分配四個數(shù)據大小的空間。
  • 如果空間存儲滿了,就動態(tài)擴容到原來的2倍空間。
//檢查容量
void SeqListCheckCapacity(SL* p)
{
	if (p->size == p->capacity)
	{
		int newcapacity = p->capacity == 0 ? 4 : p->capacity * 2;
		DataSeqList* tem = realloc(p->arr, newcapacity * sizeof(DataSeqList));
		assert(tem);
		p->arr = tem;
		p->capacity = newcapacity;
	}
}

初始化函數(shù)具體實現(xiàn):

設計思路分析:
將p->arr = NULL;p->capacity = p->size = 0;

//初始化
void SeqListInit(SL* p)
{
	assert(p);
	p->arr = NULL;
	p->capacity = p->size = 0;
}

打印函數(shù)具體實現(xiàn):

設計思路分析:
這個比較簡單,直接寫個循環(huán)遍歷一遍打印即可。

//打印
void SeqListPrintf(SL* p)
{
	int i = 0;
	for (i = 0; i < p->size; i++)
	{
		printf("%d ", p->arr[i]);
	}
	printf("\n");
}

頭文件全部源碼分享??

這里負責函數(shù)功能的聲明和庫函數(shù)頭文件的包含,寫任何一個項目時,可以先把頭文件編寫好,也就是理清一下項目需要實現(xiàn)哪些功能函數(shù),整理一下項目的整體思路。

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

#define DataSeqList int

typedef struct SeqList
{
	DataSeqList* arr;
	int size;
	int capacity;
}SL;

//初始化
void SeqListInit(SL* p);
//尾插
void SeqListPushBack(SL* p, DataSeqList x);
//尾刪
void SeqListPopBack(SL* p);
//頭插
void SeqListPushFront(SL* p, DataSeqList x);
//頭刪
void SeqListPopFront(SL* p);
//任意插
void SeqListInsert(SL* p, int pos, DataSeqList x);
//任意刪
void SeqListEraes(SL* p, int pos);
//打印
void SeqListPrintf(SL* p);
//銷毀
void SeqListDestory(SL* p);
//查找
int SeqListFind(SL* p, DataSeqList x);
//檢查容量
void SeqListCheckCapacity(SL* p);

功能文件全部源碼分享??


#include"SeqList.h"

//初始化
void SeqListInit(SL* p)
{
	assert(p);
	p->arr = NULL;
	p->capacity = p->size = 0;
}

//尾插- 會遇到三種情況
// 1 - 沒有空間    2 - 空間不足,要擴容(查容量)  3 - 空間足夠,插入數(shù)據

//檢查容量
void SeqListCheckCapacity(SL* p)
{
	if (p->size == p->capacity)
	{
		int newcapacity = p->capacity == 0 ? 4 : p->capacity * 2;
		DataSeqList* tem = realloc(p->arr, newcapacity * sizeof(DataSeqList));
		assert(tem);
		p->arr = tem;
		p->capacity = newcapacity;
	}
}

//打印
void SeqListPrintf(SL* p)
{
	int i = 0;
	for (i = 0; i < p->size; i++)
	{
		printf("%d ", p->arr[i]);
	}
	printf("\n");
}

//尾插
void SeqListPushBack(SL* p, DataSeqList x)
{
	/*SeqListCheckCapacity(p);
	p->arr[p->size] = x;
	p->size++;*/
	SeqListInsert(p, p->size, x);
}

//尾刪
void SeqListPopBack(SL* p)
{
	/*assert(p->size);
	p->size--;*/
	SeqListEraes(p, p->size - 1);
}
//頭插
void SeqListPushFront(SL* p, DataSeqList x)
{
	//SeqListCheckCapacity(p);
	挪動數(shù)據
	//int end = p->size - 1;
	//while (end >= 0)
	//{
	//	p->arr[end + 1] = p->arr[end];
	//	end--;
	//}
	//p->arr[0] = x;
	//p->size++;
	SeqListInsert(p,0, x);
}
//頭刪
void SeqListPopFront(SL* p)
{
	刪完就不用刪了
	//assert(p->size);
	//int begin = 1;
	//while (begin < p->size)
	//{
	//	p->arr[begin - 1] = p->arr[begin];
	//	begin++;
	//}
	//p->size--;
	SeqListEraes(p, 0);
}

//任意插
void SeqListInsert(SL* p,int pos ,DataSeqList x)
{
	SeqListCheckCapacity(p);
	assert(pos >= 0 && pos <= p->size);
	int end = p->size - 1;
	while (end >= pos)
	{
		p->arr[end + 1] = p->arr[end];
		end--;
	}
	p->arr[pos] = x;
	p->size++;

}
//任意刪
void SeqListEraes(SL* p, int pos)
{
	//刪完就不用刪了
	assert(p->size);
	//刪的合法性判斷
	assert(pos >= 0 && pos < p->size);
	int begin = pos+1;
	while (begin < p->size)
	{
		p->arr[begin - 1] = p->arr[begin];
		begin++;
	}
	p->size--;
}

//銷毀
void SeqListDestory(SL* p)
{
	free(p->arr);
	p->arr = NULL;
	p->capacity = p->size = 0;
}

//查找
int SeqListFind(SL* p, DataSeqList x)
{
	assert(p);
	for (int i = 0; i < p->size; i++)
	{
		if (p->arr[i] == x)
		{
			return i;
		}
	}
	return -1;
}

測試文件代碼??

#define _CRT_SECURE_NO_WARNINGS 1

#include"SeqList.h"

void test1()
{
	SL s;
	SeqListInit(&s);
	SeqListPushBack(&s, 1);
	SeqListPushBack(&s, 2);
	SeqListPushBack(&s, 3);
	SeqListPushBack(&s, 4);
	SeqListPushBack(&s, 5);
	SeqListPrintf(&s);
	SeqListPopBack(&s);
	SeqListPopBack(&s);
	SeqListPrintf(&s);

	SeqListPushFront(&s, 10);
	SeqListPushFront(&s, 20);
	SeqListPushFront(&s, 30);
	SeqListPushFront(&s, 40);
	SeqListPrintf(&s);

	SeqListPopFront(&s);
	SeqListPopFront(&s);
	SeqListPrintf(&s);
	SeqListDestory(&s);



}

void test2()
{
	SL s;
	SeqListInit(&s);
	SeqListPushBack(&s, 1);
	SeqListPushBack(&s, 2);
	SeqListPushBack(&s, 3);
	SeqListPushBack(&s, 4);
	SeqListPushBack(&s, 5);
	SeqListPrintf(&s);
	SeqListInsert(&s, 3, 30);
	SeqListPrintf(&s);
	SeqListEraes(&s, 3);
	SeqListEraes(&s, 2);
	SeqListPrintf(&s);

	SeqListDestory(&s);
}
void test3()
{
	SL s;
	SeqListInit(&s);
	SeqListPushBack(&s, 1);
	SeqListPushBack(&s, 2);
	SeqListPushBack(&s, 3);
	SeqListPushBack(&s, 4);
	SeqListPushBack(&s, 5);
	SeqListPrintf(&s);
	SeqListInsert(&s, 3, 30);
	SeqListEraes(&s, 2);
	SeqListPrintf(&s);
	SeqListDestory(&s);
}

void test4()
{
	SL s;
	printf("尾插數(shù)據1,2,3,4,5\n");
	SeqListInit(&s);
	SeqListPushBack(&s, 1);
	SeqListPushBack(&s, 2);
	SeqListPushBack(&s, 3);
	SeqListPushBack(&s, 4);
	SeqListPushBack(&s, 5);
	SeqListPrintf(&s);
	printf("頭插數(shù)據10, 20 , 30\n");
	SeqListPushFront(&s, 10);
	SeqListPushFront(&s, 20);
	SeqListPushFront(&s, 30);
	SeqListPrintf(&s);
	SeqListDestory(&s);
}

int main()
{

	//test1();
	//test2();
	//test3();
	test4();
	return 0;
}

部分功能測試結果圖:
動態(tài)方式建立順序表 金良兵,追夢之旅【數(shù)據結構篇】,數(shù)據結構,c語言,算法

總結撒花??

? ?本篇文章旨在分享詳解C語言動態(tài)實現(xiàn)順序表。希望大家通過閱讀此文有所收獲!??如果我寫的有什么不好之處,請在文章下方給出你寶貴的意見??。如果覺得我寫的好的話請點個贊贊和關注哦~??????文章來源地址http://www.zghlxwxcb.cn/news/detail-819941.html

到了這里,關于追夢之旅【數(shù)據結構篇】——詳解C語言動態(tài)實現(xiàn)順序表的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

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

領支付寶紅包贊助服務器費用

相關文章

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包