链表的三种插入方法

我们学数据结构第一个例子就是链表,它可以实现理论上的连续,而物理上的非连续的效果,节省空间的同时也方便插入,下面来介绍三种插入方法

1.头插法

void head_insert(STU **head) {//需要改变指针的值,所以传**类型
 //1.申请节点空间
 STU *new_node = (STU*)malloc(sizeof(STU));
 if (new_node == NULL) {//申请失败判断
  perror("malloc");
 }
 memset(new_node, 0, sizeof(STU));//清空结构体
 //2.给节点赋值
 scanf("%d %s %f",&new_node->num,new_node->name,&new_node->score);
 //3.对头(节点)进行判断
 STU *pf=*head;
 *head = new_node;//指针赋值
 pf == NULL?(new_node->next = NULL):(new_node->next = pf); 
}

2.尾插法

void tail_insert(STU **head) {
 STU *new_node = (STU*)malloc(sizeof(STU));
 if (new_node == NULL) {
  perror("malloc");
 }
 memset(new_node, 0, sizeof(STU));
 scanf("%d %s %f", &new_node->num, new_node->name, &new_node->score);
 STU *pf = *head;
 if(pf==NULL)
  *head = new_node;
 else {
  while (pf->next != NULL) {
   pf = pf->next;
  }
  pf->next= new_node;
 }
}

3.顺序插法

此方法有一定难度,需要定义两个指针,也可以用一个指针的next的next来判断循环条件,再去对每个情况去判断
void sort_insert(STU **head) {
 STU *new_node = (STU*)calloc(1,sizeof(STU)),*temp=NULL;
 if (new_node == NULL) {
  perror("calloc");
 }
 scanf("%d %s %f", &new_node->num, new_node->name, &new_node->score);
 STU *pf = *head;
 if (pf == NULL)
  *head = new_node;
 else {
  while (pf != NULL) {
   //按成绩的多少插入,大的在前
   if (pf->score >= new_node->score ) {
    temp = pf;//定义上一个节点的指针
    pf = pf->next;
   }
   else {
    break;
   }
  }
  if (pf == *head ) {//在头部插入
   *head = new_node;
   new_node->next = pf;
  }
  else if (pf !=NULL) {//在中间插入
   new_node->next = temp->next;
   temp->next = new_node;
  }
  else {//在尾部插入
   temp->next = new_node;
  }
 }
}
总结:
     要改变主调函数中的值 ,必须要穿的函数变量
     的地址!
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值