欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

链表的三种插入方法

程序员文章站 2022-07-16 13:19:37
...

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

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;
  }
 }
}
总结:
     要改变主调函数中的值 ,必须要穿的函数变量
     的地址!