C語言之鍊錶

2021-10-01 01:26:41 字數 2841 閱讀 8082

鍊錶的觀念:

鍊錶是一種物理儲存上非連續,資料元素的邏輯順序通過鍊錶中的指標鏈結次序,實現的一種線性儲存結構。

特點:鍊錶由一系列節點(鍊錶中每乙個元素就稱為節點)組成,節點在執行時動態生成(malloc),每個節點包括兩部分:乙個是儲存資料元素的資料域;乙個是儲存下乙個節點位址的指標域

定義乙個鍊錶:

typedef struct student

stu;

接下來就是建立鍊錶:

/*

鍊錶的建立

引數: p_head:鍊錶的頭結點

p_new:需要新增的新節點

返回值:無

*/void link_creat_head(stu **p_head,stu *p_new)//可能鍊錶最初是空,會改變頭結點,因此p_head為指標的指標

else//第二次及以後加入鍊錶時,先要找到鍊錶尾部,然後再加入p_new到尾部

p_mov->next=p_new;//將新申請的節點加入鍊錶

p_new->next=null;

}}

接下來就是鍊錶的遍歷:

/*

鍊錶的遍歷

引數: head:頭結點

返回值:無

*/void link_print(stu *head)//遍歷不會改變頭指標的指向,因此定義為指標即可

}

有了這兩個函式就可以進行測試了:

int main()

link_print(head);

return 0;

}

但是有了這兩個函式還是不夠的,鍊錶申請了空間,那但我們要刪除鍊錶的時候應該怎麼實現呢?

/*

鍊錶的釋放,即刪除所有節點

引數: head:頭結點

返回值:無

*/void link_free(stu **head)

}

這裡將所有的節點都釋放了,那麼釋放指定節點呢?根據學號或者姓名來進行釋放是有所區別的,這裡分別用兩個函式進行說明:

/*

刪除鍊錶指定節點,根據學號

引數: p_head:頭結點

num:學生的學號

返回值:無

*/void link_delete_num(stu **p_head,int num)

while(pb->num!=num&&pb->next!=null)//迴圈找要刪除的節點

if (pb->num==num)//找到了節點

else

free(pb);//記得釋放所申請的空間

} else

}

下面是根據姓名進行釋放:

/*

刪除鍊錶指定節點,根據姓名

引數: p_head:頭結點

name:學生的姓名

返回值:無

*/void link_delete_name(stu **p_head,char *name)

while((strcmp(pb->name,name)!=0)&&pb->next!=null)//迴圈找要刪除的節點

if ((strcmp(pb->name,name)==0))//找到了節點

else

free(pb);

} else

}

當我們需要查詢節點的時候,應該怎麼實現呢?同刪除操作一樣,查詢的時候根據姓名或者學號是有區別的:

/*

鍊錶的查詢,根據學號查詢

引數: head:頭結點

num:學號

返回值:所找到的節點,沒有找到就返回空

*/stu * link_search_num(stu *head,int num)

p_mov=p_mov->next;

} return null;//沒有找到

}

接下來是根據姓名查詢:

/*

鍊錶的查詢,根據學生姓名查詢

引數: head:頭結點

name:學生姓名

返回值:所找到的節點,沒有找到就返回空

*/stu * link_search_name(stu *head,char *name)

p_mov=p_mov->next;

} return null;//沒有找到

}

接下來就是鍊錶的排序了,這裡採用氣泡排序法思想:

/*

鍊錶的排序

引數: p_head:頭結點

返回值:無

*/void link_order(stu **p_head)

if((*p_head)->next==null)//鍊錶只有乙個節點,也無需排序,提示

while(pf->next!=null)//以pf指向的節點為基準節點

pb=pb->next;

} pf=pf->next;

}}

接下來就是最後的,也是很多公司喜歡出的面試題—鍊錶的逆序,這個逆序是通過改變指標域的指向來實現,而不是將前置資料域和後置資料域進行交換得到,廢話不多說:

/*

鍊錶的逆序

引數: head:頭結點

返回值:

結果修改之後的頭結點,這個時候的頭結點為變化之前的尾節點

*/stu *link_reverse(stu *head)

head->next=null;

head=pf;

return head;

}

c語言 鍊錶 C語言之鍊錶入門

鍊錶三要素 1 頭指標 head 是用來說明鍊錶開始了,頭指標就代表鍊錶本身 所以以後要訪問鍊錶,就要訪問頭指標 2 結點 node 鍊錶中每乙個結構體變數 3 尾指標 用來說明鍊錶的結束 它是乙個空指標,null include includetypedef struct stud 定義了乙個結構...

C語言之迴圈鍊錶

一 迴圈鍊錶 迴圈鍊錶是與單鏈表一樣,是一種鏈式的儲存結構,所不同的是,迴圈鍊錶的最後乙個結點的指標是指向該迴圈鍊錶的第乙個結點或者表頭結點,從而構成乙個環形的鏈。迴圈鍊錶的運算與單鏈表的運算基本一致。所不同的有以下幾點 1 在建立乙個迴圈鍊錶時,必須使其最後乙個結點的指標指向表頭結點,而不是象單鏈...

C語言 之鍊錶操作

常見資料結構有 表棧 佇列樹鍊錶相對於陣列有很多優點,現在總結一下鍊錶的常用操作。1.單鏈表新增節點 include include includestruct list node typedef struct list node list one list one head null 定義乙個全域...