循环单链表(采用尾插法创建链表)

本文介绍了如何通过尾插法创建循环单链表,详细阐述了具体步骤和实现过程,并给出了运行结果。









#include <stdio.h>
#include <stdlib.h>

typedef int ItemValue;

typedef struct LinkNode
{
	ItemValue value;
	struct LinkNode *next;

} Node, *pNode;

Node* CreateCylicSingleLinkedList()
{
	Node *head = (Node *)malloc(sizeof(Node)); // Create the head node
	if (!head) {
		printf("链表创建失败 !\n");
	}
	head->next = NULL;
	ItemValue iValue;
	Node *pTemp;
	pTemp = head;
	while (scanf("%d", &iValue) != EOF)
	{
		Node *p = (Node *)malloc(sizeof(Node));
		p->value = iValue;
		p->next = pTemp->next;
		pTemp->next = p;
		pTemp = p;
	}
	pTemp->next = head;
	return head;
}

void VisitLinkedList(Node *L)
{
	Node *p;
	p = L;
	while (p->next != L)
	{
		printf("%d ", p->next->value);
		p = p->next;
	}
}

int main()
{
	Node *g_Node = CreateCylicSingleLinkedList();
	VisitLinkedList(g_Node);
	free(g_Node);

	system("pause");
	return 0;
}





运行结果:




### C语言单链表尾插法实现 以下是一个完整的基于C语言的单链表尾插法实现代码。该方法通过逐步将新节点追加到链表末尾的方式构建链表,确保链表中元素的顺序与输入一致。 #### 链表结构定义 首定义链表节点的结构体 `Node` 和初始化函数 `initLink()`,这是创建和管理链表的基础[^3]。 ```c #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; // 数据域 struct Node* next; // 指针域 } Node; /// 初始化链表 Node* initLink() { Node* head = (Node*)malloc(sizeof(Node)); // 动态分配内存 if (!head) { printf("Memory allocation failed!\n"); exit(1); // 内存不足则退出程序 } head->next = NULL; // 初始时链表为空 return head; } ``` --- #### 尾插法核心逻辑 在尾插法中,始终维护一个指向链表最后一个节点的指针 `tail`,每次插入新节点时只需将其附加到当前尾节点之后,并更新 `tail` 的值即可[^2]。 ```c /// 使用尾插法链表中添加节点 void insertByTail(Node* head, int value) { Node* newNode = (Node*)malloc(sizeof(Node)); if (!newNode) { printf("Failed to allocate memory for the new node.\n"); return; } newNode->data = value; // 赋值数据域 newNode->next = NULL; // 新节点的下一个指针置为NULL Node* tail = head; // 寻找链表的尾部 while (tail->next != NULL) { // 循环直到找到最后的一个有效节点 tail = tail->next; } tail->next = newNode; // 追加新节点到最后 } ``` --- #### 测试代码 为了验证功能正常运行,可以编写测试代码来展示如何使用以上函数创建并打印一个简单的单链表。 ```c /// 打印整个链表的内容 void printList(Node* head) { Node* current = head->next; // 跳过头结点(哨兵) while (current != NULL) { printf("%d -> ", current->data); current = current->next; } printf("NULL\n"); // 表明链表结束 } int main() { Node* head = initLink(); // 初始化链表 // 向链表中插入一些数值 insertByTail(head, 10); insertByTail(head, 20); insertByTail(head, 30); // 输出链表内容 printf("The linked list is:\n"); printList(head); return 0; } ``` 当执行这段代码时,将会看到如下输出结果: ``` The linked list is: 10 -> 20 -> 30 -> NULL ``` 这表明我们成功地使用尾插法建立了一个包含三个整数项的单链表[^1]。 --- ### 性能考虑 尽管上述实现简单易懂,但在频繁调用的情况下可能存在效率问题——即每轮都需要遍历整个列表才能定位到尾端。如果希望进一步提升性能,可以在插入的同时额外保存一条指向当前尾巴处的快捷引用,从而减少不必要的重复扫描动作[^2]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值