单链表之链表的创建与输出

本文介绍了链表的基本概念,并详细阐述了如何使用C语言实现动态单链表的创建,包括无头和有头、尾插法与头插法的四种情况。每种方法都提供了完整的代码示例,以0作为输入结束标志。文章适合初学者理解链表的操作原理。
摘要由CSDN通过智能技术生成


一、链表是什么?

官方解释:

链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。

二、使用步骤

1.定义结构体类型

代码如下:

struct node
{
	int num;
	struct node* next;
};

2.创建及输出动态单链表

创建链表之前需要了解动态单链表的几种形式,有头或无头,尾插法还是头插法,通过多次创建链表,个人更喜欢使用尾插法来创建一个无头单链表。

有头和无头的区别就在于第一个节点是否有数据域。

头插法和尾插法也就顾名思义,头插法每次都是在头节点后插入一个节点,而尾插法则是在链表末尾插入一个节点。所以在顺序输出的情况下,头插法创建的单链表是逆序输出的,而尾插法就是顺序输出。

1.尾插法无头单链表❤
int main()
{
	struct node* p1, * p2, * head;
	head = NULL;
	p1 = p2 = (struct node*)malloc(LEN);
	if(p1==NULL) exit(1);
	scanf_s("%d", &p1->num);
	int count = 0;
	do
	{
		if (count == 0) head = p1;
		else p2->next = p1;
		p2 = p1;
		p1 = (struct node*)malloc(LEN);
		if(p1==NULL) exit(1);
		count++;
		scanf_s("%d", &p1->num);
	} while (p1->num != 0);
	p2->next = NULL;
	free(p1);
	struct node* p;
	p = head;
	while (p != NULL)
	{
		printf("%d ", p->num);
		p = p->next;
	}
	return 0;
}
2.尾插法有头单链表
int main()
{
	struct node* head, * p1, * p2;
	p1 = p2 = (struct node*)malloc(LEN);
	if(p1==NULL) exit(1);
	head = (struct node*)malloc(LEN);
	if(head==NULL) exit(1);
	scanf_s("%d", &p1->num);
	int count = 0;
	do
	{
		if (count == 0) head->next = p1;
		else p2->next = p1;
		p2 = p1;
		count++;
		p1 = (struct node*)malloc(LEN);
		if(p1==NULL) exit(1);
		scanf_s("%d", &p1->num);
	} while (p1->num != 0);
	p2->next = NULL;
	free(p1);
	struct node* p;
	p = head->next;
	while (p != NULL)
	{
		printf("%d ", p->num);
		p = p->next;
	}
	return 0;
}
3.头插法无头单链表
int main()
{
	struct node* head, * p1;
	head = NULL;
	p1 = (struct node*)malloc(LEN);
	if(p1==NULL) exit(1);
	scanf_s("%d", &p1->num);
	while (p1->num != 0)
	{
		p1->next = head;
		head = p1;
		p1 = (struct node*)malloc(LEN);
		if(p1==NULL) exit(1);
		scanf_s("%d", &p1->num);
	}
	free(p1);
	struct node* p;
	p = head;
	while (p != NULL)
	{
		printf("%d ", p->num);
		p = p->next;
	}
	return 0;
}
4.头插法有头单链表
int main()
{
	struct node* head, * p1;
	head = (struct node*)malloc(LEN);
	if(head==NULL) exit(1);
	head->next = NULL;
	int date;
	scanf_s("%d", &date);
	while (date != 0)
	{
		p1 = (struct node*)malloc(LEN);
		if(p1==NULL) exit(1);
		p1->num = date;
		p1->next = head->next;
		head->next = p1;
		scanf_s("%d", &date);
	}
	struct node* p;
	p = head->next;
	while (p != NULL)
	{
		printf("%d ", p->num);
		p = p->next;
	}
	return 0;
}

以上链表输入时都已0为结束标志,当检测到输入的值为0时,链表创建完毕。


以上链表的创建都是根据自己的思想创建的,所以可能会出现错误,希望大佬们可以指点一二😊

**头插法创建单链表:** 头插法是在链表头部插入新节点。先创建一个空链表的头节点,然后每次插入新节点时都将其next字段指向当前头节点。 ```c ListNode* createLinkedList(int* arr, int size) { ListNode* head = new ListNode(); // 创建头节点,初始为空 for (int i = 0; i < size; i++) { ListNode* newNode = new ListNode(arr[i]); // 新节点存放元素 newNode->next = head; // 新节点next指向前一个头节点 head = newNode; // 更新头节点 } return head; } ``` **输出单链表:** 遍历链表,逐个打印节点值。 ```c void printList(ListNode* head) { ListNode* current = head; while (current != NULL) { printf("%d ", current->data); current = current->next; } printf("\n"); } ``` **插入操作(尾插法):** 尾插法是在链表尾部插入节点,需要维护一个指向最后一个节点的指针。 ```c void insertAtEnd(ListNode*& tail, int value) { ListNode* newNode = new ListNode(value); if (tail == NULL) { tail = newNode; } else { newNode->next = NULL; tail->next = newNode; } } ``` **删除操作:** 删除指定位置的节点,这里以删除第一个匹配的节点为例。 ```c void deleteElement(ListNode** head, int target) { if (*head == NULL) return; if ((*head)->data == target) { ListNode* temp = *head; *head = (*head)->next; delete temp; return; } ListNode* curr = *head; while (curr->next != NULL && curr->next->data != target) { curr = curr->next; } if (curr->next != NULL) { ListNode* temp = curr->next; curr->next = curr->next->next; delete temp; } } ``` **查询操作:** 查找特定值的节点。 ```c ListNode* searchElement(ListNode* head, int target) { ListNode* curr = head; while (curr != NULL) { if (curr->data == target) return curr; curr = curr->next; } return NULL; // 如果未找到目标,返回NULL } ``` **主函数功能菜单创建:** ```c void mainMenu() { int choice; do { printf("1. 创建链表\n2. 输出链表\n3. 插入元素(尾插)\n4. 删除元素\n5. 查询元素\n6. 退出\n"); scanf("%d", &choice); switch (choice) { case 1: // 创建链表 int arr[] = {1, 2, 3, 4, 5}; int size = sizeof(arr) / sizeof(arr[0]); ListNode* list = createLinkedList(arr, size); break; // 其他选项... } } while (choice != 6); // 根据选择执行对应操作 } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值