數據結構(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--;
}