单向链表的操作:创建,删除,插入,销毁,查找

#include<stdio.h>
#include<malloc.h>


typedef struct club {

char Rank_NO;
int found_date;

struct club *next;
}football_club;




typedef struct{
struct club *header;
struct club *tail;
}nodepointer;
 
 
/*
创建node_amount个连续的节点
入口参数:需要创建的节点个数
返回值:  头节点的地址header及尾节点的地址tail
*/


nodepointer creat_node(char node_amount){

football_club *club_info,*p1,*p2,*header,*tail;
char c; /*用于接收输入缓冲区多余的字符*/
nodepointer new_node;

header = NULL;
tail = NULL;
while(node_amount){
node_amount--;
club_info=(football_club*)malloc(sizeof(football_club));

if(club_info!=NULL ){

printf(" applicating memory space success\n");
printf("please input the Rank_NO:\n");
scanf("%d",&club_info->Rank_NO);

printf("please input the club found_date\n");
scanf("%d",&club_info->found_date);
c= getchar(); /*用于接收输入缓冲区多余的字符*/

if(header==NULL){
p1 = club_info;
header=club_info;
if(!node_amount){ /*如果只有一个节点,则头尾指向同一个节点*/
tail = header;
tail->next = NULL;
}

continue;
}

p2 = p1;
p1 = club_info;
p2->next=p1;

p1->next = NULL;
tail = p1;


}else
printf(" applicating memory space failure\n");
}


new_node.header = header;
new_node.tail = tail;

return(new_node); /*返回刚创建的连续节点的头指针及尾指针*/


}




/*
函数名称:select_node
函数功能:节点查询
入口参数:链表头节点->list_header;查询关键字->date
返回值:成功则返回节点的指针,否则,返回NULL
备注: 对于单向链表而言,要查找到某一个节点,只能从前往后查,
而且必须知道头节点或者第一个节点。


*/


football_club *select_node(football_club *header,int datenum){
football_club *goal_node;
football_club *p1,*p2;

goal_node = NULL;
p1 = header;

while(p1 != NULL){

if(p1->found_date == datenum)
break;

p2 = p1;
p1 = p1->next;

}

goal_node = p1; /*无论是否找到,goal_node总是有一个确定的值*/

return(goal_node);

}




/*
插入一个节点
函数名称:
入口参数:链表头指针,插入点的位置(后插),插入节点个数
返回值:插入成功返回1,否则返回0
备注: 1、创建一个节点
2、在原来的链表中查找需要插入点的位置
3、将创建好的节点插入到链表
4、输出整个链表,检验结果
后插时,如果是插在最后一个节点,则尾指针要清NULL
*/


char insert_node(football_club *header,int datenum){
football_club *p1,*p2,*newnode_header;
nodepointer new_node;
char insert_flag;


new_node=creat_node(1); /*创建新节点*/

if(new_node.header==NULL){ /*创建节点失败*/
printf("Creat new node failure!\n");
insert_flag=0;
}
else{
newnode_header = new_node.header; /*将节点指针转移*/

p1=select_node(header,datenum);


if(p1!= NULL){/*正好找到该节点*/
/*如果P1是最后一个节点,则p1-next = NULL
那么p2就是NULL*/
p2 = p1->next;
p1->next = newnode_header;
newnode_header->next = p2;
insert_flag=1; /*插入成功*/
}
else /*没有找到该节点,插入失败*/
insert_flag=0;
}

return(insert_flag);


}




/*
删除一个节点
函数名称:delete_node
入口参数:链表头指针->header,删除节点关键字->keynum
返回值:删除成功则返回1,否则返回0
备注: 1、在原来的链表中查找需要删除节点的位置
2、如果是删除第一个节点,则要更新头节点的内容
3、如果是删除最后一个节点,则他的尾指针要清NULL

*/


football_club * delete_node(football_club *header,int keynum){
football_club *p1,*p2;
char delete_flag; /*删除标志位*/

p1 = header; /**/
p2 = p1;
while(p1!=NULL){
if(p1->found_date == keynum){ /*找到该节点*/
if(p1 == header) /*删除的是第一个节点*/
header = p1->next;
else
p2->next = p1->next;

free(p1); /*释放空间*/


delete_flag = 1; /*删除成功*/
break;
}

p2 = p1;
p1 = p1->next;


}

if(p1 == NULL) /*要删除的节点不在链表内*/
delete_flag = 0; /*删除失败*/

return(header);
}


/*
销毁整个链表
函数名称:free_list
入口参数:链表头指针->header
返回值:无
备注: 从头指针开始,free一个一个节点,直到销毁整个链表

*/


void free_list(football_club *header){
football_club *p1,*p2;
p1 = header;
p2 = p1;
free(header);
while(p1 != NULL){
p1 = p1->next;

free(p2);

p2 = p1;

}

}


/*
输出整个链表
函数名称:print_list
入口参数:链表头指针->header
返回值:无
备注: 从头指针开始,print一个一个节点

*/


void print_list(football_club *header){
football_club *p1;

p1 = header;

while(p1!=NULL){
printf("%-10d   ",p1->Rank_NO);
printf("%-10d\n",p1->found_date);

p1=p1->next;
}

return;
}






void main(void){


football_club *club_info,*p1,*p2,*header;
char char_buff1,char_buff2;
nodepointer  newnode;
header = NULL;

while(1){
printf("how many list node do you want to creat?\n");
scanf("%d",&char_buff1);
char_buff2=getchar();

if(char_buff1==0)
break;

newnode=creat_node(char_buff1);

if((club_info=newnode.header)==NULL)
break;

if(header==NULL){
header=newnode.header;
p1 = newnode.header; /*表头*/
p2 = newnode.tail; /*表尾*/
p2->next = NULL;
continue;
}
p1 = p2;
p1->next=newnode.header;
p2 = newnode.tail;
p2->next = NULL;
}

printf("the original list node is showing bellow\n");
printf("Ranking    found year\n");
print_list(header);


if(insert_node(header, 1905))
print_list(header);
else
printf("insert node failured\n");


header = delete_node(header, 1905);
print_list(header);

//printf("delete node failured\n");
 

return;


}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值