单向链表的操作:创建,删除,插入,销毁,查找
来源:互联网 发布:python 自动发朋友圈 编辑:程序博客网 时间:2024/05/21 12:09
#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;
}
- 单向链表的操作:创建,删除,插入,销毁,查找
- c++之链表篇1:单向链表的创建,打印,删除,插入,销毁等基本操作
- 单向循环链表创建、遍历、插入、删除、查找(按位置,按元素值)、清空、销毁
- 单向链表的创建 删除 插入
- 单向链表的创建,插入,删除,排序,查找---新人贴
- 单链表的创建、插入、删除、销毁以及查找中间结点
- C语言单向链表的创建、释放、插入、删除、翻转操作练习
- 单向链表的相关操作(创建,遍历,插入,删除,逆置)
- typedef的用法 单向链表的查找、增加、删除、销毁。
- 线性表的操作(完成表的建立,插入,删除,排序,销毁,查找 )
- 单向动态链表的创建、输入、插入、删除、输出
- 单向动态链表的创建、输入、插入、删除、输出
- 单向循环链表的创建/插入/删除/输出算法
- 单向链表的创建、查找、删除、打印
- 链表操作:创建,插入,删除,查找等功能
- 数据结构之链表操作,创建,插入,删除,查找。
- 数据结构----单向链表之 新建-插入-删除-排序(选择法)-合并-删除-销毁
- 哈希表的创建查询插入删除销毁
- PHP巧妙利用位运算实现网站权限管理
- javax.persistence.OneToMany.orphanRemoval()Z
- 一个超简单的办法让Windows XP引导Ubuntu
- 在Android应用中加入自己的手势处理
- android 读写sd卡的权限设置
- 单向链表的操作:创建,删除,插入,销毁,查找
- C++中malloc和realloc的意义
- Android学习 - Android术语解释
- 身边朋友对你的印象——测试一下,娱乐娱乐
- 最简单的Splash Screen在Android中的实现
- 用Eclipse开发与调试纯粹的Android C++程序,非ndk-build、ndk-gdb
- 通用数据库连接工具
- Oracle数据库case的作用,查询很管用的
- set:: erase