C數(shù)據(jù)結(jié)構(gòu)之雙鏈表詳細(xì)示例分析
更新時間:2013年08月13日 09:30:35 作者:
以下是對c語言中的雙鏈表進行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
復(fù)制代碼 代碼如下:
typedef struct node
{
struct node *prior;
struct node *next;
int num;
}NODE;
/*******雙向鏈表的初始化********/
NODE *Init_link(void)
{
int i;
NODE *phead,*pb,*pi;
phead = (NODE *)malloc(sizeof(NODE));
printf("please input num:\n");
scanf("%d",&(phead->num));
phead->prior = NULL;
phead->next = NULL;
pb = phead;
for(i=0; i<3; i++)
{
pi = (NODE *)malloc(sizeof(NODE));
printf("please input num:\n");
scanf("%d",&(pi->num));
pi->next = NULL;
pb->next = pi;
pi->prior = pb;
pb = pi;
}
return phead;
}
/******鏈表的輸出******/
void print_link(NODE *phead)
{
while(phead != NULL)
{
printf(" %d,",phead->num);
phead = phead->next;
}
printf("\n");
}
/******鏈表的逆序******/
NODE *reverse_link(NODE *phead)
{
NODE *pb,*pf,*temp;
pb = phead;
pf = pb->next;
while(pf != NULL)
{
temp = pf->next;
pf->next = pb;
pb->prior = pf;
pb = pf;
pf = temp;
}
// phead->prior = pf->prior;
phead->next = NULL;
phead = pb;
return phead;
}
/*****鏈表的排序*****/
NODE *Order_link(NODE *phead)
{
NODE *pb,*pf,*ptr,temp;
pb = phead;
while(pb->next != NULL)
{
pf = pb->next;
while(pf != NULL)
{
if(pb->num > pf->num)
{
temp = *pb;
*pb = *pf;
*pf = temp;
ptr = pb->next;
pb->next = pf->next;
pf->next = ptr;
ptr = pb->prior;
pb->prior = pf->prior;
pf->prior = ptr;
}
pf = pf->next;
}
pb = pb->next;
}
return phead;
}
/******鏈表的有序插入*****/
NODE *insert_link(NODE *phead,NODE *pi)
{
NODE *pb,*pf;
pb = phead;
if(pi == NULL)
return phead;
if(phead == NULL)
{
phead = pi;
pi->prior = NULL;
pi->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;
pi->prior = NULL;
phead->prior = pi;
phead = pi;
}
else
{
pi->next = pb;
pb->prior = pi;
pi->prior = pf;
pf->next = pi;
}
}
else
{
pi->next = NULL;
pi->prior = pb;
pb->next = pi;
}
}
return phead;
}
/******鏈表的刪除*****/
NODE *delete_link(NODE *phead, NODE *pi)
{
NODE *pb,*pf;
pb = phead;
while(pb != NULL)
{
if(pb == pi)
{
if(pb == phead)
phead = phead->next;
else if(pb->next == NULL)
pf->next = NULL;
else
{
pf->next = pb->next;
//pb->next->prior = pf;
}
}
pf = pb;
pb = pb->next;
}
return phead;
}
/*******鏈表的釋放******/
void free_link(NODE *phead)
{
NODE *pb;
while(phead != NULL)
{
pb = phead->next;
free(phead);
phead = pb;
}
printf("released link success!\n");
}
/*******測試程序******/
int main(void)
{
NODE *phead,*pi;
phead = Init_link();
printf("init link:\n");
print_link(phead);
pi = (NODE *)malloc(sizeof(NODE));
printf("plaese input insert num:");
scanf("%d",&(pi->num));
phead = insert_link(phead,pi);
printf("after insert link:\n");
print_link(phead);
phead = Order_link(phead);
printf("after sort link:\n");
print_link(phead);
printf("after reverse link:\n");
phead = reverse_link(phead);
print_link(phead);
phead = delete_link(phead, pi);
printf("after delete link:\n");
print_link(phead);
free_link(phead);
return 0;
}
相關(guān)文章
Visual?Studio2022配置ReSharper?C++?常用設(shè)置方法
這篇文章主要介紹了Visual?Studio2022配置ReSharper?C++?常用設(shè)置,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),文中介紹了卸載Resharper的方法及Resharper激活碼,感興趣的朋友參考下吧2024-01-01
C++實現(xiàn)折半插入排序(BinaryInsertSort)
這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)折半插入排序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-04-04
淺談C語言中的sizeof()和strlen()的區(qū)別
本文主要介紹了C語言中的sizeof()和strlen()的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05
VC中LINK 2001 和 LINK 2009 的錯誤的解決方法
最近將兩個開源C++項目編譯成windows版本的時候遇到很多問題,編譯的時候總是報錯,報的最多的是無法解析的外部符號”,經(jīng)過近3天的折騰總算都通過了,這里是一些總結(jié)2020-10-10

