C數(shù)據(jù)結(jié)構(gòu)之單鏈表詳細(xì)示例分析
#include <stdio.h>
#include <stdlib.h>
typedef struct type
{
int num;
struct type *next;
}TYPE;
//=============================================================
// 語法格式: TYPE *init_link_head(int n)
// 實(shí)現(xiàn)功能: 從頭到尾,正序創(chuàng)建一個(gè)具有n個(gè)節(jié)點(diǎn)的鏈表,并對(duì)其值進(jìn)行初始化
// 參數(shù): n: 鏈表的長(zhǎng)度,即節(jié)點(diǎn)的個(gè)數(shù)
// 返回值: 所創(chuàng)建鏈表的首地址
//=============================================================
TYPE *init_link_head(int n)
{
int i;
TYPE *phead = NULL, *pf = NULL, *pi = NULL;
for(i=0; i<n; i++)
{
pi = (TYPE *)malloc(sizeof(TYPE));
printf("please inout num:\n");
scanf("%d",&pi->num);
if(i == 0)
pf = phead = pi;
else
{
pf->next = pi;
pf = pi;
}
pi->next = NULL;
}
return phead;
}
//=============================================================
// 語法格式: TYPE *init_link_end(int n )
// 實(shí)現(xiàn)功能: 從尾到頭,倒序創(chuàng)建一個(gè)具有n個(gè)節(jié)點(diǎn)的鏈表,并對(duì)其值進(jìn)行初始化
// 參數(shù): n: 鏈表的長(zhǎng)度,即節(jié)點(diǎn)的個(gè)數(shù)
// 返回值: 所創(chuàng)建鏈表的首地址
//=============================================================
TYPE *init_link_end(int n )
{
TYPE *phead = NULL, *pi = NULL;
int i ;
for(i=0; i<n; i++)
{
pi = (TYPE *)malloc(sizeof(TYPE));
printf("please inout num:\n");
scanf("%d",&pi->num);
if(i == 0)
pi->next = NULL;
else
pi->next = phead;
phead = pi;
}
return phead;
}
//=============================================================
// 語法格式: insert_link(TYPE * phead,TYPE * pi)
// 實(shí)現(xiàn)功能: 將新申請(qǐng)的節(jié)點(diǎn)加入到指定鏈表中
// 參數(shù): *phead:待插入鏈表
// * pi:帶插入節(jié)點(diǎn)
// 返回值: 插入指定節(jié)點(diǎn)后的新鏈表首址
//=============================================================
TYPE * insert_link(TYPE *phead, TYPE *pi)
{
TYPE *pb, *pf;
pb = phead;
if(phead == NULL)
{
phead = pi;
phead->next = NULL;
}
else
{
while((pi->num > pb->num) && (pb->next != NULL))
{
pf = pb;
pb = pb->next;
}
if(pi->num <= pb->num)
{
if(pb == phead)
{
pi->next = phead;
phead = pi;
}
else
{
pf->next = pi;
pi->next = pb;
}
}
else
{
pi->next = NULL;
pb->next = pi;
}
}
return phead;
}
//=============================================================
// 語法格式: delete_link(TYPE * phead,int num)
// 實(shí)現(xiàn)功能: 刪除給定序號(hào)所指向的節(jié)點(diǎn)
// 參數(shù): *phead:待刪除鏈表
// num: 所需刪除的節(jié)點(diǎn)
// 返回值: 刪除指定節(jié)點(diǎn)后的新鏈表首址
//=============================================================
TYPE * delete_link(TYPE *phead, int num)
{
TYPE *pf;
TYPE *pb;
if(phead == NULL)
{
printf("\nempty link\n");
return NULL;
}
pb = phead;
while((pb->num != num) && pb->next != NULL)
{
pf = pb;
pb = pb->next ;
}
if(pb->num == num)
{
if(pb == phead)
phead = phead->next;
else
pf->next = pb->next;
free(pb);
printf("the node is deleted\n");
}
else
printf("the node not found\n");
return phead;
}
//=============================================================
// 語法格式: print_link(TYPE * phead)
// 實(shí)現(xiàn)功能: 打印指定鏈表中的全部節(jié)點(diǎn)數(shù)據(jù)
// 參數(shù): *phead:待打印的鏈表首址
// 返回值: 無
//=============================================================
void print_link(TYPE *phead)
{
TYPE *temp = phead;
while( temp != NULL)
{
printf(" %d ",temp->num);
temp = temp->next;
}
}
//=============================================================
// 語法格式: search_num(TYPE * phead,int num)
// 實(shí)現(xiàn)功能: 在指定的鏈表中,按姓名查找指定元素
// 參數(shù): phead:待查找的鏈?zhǔn)字?,num需要查找的字符串
// 返回值: 無
//=============================================================
void search_num(TYPE *phead, int num)
{
TYPE *temp = phead;
while(temp != NULL)
{
if(temp->num == num)
printf(" %d ",num);
temp = temp->next;
}
if(temp == NULL)
printf("node not been found\n");
}
//=============================================================
// 語法格式: order_link(TYPE * phead)
// 實(shí)現(xiàn)功能: 采用冒泡法,對(duì)指定鏈表按序號(hào)進(jìn)行排序(交換數(shù)據(jù)域)
// 參數(shù): phead:待排序的鏈?zhǔn)字?BR>// 返回值: 排好序的鏈表phead指針
//=============================================================
TYPE *order_link(TYPE *phead)
{
TYPE *pb,*pf,temp;
pb = pf =phead;
if(phead == NULL)
return NULL;
while(pb->next != NULL)
{
pf = pb->next;
while(pf != NULL)
{
if(pb->num > pf->num)
{
temp = *pb;
*pb = *pf;
*pf = temp;
temp.next = pb->next;
pb->next = pf->next;
pf->next = temp.next;
}
pf = pf->next;
}
pb = pb->next;
}
return phead;
}
//=============================================================
// 語法格式: reverse_link(TYPE * phead)
// 實(shí)現(xiàn)功能: 對(duì)給定鏈表按序號(hào)進(jìn)行倒序排序
// 參數(shù): phead:待排序的鏈?zhǔn)字?BR>// 返回值: 排好序的鏈表phead指針
//=============================================================
TYPE *reverse_link(TYPE *phead)
{
TYPE *pb, *pf, *temp;
pb = phead;
pf = pb->next;
while(pf != NULL)
{
temp = pf->next;
pf->next = pb;
pb = pf;
pf = temp;
}
phead->next = NULL;
phead = pb;
return phead;
}
//=============================================================
// 語法格式: free_all(TYPE * phead)
// 實(shí)現(xiàn)功能: 釋放鏈表中所有的節(jié)點(diǎn)
// 參數(shù): phead:待釋放的鏈表首址
// 返回值: 無
//=============================================================
void free_all(TYPE *phead)
{
TYPE *p;
while(phead!=NULL)
{
p=phead->next;
free(phead);
phead=p;
}
}
//=============================================================
// 語法格式: merge(TYPE *p1,TYPE *p2)
// 實(shí)現(xiàn)功能: 對(duì)兩個(gè)鏈表進(jìn)行升序合并
// 參數(shù): p1,p2兩個(gè)代合并的鏈表
// 返回值: 合并后的鏈表
//=============================================================
TYPE *merge_link(TYPE *p1, TYPE *p2)
{
TYPE *p, *phead;
if(p1 == NULL)
return p2;
if(p2 == NULL)
return p1;
if(p1->num < p2->num)
{
phead = p = p1;
p1 = p1->next;
}
else
{
phead = p = p2;
p2 = p2->next;
}
while(p1 != NULL && p2 != NULL)
{
if(p1->num < p2->num)
{
p->next = p1;
p = p1;
p1 = p1->next;
}
else
{
p->next = p2;
p = p2;
p2 = p2->next;
}
}
if(p1 != NULL)
p->next = p1;
else
p->next = p2;
return phead;
}
//=============================================================
// 實(shí)現(xiàn)方法: 運(yùn)用遞歸
// 語法格式: merge(TYPE *p1,TYPE *p2)
// 實(shí)現(xiàn)功能: 對(duì)兩個(gè)鏈表進(jìn)行升序合并
// 參數(shù): p1,p2兩個(gè)代合并的鏈表
// 返回值: 合并后的鏈表
//=============================================================
TYPE * merge_link_self(TYPE *p1, TYPE *p2)
{
TYPE *phead = NULL;
if(p1 == NULL)
return p2;
if (p2 == NULL)
return p1;
if(p1->num < p2->num)
{
phead = p1;
phead->next =merge_link(p1->next, p2);
}
else
{
phead = p2;
phead->next = merge_link(p1, p2->next);
}
return phead;
}
int main(void)
{
return 0;
}
上一篇:先序遍歷二叉樹的遞歸實(shí)現(xiàn)與非遞歸實(shí)現(xiàn)深入解析
欄 目:C語言
下一篇:C++運(yùn)算符重載 成員函數(shù)與友元函數(shù)詳解
本文標(biāo)題:C數(shù)據(jù)結(jié)構(gòu)之單鏈表詳細(xì)示例分析
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/4242.html
您可能感興趣的文章
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)- 解析最少換車次數(shù)的問題詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-用棧實(shí)現(xiàn)表達(dá)式求值的方法詳解
- 01-10深入理解鏈表的各類操作詳解
- 01-10用C語言實(shí)現(xiàn)單鏈表的各種操作(一)
- 01-10用C語言實(shí)現(xiàn)單鏈表的各種操作(二)
- 01-10深入單鏈表的快速排序詳解
- 01-10探討:將兩個(gè)鏈表非降序合并為一個(gè)鏈表并依然有序的實(shí)現(xiàn)方法
- 01-10C++ 構(gòu)造雙向鏈表的實(shí)現(xiàn)代碼
- 01-10用C++實(shí)現(xiàn)單向循環(huán)鏈表的解決方法
- 01-10如何用C++實(shí)現(xiàn)雙向循環(huán)鏈表


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10delphi制作wav文件的方法
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實(shí)例總結(jié)