#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;
}
#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;
}