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

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

#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;
}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值