生活随笔
收集整理的這篇文章主要介紹了
C语言 双向链表的增删改查
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
主題:雙向鏈表
功能:分別實(shí)鏈表的插入、刪除、查找、打印(正序、逆序)操作
提示:如果需要進(jìn)入下一步操作,輸入3個(gè)ctrl z即可
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct student
{int num
;float score
;struct student
*pnext
;struct student
*ppre
;
}stu
, *pstu
;
void list_print(pstu phead
, pstu ptail
)
{pstu pcur
= phead
;printf("順序打印:\n");while (pcur
!= NULL){printf("%d %2.2f\n", pcur
->num
, pcur
->score
);pcur
= pcur
->pnext
;}printf("\n");printf("逆序打印:\n");pcur
= ptail
;while (pcur
!= NULL){printf("%d %2.2f\n", pcur
->num
, pcur
->score
);pcur
= pcur
->ppre
;}printf("\n");
}
void list_insert_head(pstu
*pphead
, pstu
*pptail
, int i
)
{pstu pnew
;pnew
= (pstu
)calloc(1, sizeof(stu
));pnew
->num
= i
;if (NULL == *pptail
){*pphead
= pnew
;*pptail
= pnew
;}else{pnew
->pnext
= *pphead
;(*pphead
)->ppre
= pnew
;*pphead
= pnew
;}
}
void list_insert_tail(pstu
*pphead
, pstu
*pptail
, int i
)
{pstu pnew
;pnew
= (pstu
)calloc(1, sizeof(stu
));pnew
->num
= i
;if (NULL == *pptail
){*pphead
= pnew
;*pptail
= pnew
;}else{(*pptail
)->pnext
= pnew
;pnew
->ppre
= *pptail
;*pptail
= pnew
;}
}
void list_insert_sort(pstu
*pphead
, pstu
*pptail
, int i
)
{pstu pnew
;pnew
= (pstu
)calloc(1, sizeof(stu
));pnew
->num
= i
;pstu pcur
= *pphead
;pstu pbefore
= *pphead
;if (NULL == *pptail
){*pphead
= pnew
;*pptail
= pnew
;}else{if (i
<= pcur
->num
){pnew
->pnext
= *pphead
;(*pphead
)->ppre
= pnew
;*pphead
= pnew
;return;}else{while (NULL != pcur
){if (i
<= pcur
->num
){pbefore
->pnext
= pnew
;pnew
->ppre
= pbefore
;pnew
->pnext
= pcur
;pcur
->ppre
= pnew
;break;}pbefore
= pcur
;pcur
= pcur
->pnext
;}if (NULL == pcur
){(*pptail
)->pnext
= pnew
;pnew
->ppre
= *pptail
;*pptail
= pnew
;}}}
}
void list_delete(pstu
*pphead
, pstu
*pptail
, int i
)
{pstu pcur
= *pphead
;pstu pbefore
= *pphead
;if (NULL == *pptail
){printf("鏈表為空\n");}else if (i
== (*pphead
)->num
){(*pphead
)->pnext
->ppre
= (*pphead
)->ppre
;*pphead
= (*pphead
)->pnext
;free(pcur
);if (NULL == *pphead
){*pptail
= NULL;}}else{while (NULL != pcur
){if (i
== pcur
->num
){pcur
= pcur
->pnext
;pbefore
->pnext
= pcur
;pcur
->ppre
= pbefore
;return;}else{pbefore
= pcur
;pcur
= pcur
->pnext
;}}if (NULL == pcur
){printf("不存在此數(shù)字\n");}}
}
void list_modify(pstu
*pphead
, pstu
*pptail
, int i
, float score
)
{pstu pcur
= *pphead
;pstu pbefore
= *pphead
;if (NULL == *pptail
){printf("鏈表為空\n");}else{while (NULL != pcur
){if (i
== pcur
->num
){pcur
->score
= score
;return;}else{pbefore
= pcur
;pcur
= pcur
->pnext
;}}if (NULL == pcur
){printf("不存在此數(shù)字\n");}}
}
void list_find(pstu
*pphead
, pstu
*pptail
, int i
)
{pstu pcur
= *pphead
;pstu pbefore
= *pphead
;if (NULL == *pptail
){printf("鏈表為空\n");}else{while (NULL != pcur
){if (i
== pcur
->num
){printf("查詢成功:\n%d %2.2f\n", i
, pcur
->score
);return;}else{pbefore
= pcur
;pcur
= pcur
->pnext
;}}if (NULL == pcur
){printf("不存在此數(shù)字\n");}}
}int main()
{int i
;float score
;pstu phead
= NULL;pstu ptail
= NULL;printf("請(qǐng)輸入你要插入的數(shù)字:");while (scanf("%d", &i
) != EOF){list_insert_head(&phead
, &ptail
, i
);}list_print(phead
, ptail
);printf("請(qǐng)輸入你要?jiǎng)h除的數(shù)字:");while (scanf("%d", &i
) != EOF){list_delete(&phead
, &ptail
, i
);printf("輸出:\n");list_print(phead
, ptail
);}printf("請(qǐng)輸入你要修改的序號(hào)和數(shù)字:");while (scanf("%d %f", &i
, &score
) != EOF){list_modify(&phead
, &ptail
, i
, score
);printf("輸出:\n");list_print(phead
, ptail
);}printf("請(qǐng)輸入你要查找的序號(hào):");while (scanf("%d", &i
) != EOF){list_find(&phead
, &ptail
, i
);}system("pause");
}
總結(jié)
以上是生活随笔為你收集整理的C语言 双向链表的增删改查的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。