C數(shù)據(jù)結(jié)構(gòu)之單鏈表詳細(xì)示例分析
更新時(shí)間:2013年08月13日 09:28:04 作者:
以下是對(duì)C語(yǔ)言中的單鏈表進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下
復(fù)制代碼 代碼如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct type
{
int num;
struct type *next;
}TYPE;
//=============================================================
// 語(yǔ)法格式: 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;
}
//=============================================================
// 語(yǔ)法格式: 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;
}
//=============================================================
// 語(yǔ)法格式: 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;
}
//=============================================================
// 語(yǔ)法格式: 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;
}
//=============================================================
// 語(yǔ)法格式: print_link(TYPE * phead)
// 實(shí)現(xiàn)功能: 打印指定鏈表中的全部節(jié)點(diǎn)數(shù)據(jù)
// 參數(shù): *phead:待打印的鏈表首址
// 返回值: 無(wú)
//=============================================================
void print_link(TYPE *phead)
{
TYPE *temp = phead;
while( temp != NULL)
{
printf(" %d ",temp->num);
temp = temp->next;
}
}
//=============================================================
// 語(yǔ)法格式: search_num(TYPE * phead,int num)
// 實(shí)現(xiàn)功能: 在指定的鏈表中,按姓名查找指定元素
// 參數(shù): phead:待查找的鏈?zhǔn)字?,num需要查找的字符串
// 返回值: 無(wú)
//=============================================================
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");
}
//=============================================================
// 語(yǔ)法格式: 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;
}
//=============================================================
// 語(yǔ)法格式: 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;
}
//=============================================================
// 語(yǔ)法格式: free_all(TYPE * phead)
// 實(shí)現(xiàn)功能: 釋放鏈表中所有的節(jié)點(diǎn)
// 參數(shù): phead:待釋放的鏈表首址
// 返回值: 無(wú)
//=============================================================
void free_all(TYPE *phead)
{
TYPE *p;
while(phead!=NULL)
{
p=phead->next;
free(phead);
phead=p;
}
}
//=============================================================
// 語(yǔ)法格式: 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)用遞歸
// 語(yǔ)法格式: 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;
}
您可能感興趣的文章:
- C語(yǔ)言創(chuàng)建和操作單鏈表數(shù)據(jù)結(jié)構(gòu)的實(shí)例教程
- C#數(shù)據(jù)結(jié)構(gòu)之雙向鏈表(DbLinkList)實(shí)例詳解
- C#數(shù)據(jù)結(jié)構(gòu)之單鏈表(LinkList)實(shí)例詳解
- JavaScript中數(shù)據(jù)結(jié)構(gòu)與算法(三):鏈表
- java數(shù)據(jù)結(jié)構(gòu)之實(shí)現(xiàn)雙向鏈表的示例
- C數(shù)據(jù)結(jié)構(gòu)之雙鏈表詳細(xì)示例分析
- C#數(shù)據(jù)結(jié)構(gòu)之循環(huán)鏈表的實(shí)例代碼
- C#數(shù)據(jù)結(jié)構(gòu)與算法揭秘四 雙向鏈表
- C語(yǔ)言 數(shù)據(jù)結(jié)構(gòu)之鏈表實(shí)現(xiàn)代碼
相關(guān)文章
C++新特性詳細(xì)分析基于范圍的for循環(huán)
C++11這次的更新帶來(lái)了令很多C++程序員期待已久的for?range循環(huán),每次看到j(luò)avascript,?lua里的for?range,心想要是C++能有多好,心里別提多酸了。這次C++11不負(fù)眾望,再也不用羨慕別家人的for?range了。下面看下C++11的for循環(huán)的新用法2022-04-04關(guān)于C++中的static關(guān)鍵字的總結(jié)
C++的static有兩種用法:面向過(guò)程程序設(shè)計(jì)中的static和面向?qū)ο蟪绦蛟O(shè)計(jì)中的static。前者應(yīng)用于普通變量和函數(shù),不涉及類;后者主要說(shuō)明static在類中的作用2013-09-09C++ 中繼承與動(dòng)態(tài)內(nèi)存分配的詳解
這篇文章主要介紹了C++ 中繼承與動(dòng)態(tài)內(nèi)存分配的詳解的相關(guān)資料,這里提供實(shí)例幫助大家學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下2017-08-08使用Qt實(shí)現(xiàn)監(jiān)聽網(wǎng)頁(yè)是否響應(yīng)并導(dǎo)出Excel表
Qt導(dǎo)出數(shù)據(jù)到excel,方法有很多,下面這篇文章主要給大家介紹了關(guān)于使用Qt實(shí)現(xiàn)監(jiān)聽網(wǎng)頁(yè)是否響應(yīng)并導(dǎo)出Excel表的相關(guān)資料,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11VSCode無(wú)法打開源文件及無(wú)法打開鏈接庫(kù)文件的解決方法
本文主要介紹了VSCode無(wú)法打開源文件及無(wú)法打開鏈接庫(kù)文件的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06一篇文章教你如何用C語(yǔ)言實(shí)現(xiàn)strcpy和strlen
這篇文章主要為大家介紹了C語(yǔ)言實(shí)現(xiàn)strcpy和strlen的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-01-01