數據結構(C語言版)


數據結構(C語言版)

緒論

1、在計算機運行過程中,如何合理的組織數據、高效的處理數據,這就是數據結構

2、數據結構包括兩個方面的內容:數據的邏輯結構和存儲結構
① 邏輯結構是從邏輯關系上描述數據,通常有四類:集合、線性、樹狀和圖狀
② 存儲結構是邏輯結構在計算機中的存儲表示,有兩類:順序和鏈式

3、抽象數據類型(ADT):提供類型屬性和相關操作的抽象描述,下面是鏈表的抽象數據類型的定義,定義完抽象數據類型就可以進行接口的開發和實現了

4、算法是為了解決某類問題而規定的操作方法
① 算法具有五個特性:有窮性、確定性、可行性、輸入和輸出。
② 算法的優劣應該從以下四方面來評價:正確性、可讀性、健壯性和高效性

5、算法的優劣主要是時間復雜度和空間復雜度

鏈表

建立抽象

類型名:   簡單鏈表
類型屬性: 可以存儲一系列項
類型操作: 初始化鏈表為空
			確定鏈表為空
			確定鏈表已滿
			確定鏈表中的項數
			在鏈表末尾添加項
		  遍歷鏈表,處理鏈表中的項
		  	清空鏈表

建立接口

這個鏈表中主要分為兩部分:表示數據的結構和操作數據的函數

在鏈表中每個鏈結叫做節點(node),每個節點包含了存儲內容的信息和指向下一個節點的指針,首先對節點進行定義

struct LinkNode
{
	void * data;
	struct LinkNode * next;
};

下面對鏈表結構體進行定義,包括節點信息和鏈表的長度信息

struct LList
{
	//頭節點
	struct LinkNode pHeader;
	//鏈表長度
	int m_size;
};
//使用typedef定義一個空指針作為鏈表的返回值
typedef void * LinkList;

以上,關於抽象數據類型的屬性部分定義完成,接下來對類型的操作方法進行定義

//初始化鏈表
LinkList init_LinkList()
//插入鏈表
void insert_LinkList(LinkList list, int pos, void * data)
//遍歷鏈表
void foreach_LinkList(LinkList list, void(*myForeach)(void *))
//刪除鏈表  按位置
void removeByPos_LinkList(LinkList list, int pos)

實現接口

void init_LinkList()
{
    struct LList * mylist = malloc(sizeof(strict LList))
    
    if(mylist == NULL){return NULL;}
    
    mylist->pHeader.data = NULL;
    mylist->pHeader.next = NULL;
    mylist->m_size = 0;
    
    return mylist;
}

void insert_LinkList(LinkList list, int pos, void * data)
{
    if(list == NULL){return;}
    if(data == NULL){return;}
    struct LList *mylist = list;
    if(pos<0 || pos>mylist->m_size){pos = mylist->m_size;}
    
    struct LinkNode * pCurrent = &mylist->pHeader;
    for(int i=0; i<pos; i++){pCurrent = pCurrent->next;}
    
    struct LinkNode * newNode = malloc(sizeof(struct LinkNode));
    neNode->data = data;
    neNode->next = NULL;
    
    newNode->next = pCurrent->next;
    pCurrent->next = pCurrent;
    
    mylist->m_size++;    
}

void foreach_LinkList(LinkList list, void(*myForeach)(void *))
{
	if (list ==NULL){return;}

	struct LList * mylist = list;

	struct LinkNode* pCurrent = mylist->pHeader.next;

	for (int i = 0; i < mylist->m_size;i++)
	{
		myForeach(pCurrent->data);
		pCurrent = pCurrent->next;
	}
}

void removeByPos_LinkList(LinkList list, int pos)
{
	if ( list == NULL){return;}

	struct LList * mylist = list;

	if (pos < 0 || pos > mylist->m_size - 1){return;}

	struct LinkNode * pCurrent = &mylist->pHeader;
	for (int i = 0; i < pos;i++){pCurrent = pCurrent->next;}

	struct LinkNode * pDel = pCurrent->next;

	pCurrent->next = pDel->next;

	free(pDel);
	pDel = NULL;

	mylist->m_size--;
}



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM