手动输入数据完成链表的 头插、尾插

本文介绍如何使用C语言手动输入数据完成链表的头插法和尾插法,并提供链表遍历及获取链表长度的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

手动输入数据完成链表的 头插、尾插

#include "stdafx.h"
#include <stdlib.h>


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


#if  0   

//头插法完成动态链表的创建与输出
//头插法输出列表的是倒序的
//head指针的位置永远不变

Node *createList()
{
	Node *head = (Node*)malloc(sizeof(Node));
	head->next = NULL;//先创建一个空链表

	Node* cur = NULL;//新节点的指针

	int data;
	printf("请输入节点数据:");
	scanf("%d", &data);

	while (data)//为了实现动态连接节点,设置输入数据为0时不再连接
	{
		cur = (Node*)malloc(sizeof(Node));//为新节点开辟空间
		cur->data = data;

		cur->next = head->next;//让新节点有所指向
		head->next = cur;//头节点与新节点连接

		scanf("%d", &data);//再次输入
	}
	return head;
}

#endif


//尾插法
//尾插法输出列表是正序的

Node *createList()
{
	Node *head = (Node*)malloc(sizeof(Node));
	head->next = NULL;


	Node* pt = head;//创建一个直指向尾节点的指针
	Node* cur = NULL;

	int data;
	printf("请输入节点数据:");
	scanf("%d", &data);

	while (data)
	{
		cur = (Node*)malloc(sizeof(Node));
		cur->data = data;

		pt->next = cur;//将新节点连接到原尾节点的后面
		cur->next = NULL;//将新节点定义成尾节点
		pt = cur;//pt=pt->next;将原来的尾指针后移

		scanf("%d", &data);
	}
	return head;
}


//链表的遍历
void traverseList(Node * head)
{
	head = head->next;
	//从头结点的下一个节点开始输出(头结点的data没有值)

	//此处判断实际是通过让head指向下一个节点后,
	//再来判断上一个节点的nest值是否为NULL
	while (head != NULL)
	{
		printf("%d\n", head->data);
		head = head->next;
	}
}

//不用担心调用后头指针的位置,头指针还是在头,
//只有参数为二级指针才能改变一级指针的指向
//参数只有一个一级指针相当于原指针的一个副本,改变副本的指向不会影响原指针


//求链表的长度
int lenList(Node* head) 
{
	int len = 0;
	head = head->next;
	while (head != NULL)
	{
		len++;//链表的长度是不算头结点的长度的
		head = head->next;
	}
	return len;
}


int _tmain(int argc, _TCHAR* argv[])
{

	Node *head = createList();
	traverseList(head);
	int len = lenList(head);
	printf("链表长为%d\n", len);

	return 0;
}

 
<think>好的,我现在需要回答用户关于如何在C++中实现链表输入操作的问题。首先,我得回顾一下用户提供的引用内容,看看有没有相关的信息可以借鉴。 用户提供的引用中,引用[3]提到了链表实现多项式相加,其中有一个`input()`函用于输入多项式。这可能和链表输入操作相关。另外,引用[4]提到了C++链表的实现,包括构造函和成员变量,但没有具体说明输入方法。其他引用如[1]和[2]主要涉及链表的遍历和基本操作,可能对输入操作有帮助,但需要具体分析。 接下来,我需要整理C++中链表输入的一般方法。通常,链表输入可以通过循环读取用户输入,并逐个节点添加到链表中。这可能需要使用动态内存分配,比如`new`操作符来创建新节点。同时,要考虑输入终止的条件,比如输入特定值(如0或负)结束输入。 在引用[3]中,`input()`函可能是一个例子,但用户没有给出具体代码。不过根据描述,输入可能需要入节点到链表中。结合引用[1]中的遍历方法,可以设计一个循环,每次读取一个值,创建新节点,并将其链接到链表部或部。 需要注意的是,链表输入通常分为法和法。法每次将新节点入到链表部,而法则需要维护一个指针,将新节点添加到链表。用户的问题没有指定哪种方法,可能需要都提及。 另外,用户提供的引用[4]中提到了链表模板类的实现,包括成员变量如`listHead`和`listEnd`,这可能用于跟踪链表,方便法的实现。例如,每次输入新节点时,更新`listEnd`指针,这样可以避免每次从遍历到,提高效率。 还需要考虑输入时的错误处理,比如输入非整的情况,但用户的问题可能更关注基本实现,所以这部分可能暂时忽略。 现在,需要将这些思路整理成步骤,并给出代码示例。比如,首先创建链表结构或类,然后实现输入,使用循环读取输入,直到满足终止条件,然后逐个添加节点。可能需要区分法和法,并说明两者的区别。 最后,根据用户的要求生成相关问题,这些问题应该与链表操作相关,比如遍历、优化、应用场景等。例如,如何遍历链表,如何优化输入效率,链表在哪些场景下使用等。 总结一下,回答应包括链表输入的基本步骤、代码示例(法和法)、注意事项(如内存管理、指针的使用),以及相关问题。同时,引用中的相关内容需要适当标注引用标记,如引用[3]和引用[4]的相关部分。</think>在C++中实现链表输入操作,主要分为以下步骤: ### 一、链表输入的核心方法 1. **创建节点结构体** 定义包含数据域和指针域的结构体: ```cpp struct Node { int data; Node* next; Node(int val) : data(val), next(nullptr) {} }; ``` 2. **输入逻辑实现** - **法**(新节点链表部): ```cpp Node* inputHeadInsert() { Node* head = nullptr; int value; while (cin >> value && value != -1) { // 输入-1终止 Node* newNode = new Node(value); newNode->next = head; // 新节点指向原节点 head = newNode; // 更新节点 } return head; } ``` *特点:输入顺序与链表存储顺序相反*[^4] - **法**(新节点链表部): ```cpp Node* inputTailInsert() { Node *head = nullptr, *tail = nullptr; int value; while (cin >> value && value != -1) { Node* newNode = new Node(value); if (!head) { // 空链表初始化 head = tail = newNode; } else { tail->next = newNode; // 节点指向新节点 tail = newNode; // 更新指针 } } return head; } ``` *特点:输入顺序与链表存储顺序一致*[^3] ### 二、完整代码示例(法) ```cpp #include <iostream> using namespace std; struct Node { int data; Node* next; Node(int val) : data(val), next(nullptr) {} }; Node* createLinkedList() { Node *head = nullptr, *tail = nullptr; int value; cout << "输入序列(以-1结束): "; while (cin >> value && value != -1) { Node* newNode = new Node(value); if (!head) { head = tail = newNode; } else { tail->next = newNode; tail = newNode; } } return head; } // 遍历验证 void printList(Node* head) { for (Node* p = head; p != nullptr; p = p->next) { cout << p->data << " "; } } int main() { Node* myList = createLinkedList(); printList(myList); return 0; } ``` ### 三、关键注意事项 1. **内存管理** 动态分配的节点需通过`delete`手动释放,避免内存泄漏 2. **输入终止条件** 示例中使用`-1`作为终止标志,可根据需求修改为其他条件 3. **指针优化** 法通过维护`tail`指针将时间复杂度从$O(n^2)$降为$O(n)$[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值