#include <stdio.h>
#include <stdlib.h>
//
typedef int INT;
//定义一个结构体的node结点用来保存,关联数据
typedef struct node_{
struct node_ *next;
INT data;
}node;
/**
尾插法 保存最后一个数据
*/
static node *last;
/**
创建头结点
*/
node *create_head_node(){
//创建头结点
node *n = malloc(sizeof(node));
n->next = NULL;
//给保存最后一个结点的指针变量开辟内存
last=malloc(sizeof(node));
last=n; //初始化时,第一个结点就是尾结点
return n;
}
/**
头插法
添加结点数据 每次都添加到第一个数据结点后面,
因为第一个head结点不保存数据 故而新add的数据都在第一位,即头插法
*/
void add_head(node *head,INT value){
//创建新的结点,给新的结点赋值
node *n = malloc(sizeof(node));
n->data=value;
//新结点的下一个结点指向头结点的下一个结点 :赋值规则:为避免覆盖 从空结点开始赋值;
n->next=head->next;
//头结点的下一个结点指向新的结点
head->next=n;
}
/**
尾插法
*/
void add_foot(node *footer,INT value){
//创建新的结点 并赋值
node *n = malloc(sizeof(node));
n->data=value;
n->next=NULL;
last = n;//记录当前结点
//把新结点关联到尾结点
footer->next=n;
}
/**
根据数据删除结点
*/
int delete(node *head,int value){
node *last_=malloc(sizeof(node));
while(head->next!=NULL){
last_=head;//保存这个node
head=head->next;//因为第一个头node不存储值,故而可以直接到下一个 node
if(head->data==value){
last_->next=head->next;
free(head);
return 1;
}
}
return 0;
}
/**
根据数据插入结点
value保证在insert_value的后面
*/
int insert_by_value(node *head,int insert_value,int value){
while(head->next!=NULL){
head=head->next;//因为第一个头node不存储值,故而可以直接到下一个 node
if(head->data==insert_value){
//创建新结点
node *node_new=malloc(sizeof(node));
node_new->data=value;
node_new->next=head->next;//新结点的下一个结点指向目标结点的下一个结点
head->next= node_new;
return 1;
}
}
return 0;
}
/**
根据从小到大的顺序排列
*/
int insert_by_size(node *head,int value){
//创建结点赋并值
node *node_new=malloc(sizeof(node));
node_new->data=value;
//保存上一个结点
node *last_=malloc(sizeof(node));
while(head->next!=NULL){
last_=head;//保存这个node
head=head->next;
if(head->data>=value){
node_new->next=head;//新结点的下一个结点指向目head
last_->next=node_new;
return 1;
}
}
//如果是第一次插入 或者值比已经存在的值都大
node_new->next=NULL;
head->next=node_new;
return 1;
}
/**
测试头插法
*/
void *test_add_head(node *head){
add_head(head,22);
add_head(head,23);
add_head(head,24);
add_head(head,25);
add_head(head,26);
add_head(head,27);
}
/**
测试尾插法
*/
void *test_add_foot(){
add_foot(last,20);
add_foot(last,30);
add_foot(last,40);
add_foot(last,50);
add_foot(last,60);
add_foot(last,70);
}
/**
测试顺序插入插法
*/
void *test_insert_by_size(node *head){
insert_by_size(head,80);
insert_by_size(head,30);
insert_by_size(head,1000);
insert_by_size(head,50);
insert_by_size(head,20);
insert_by_size(head,700);
}
/**
打印数据
*/
void print_data(node *head){
while(head->next!=NULL){
head= head->next; //这里从新赋值
printf("%d ",head->data);
}
}
int main(INT argc,char *argv[]){
node *head = create_head_node();
test_insert_by_size(head);
// test_add_foot();
// test_add_head(head);
// int result = delete(head,40);
// printf("result=%d ",result);
// insert_by_value(head,60,65);
// insert_by_value(head,40,45);
print_data(head);
}
C语言--链式结构表1
最新推荐文章于 2023-12-02 16:04:26 发布