C语言0基础的前端考研日记:头插法/尾插法创建单链表

一、头插法思路:

1、新节点的下一个节点指向链表的第一个节点

2、将头结点的下一个节点指向新节点

将数据按这个步骤处理后,新节点就会变为链表的第一个节点

前置知识点

malloc 函数 :用于从堆中分配一块指定大小的内存。

内存分配成功返回指向该内存块的指针,否则返回 NULL
使用方法 :('数据类型的指针')malloc('内存大小');
sizeof(Node) 获取Node类型所需内存大小

c 复制代码
#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
 int data;
 struct Node *next;
} Node;

void insert (Node *L) {
 int x;
 scanf("%d", &x); // 让用户输入数据
 printf("插入%d\n", x); // 控制台打印用户输入的数据
 if (x != 0) { // 当x=0时,插入结束
   Node *n = (Node *)malloc(sizeof(Node)); // 
   printf ("data: %d next: %p\n", n->data, n->next);
   printf ("data: %d next: %p\n", L->data, L->next);
   if (n == NULL) {
     printf("内存分配失败\n");
     exit(0);
   }
   // 将用户输入的数据赋值给新节点
   n->data = x; // L: Head -> FirstNode -> NULL; n: n -> NULL;
   // 让节点n指向节点FirstNode
   n->next = L->next; // L: Head -> FirstNode -> NULL; n: n -> FirstNode -> NULL;
   // 将头结点的next指向新节点
   L->next = n;  // L: Head -> n -> FirstNode -> NULL
   insert(L); // 递归,直到用户输入的数据为0
 };
};
// 打印整个链表
void printList(Node *L) {
   Node *current = L->next; // 从头结点的下一个开始遍历
   while (current != NULL) {
       printf("%d -> ", current->data);
       current = current->next;
   }
   printf("NULL\n"); // 结束标志
}

int main() {
 Node L = {0, NULL};
 insert(&L);
 printList(&L);
 return 0;
}

二、尾插法思路

1、声明变量tail用于存储尾结点的指针,这样可以随时找到链表的尾结点

2、将尾结点的next指向新节点,此时新节点就会成为链表的尾结点

3、将新节点的指针赋值给tail

4、重复以上步骤,直到用户输入的数据为0, 结束链表的创建

相对于头插法只在insert、main做了修改

c 复制代码
void insert (Node *L, Node *last) {
  int x;
  scanf("%d", &x); // 让用户输入数据
  printf("插入%d\n", x); // 控制台打印用户输入的数据
  if (x != 0) { // 当x=0时,插入结束
    Node *n = (Node *)malloc(sizeof(Node));
    // 将用户输入的数据赋值给新节点
    n->data = x; // L: Head -> ... -> lastNode -> NULL; n: n -> NULL;
    // lastNode的next指向新节点
    last->next = n; // L: Head -> ... -> lastNode -> n -> NULL; last: *lastNode;
    // 新节点成为了链表尾结点
    last = n; // last: n;
    insert(L, last); // 递归,直到用户输入的数据为0
  } else {
    last->next = NULL; // 输入结束时将尾结点的next赋值为NULL
  };
};

int main() {
  Node L = {0, NULL};
  Node *lastPoint = &L;
  insert(&L, lastPoint);
  printList(&L);
  return 0;
}
相关推荐
没书读了6 小时前
考研复习-数据结构-第六章-图
数据结构
future14128 小时前
C#进阶学习日记
数据结构·学习
ChoSeitaku11 小时前
NO.4数据结构数组和矩阵|一维数组|二维数组|对称矩阵|三角矩阵|三对角矩阵|稀疏矩阵
数据结构·人工智能·矩阵
Paper Clouds12 小时前
代码随想录|图论|15并查集理论基础
数据结构·算法·leetcode·深度优先·图论
Paper Clouds12 小时前
代码随想录|图论|14有向图的完全可达性
数据结构·算法·深度优先·图论·宽度优先
遇见尚硅谷12 小时前
C语言:游戏代码分享
c语言·开发语言·算法·游戏
闻缺陷则喜何志丹13 小时前
【并集查找 虚拟节点】P1783 海滩防御|省选-
数据结构·c++·洛谷·并集查找·虚拟节点
Jess0714 小时前
归并排序递归法和非递归法的简单简单介绍
c语言·算法·排序算法
7 9715 小时前
C语言基础知识--柔性数组
数据结构·算法
双叶83615 小时前
(C++)STL标准库(vector动态数组)(list列表)(set集合)(map键值对)相关对比,基础教程
c语言·开发语言·数据结构·c++·list