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; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。