資料結構與演算法_連結串列
阿新 • • 發佈:2021-02-08
連結串列基本操作函式
**連結串列框架**
typedef struct LNode//結構體宣告不能為匿名
{
int num; //資料
struct LNode* next;//地址
}LNode,*LinkList;
連結串列的基本結構,num中存放該結點的資料,next存放下個結點地址的指標。
**連結串列初始化**
/*初始化*/
LinkList CreatLinkList(int *data,int len)
{
LinkList head,pre;//head為頭結點,pre是儲存當前結點的前驅
LinkList node; //node為新開闢的結點
node=(LinkList)malloc(sizeof(LinkList));
head = node;
head->next = NULL;//頭結點不存值,只存地址
pre = head;
for (int i = 0; i < len; i++)
{
node = (LinkList)malloc(sizeof(LinkList));
node->num = data[i];
node->next = NULL;
pre->next = node;//第一次迴圈時將結點地址存入頭結點的next中
pre = node; //這兩句將當前結點的地址存入上個地址的next中
}
return head;
}
定義的函式為LinkList型別,用於返回同樣型別的頭結點指標,連結串列通過頭結點來呼叫。
連結串列的生成過程為用malloc函式開闢地址,開闢新的結點node,給結點node中的num賦值,並且用pre指標存放上個結點node,然後將它的next指向當前結點node,從而實現next中地址的依次儲存以及num的賦值。此過程結束後,連結串列生成,返回頭結點用來呼叫。
**結點的定義方法**
Linklist p;
p = (LinkList)malloc(sizeof(LinkList));
//分配記憶體(結點先定義再分配記憶體)
//單純的指標如頭結點是不用分配數值的,
//故不用malloc函式分配記憶體
**插入函式LinkListInsert(LinkList L,int i,LinkList L1);**
void LinkListInsert(LinkList L, int i, LinkList L1)
{
int k=0;
while (k < i-1)//迴圈結束條件:k=i-1時迴圈結束,指標L
{ //指向第i-1個結點
L = L->next;//連結串列指標向後遍歷
k++;
}
L1->next = L->next;//結點L1指向第i個結點
L->next = L1;//第i-1個結點指向結點L1
}
在原連結串列第i個位置插入新結點L1,需要將第i-1個結點找出來,將它的next賦給L1的next,再將它的next指向L1即可,如圖:
L1插入前
L1插入後
**刪除函式LinkListDelete(LinkList L,int i);**
void LinkListDelete(LinkList L,int i)
{
int k = 0; //將第i-1個結點指向第i+1個結點,然後釋放掉第i個結點
while (k < i-1)//迴圈結束條件:k=i-1時迴圈結束
{
L = L->next;
k++;
}
L->next = L->next->next;
}
刪除前
刪除後
**連結串列的搜尋int LinkListSearch(LinkList L,int i);**
int LinkListSearch(LinkList L,int i)//返回第i個結點所存數值
{
int k = 0;
while (k < i)//迴圈結束條件:k=i時迴圈結束
{
L = L->next;
k++;
}
return L->num;
}