算法学习06:单链表

单链表

一个单向链表基本由两个元素组成,即数据字段和指针,而指针通常指向下一个节点内存所在的地址。
最后一个节点没有其他节点可以连接,因此指针的值为NULL。
在这里插入图片描述

class List{
	public:
	int data;
	class List *next;
}
创建与遍历

以动态分配产生链表节点的方式,可以先行定义一个类数据类型,要有一个数据字段,接着在类中定义一个指针变量,其数据类型与此类相同,作用是指向下一链表节点。
遍历单向链表的过程,就是使用指针运算来访问链表中的每一个节点,为了便于操作可以定义一个指针变量作为链表的读取游标。
创建链表有两种方法,头插法和尾插法,下面分别介绍。

头插法

每次在链表的头部插入,即插入位置是phead的下一个,若想将pnewnode插入,首先将pnewnode的指针域指向phead->next,再将phead的指针域指向pnewnode
在这里插入图片描述
使用头插法创建单链表

Linklist Creat_list(Linklist head) {
	head = (Linklist)malloc(sizeof(Lnode));      //  为头指针开辟内存空间
	Lnode *node = NULL;                    //  定义新结点
	int count = 0;                          //  创建结点的个数
	head->next = NULL;              
	node = head->next;              	//  将最后一个结点的指针域永远保持为NULL
	printf("Input the node number: ");
	scanf("%d", &count);
	for (int i = 0; i < count; i++) {
		node = (Linklist)malloc(sizeof(Lnode));     //  为新结点开辟内存空间
		node->data = i;               //  为新结点的数据域赋值
		node->next = head->next;          //  将头指针所指向的下一个结点的地址,赋给新创建结点的next 
		head->next = node;          //  将新创建的结点的地址赋给头指针的下一个结点
	}
	return head;
}

尾插法

每次在尾部插入,就是最后一个节点的后面插入,首先需要遍历单链表,找到最后一个节点。将最后一个节点的指针域指向pnewnode,再将pnewnode的指针域指向null
在这里插入图片描述

使用尾插法创建单链表
创建第一个节点head后,head->next赋值为NULL。此时这个节点既是头结点,又是尾节点。因此将头结点head的地址赋值给尾结点end。然后创建第二个节点,让当前尾节点的指针域指向新节点,再将新节点变成尾结点。end->next=node;end=node;
相当于不断插入新节点,将当前的尾结点的指针域指向新节点,再将新节点变为尾结点。这一过程中,尾结点的位置是不断向后动态移动的。当不再有新节点插入时,将尾结点的指针域指向NULL

Linklist Creat_list(Linklist head) {
	head = (Linklist)malloc(sizeof(Lnode));          //  为头指针开辟内存空间
	Linklist node = NULL;           //  定义结点
	Linklist end = NULL;            //  定义尾结点
	head->next = NULL;              //  初始化头结点指向的下一个地址为 NULL
	end = head;                     //  未创建其余结点之前,只有一个头结点
	int count = 0 ;                 //  结点个数
	printf("Input node number: ");
	scanf("%d", &count);
	for (int i = 0; i < count; i++) {
		node = (Linklist)malloc(sizeof(Lnode));          //  为新结点开辟新内存
		node->data = i;                                  //  新结点的数据域赋值
		end->next = node;                      		
		end = node;
	}
	end->next = NULL;
}

完整代码

#include<iostream>
using namespace std;

class list {  //定义链表结构 
public:
	int data;
	class list* next;
};
typedef class list node;
typedef node* link;

int main() {
	link newnode, head, phead;  //声明三个链表结构的指针 
	int n;
	cout << "请输入将要存储的元素个数: " << endl;
	cin >> n;
	phead = new node;  //phead暂当链表头指针
	if (!phead) {  //分配内存失败时phead=NULL 
		cout << "[Error!内存分配失败!]" << endl;
	}
	cout << "请依次输入存储元素: " << endl;
	cin >> phead->data;  //输入节点的数据 
	head = phead;  //保留链表头指针,以phead为指向当前节点的指针
	for (int i = 0; i < n - 1; i++) {
		newnode = new node;
		if (!newnode) {
			cout << "[Error!内存分配失败!]" << endl;
		}
		cin >> newnode->data;
		newnode->next = NULL;
		phead->next = newnode;  //把新节点加在链表后面
		phead = newnode;  //让phead保持在链表的最后面
	}
	cout << "输出数据: " << endl;
	phead = head;  //让phead回到链表头
	while (phead != NULL) {
		cout << phead->data << "->";
		head = phead;
		phead = phead->next;  //phead按序往后遍历整个链表
		if (!phead) cout << "NULL" << endl;
		delete head;  //释放内存空间
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值