热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C语言链表动态创建:头插法与尾插法详解

本文详细介绍了C语言中链表的两种动态创建方法——头插法和尾插法,包括具体的实现代码和运行示例。通过这些内容,读者可以更好地理解和掌握链表的基本操作。

一、引言


在学习C语言的过程中,链表是一个非常重要的数据结构。本文将详细介绍如何使用C语言动态创建链表,并重点讲解头插法和尾插法的具体实现。通过这些方法,我们可以更灵活地管理链表中的节点。



二、头插法


头插法是指每次插入的新节点都作为链表的头部。具体实现如下:


// 动态创建链表(头插法)
struct Node *insertAtHead(struct Node *head) {
struct Node *newNode;
while (1) {
newNode = (struct Node *)malloc(sizeof(struct Node));
printf("请输入新节点的数据:\n");
scanf("%d", &newNode->data);
if (newNode->data == 0) {
printf("输入0退出!\n");
return head;
}
if (head == NULL) {
head = newNode;
newNode->next = NULL;
} else {
newNode->next = head;
head = newNode;
}
}
return head;
}


三、尾插法


尾插法是指每次插入的新节点都作为链表的尾部。具体实现如下:


// 动态创建链表(尾插法)
struct Node *insertAtTail(struct Node *head) {
struct Node *newNode, *temp = head;
while (1) {
newNode = (struct Node *)malloc(sizeof(struct Node));
printf("请输入新节点的数据:\n");
scanf("%d", &newNode->data);
if (newNode->data == 0) {
printf("输入0退出!\n");
return head;
}
if (head == NULL) {
head = newNode;
newNode->next = NULL;
} else {
while (temp->next != NULL)
temp = temp->next;
temp->next = newNode;
newNode->next = NULL;
}
}
return head;
}


四、示例源码


以下是完整的示例源码,包含链表的遍历、计数、查询、插入和删除等基本操作:


#include 
#include

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

void traverseList(struct Node *head) {
while (head != NULL) {
printf("%d ", head->data);
head = head->next;
}
putchar('\n');
}

int countNodes(struct Node *head) {
int count = 0;
while (head != NULL) {
count++;
head = head->next;
}
return count;
}

int searchNode(struct Node *head, int target) {
while (head != NULL) {
if (head->data == target)
return 1;
head = head->next;
}
return 0;
}

struct Node *insertAfter(struct Node *head, int target, struct Node *newNode) {
while (head != NULL) {
if (head->data == target) {
newNode->next = head->next;
head->next = newNode;
return head;
}
head = head->next;
}
return head;
}

struct Node *insertBefore(struct Node *head, int target, struct Node *newNode) {
if (head == NULL || head->data == target) {
newNode->next = head;
return newNode;
}
struct Node *prev = head;
while (prev->next != NULL && prev->next->data != target)
prev = prev->next;
if (prev->next != NULL) {
newNode->next = prev->next;
prev->next = newNode;
return head;
}
return head;
}

struct Node *deleteNode(struct Node *head, int target) {
if (head == NULL)
return head;
if (head->data == target)
return head->next;
struct Node *prev = head;
while (prev->next != NULL && prev->next->data != target)
prev = prev->next;
if (prev->next != NULL) {
struct Node *toDelete = prev->next;
prev->next = prev->next->next;
free(toDelete);
}
return head;
}

struct Node *insertAtHead(struct Node *head) {
struct Node *newNode;
while (1) {
newNode = (struct Node *)malloc(sizeof(struct Node));
printf("请输入新节点的数据:\n");
scanf("%d", &newNode->data);
if (newNode->data == 0) {
printf("输入0退出!\n");
return head;
}
if (head == NULL) {
head = newNode;
newNode->next = NULL;
} else {
newNode->next = head;
head = newNode;
}
}
return head;
}

struct Node *insertAtTail(struct Node *head) {
struct Node *newNode, *temp = head;
while (1) {
newNode = (struct Node *)malloc(sizeof(struct Node));
printf("请输入新节点的数据:\n");
scanf("%d", &newNode->data);
if (newNode->data == 0) {
printf("输入0退出!\n");
return head;
}
if (head == NULL) {
head = newNode;
newNode->next = NULL;
} else {
while (temp->next != NULL)
temp = temp->next;
temp->next = newNode;
newNode->next = NULL;
}
}
return head;
}

int main() {
struct Node *head = NULL;
head = insertAtTail(head);
traverseList(head);
return 0;
}


五、程序运行


以下为尾插法的运行示例:


程序运行截图


推荐阅读
  • 在多线程编程环境中,线程之间共享全局变量可能导致数据竞争和不一致性。为了解决这一问题,Linux提供了线程局部存储(TLS),使每个线程可以拥有独立的变量副本,确保线程间的数据隔离与安全。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • ImmutableX Poised to Pioneer Web3 Gaming Revolution
    ImmutableX is set to spearhead the evolution of Web3 gaming, with its innovative technologies and strategic partnerships driving significant advancements in the industry. ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本实验主要探讨了二叉排序树(BST)的基本操作,包括创建、查找和删除节点。通过具体实例和代码实现,详细介绍了如何使用递归和非递归方法进行关键字查找,并展示了删除特定节点后的树结构变化。 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 本题通过将每个矩形视为一个节点,根据其相对位置构建拓扑图,并利用深度优先搜索(DFS)或状态压缩动态规划(DP)求解最小涂色次数。本文详细解析了该问题的建模思路与算法实现。 ... [详细]
author-avatar
mobiledu2502909493
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有