C语言--链式结构表1

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

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值