C语言链表完整操作演示
本文实例为大家分享了C链表操作演示的具体代码,供大家参考,具体内容如下
头文件:link_0505.h
/* 链表演示 */ #ifndef__LINK_0505 #define__LINK_0505 typedefstructnode{ intnum; structnode*p_next; }node; typedefstruct { nodehead,tail; }link; //链表的初始化函数 voidlink_init(link*); //链表的清理函数 voidlink_deinit(link*); //判断链表是否空的函数 intlink_empty(link*); //判断链表是否满的函数 intlink_full(link*); //统计有效数字个数的函数 intlink_size(link*); //在最前边插入数字的函数 intlink_add_head(link*,int); //在最后边插入新的数字的函数 intlink_append(link*,int); //把数字按照顺序插入到链表的函数 intlink_insert(link*,int); //删除最前面数字的函数 intlink_remove_head(link*); //删除最后一个有效数字 intlink_remove_tail(link*); //删除某个给定数字的函数 intlink_remove(link*,int); //获得第一个有效数字的函数 intlink_get_head(link*,int*); //获得最后一个有效数字的函数 intlink_get_tail(link*,int*); //获得指定编号数字的函数 intlink_get(link*,int*,int); #endif
实现代码:link_0505.cpp
/* 链表演示 */ #include"stdlib.h" #include"link_0505.h" //链表的初始化函数 voidlink_init(link*p_link) { p_link->head.p_next=&(p_link->tail); } //链表的清理函数 voidlink_deinit(link*p_link) { while(p_link->head.p_next!=&(p_link->tail)) { node*p_first=&(p_link->head); node*p_mid=p_first->p_next; node*p_last=p_mid->p_next; p_first->p_next=p_last; free(p_mid); p_mid=NULL; } } //判断链表是否空的函数 intlink_empty(link*p_link) { returnp_link->head.p_next==&(p_link->tail); } //判断链表是否满的函数 intlink_full(link*p_link) { return0; } //统计有效数字个数的函数 intlink_size(link*p_link) { intcnt=0; node*p_node=NULL; for(p_node=&(p_link->head);p_node!=&(p_link->tail);p_node=p_node->p_next) { node*p_first=p_node; node*p_mid=p_first->p_next; node*p_last=p_mid->p_next; if(p_mid!=&(p_link->tail)) { cnt++; } } returncnt; } //在最前边插入数字的函数 intlink_add_head(link*p_link,intnum) { node*p_temp=(node*)malloc(sizeof(node)); if(!p_temp) { return0; } p_temp->num=num; node*p_first=&(p_link->head); node*p_mid=p_first->p_next; node*p_last=p_mid->p_next; p_first->p_next=p_temp; p_temp->p_next=p_mid; return1; } //在最后边插入新的数字的函数 intlink_append(link*p_link,intnum) { node*p_tmp=(node*)malloc(sizeof(node)); node*p_node=NULL; if(!p_tmp) { return0; } p_tmp->num=num; for(p_node=&(p_link->head);p_node!=&(p_link->tail);p_node=p_node->p_next) { node*p_first=p_node; node*p_mid=p_first->p_next; node*p_last=p_mid->p_next; if(p_mid==&(p_link->tail)) { p_first->p_next=p_tmp; p_tmp->p_next=p_mid; break; } } return1; } //把数字按照顺序插入到链表的函数 intlink_insert(link*p_link,intnum) { node*p_temp=(node*)malloc(sizeof(node)); node*p_node=NULL; if(!p_temp) { return0; } p_temp->num=num; p_temp->p_next=NULL; for(p_node=&(p_link->head);p_node!=&(p_link->tail);p_node=p_node->p_next) { node*p_first=p_node; node*p_mid=p_first->p_next; node*p_last=p_mid->p_next; if(p_mid==&(p_link->tail)||p_mid->num>p_temp->num) { p_first->p_next=p_temp; p_temp->p_next=p_mid; break; } } return0; } //删除最前面数字的函数 intlink_remove_head(link*p_link) { node*p_first=&(p_link->head); node*p_mid=p_first->p_next; node*p_last=p_mid->p_next; if(p_link->head.p_next==&(p_link->tail)) { return0; } p_first->p_next=p_last; free(p_mid); p_mid=NULL; } //删除最后一个有效数字 intlink_remove_tail(link*p_link) { node*p_node=NULL; for(p_node=&(p_link->head);p_node!=&(p_link->tail);p_node=p_node->p_next) { node*p_first=p_node; node*p_mid=p_first->p_next; node*p_last=p_mid->p_next; if(p_last==&(p_link->tail)) { p_first->p_next=p_last; free(p_mid); p_mid=NULL; return1; } } return0; } //删除某个给定数字的函数 intlink_remove(link*p_link,intnum) { node*p_node=NULL; for(p_node=&(p_link->head);p_node!=&(p_link->tail);p_node=p_node->p_next) { node*p_first=p_node; node*p_mid=p_first->p_next; node*p_last=p_mid->p_next; if(p_mid!=&(p_link->tail)&&p_mid->num==num) { p_first->p_next=p_last; free(p_mid); p_mid=NULL; return1; } } return0; } //获得第一个有效数字的函数 intlink_get_head(link*p_link,int*p_num) { if(p_link->head.p_next==&(p_link->tail)) { return0; } node*p_first=&(p_link->head); node*p_mid=p_first->p_next; node*p_last=p_mid->p_next; p_first->p_next=p_last; *p_num=p_mid->num; return1; } //获得最后一个有效数字的函数 intlink_get_tail(link*p_link,int*p_num) { node*p_node=NULL; for(p_node=&(p_link->head);p_node!=&(p_link->tail);p_node=p_node->p_next) { node*p_first=p_node; node*p_mid=p_first->p_next; node*p_last=p_mid->p_next; if(p_last==&(p_link->tail)) { *p_num=p_mid->num; return1; } } return0; } //获得指定编号数字的函数 intlink_get(link*p_link,int*p_num,intnum) { intcnt=0; node*p_node=NULL; for(p_node=&(p_link->head);p_node!=&(p_link->tail);p_node=p_node->p_next) { node*p_first=p_node; node*p_mid=p_first->p_next; node*p_last=p_mid->p_next; if(p_mid!=&(p_link->tail)&&cnt==num) { *p_num=p_mid->num; return1; } cnt++; } return0; }
测试函数:
/* *链表测试 **/ #include#include"link_0505.h" intmain(){ intsize=0,num=0,val=0; linklnk={0}; link_init(&lnk); link_add_head(&lnk,30); link_add_head(&lnk,20); link_append(&lnk,90); link_append(&lnk,100); link_insert(&lnk,50); link_insert(&lnk,60); link_insert(&lnk,40); link_insert(&lnk,80); link_insert(&lnk,70); size=link_size(&lnk); for(num=0;num<=size-1;num++){ link_get(&lnk,&val,num); printf("%d",val); } printf("\n"); printf("------------------"); link_remove_head(&lnk); link_remove_tail(&lnk); link_remove(&lnk,70); size=link_size(&lnk); for(num=0;num<=size-1;num++){ link_get(&lnk,&val,num); printf("%d",val); } printf("\n"); link_get_head(&lnk,&val); printf("最前面的数字是%d\n",val); link_get_tail(&lnk,&val); printf("最后面的数字是%d\n",val); link_deinit(&lnk); return0; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。