C++——链表用法总结

C++——链表用法总结

简介

链表是物理存储单元上不连续的存储结构,数据元素之间通过指针进行连接,链表由一系列节点组成,节点可以在运行时动态生成。每个节点包含两部分:存储数据的数据域,存储下一个节点地址的指针域。

一般链表在一些需要快速插入删除,而不关心或不需要随机访问的情况下使用。

和数组不同:链表允许在任意位置插入或者删除节点,但是链表不支持随机访问节点(不能像数组那样通过下标访问),只能从头节点逐个访问(遍历)每个节点。

链表可分为三类:单向链表、双向链表和循环链表。双向链表有两个指针域,前面的指针指向上一个节点,后面的指针指向下一个节点,循环链表比较利于数据存储缓存。
单向链表
双向链表
C++——链表用法总结_第1张图片

链表的创建与显示、插入和删除元素

#include 
using namespace std;

//用结构体类型来表示一个节点
typedef struct node
{
	char name[20];
	int age;
	struct node* next;//指向下一个节点的指针
}Student;

//获得链表的长度
int length(Student* head)
{
	int count = 0;
	Student* p = head->next;
	while (p != NULL)
	{
		count++;
		p = p->next;
	}
	return count;
}

//创建链表
Student* createList(int n)
{
	Student* head = new Student;//头节点,动态生成,创建在堆上
	//Student head; 这么写创建在栈上,函数结束就释放了,因此一般创建在堆上
	Student* pre = head;

	for (int i = 0; i < n; i++)
	{
		Student* p = new Student;
		cout << "please input student " << i+1 << " name and age: ";
		cin >> p->name;
		cin >> p->age;

		pre->next = p;
		pre = p;
		p->next = NULL;
	}
	return head;
}

//插入元素
void insertElement(Student* head,int index)
{
	//判断index是否合理
	if (index<0 || index>length(head))
		throw "out of range";

	//通过头节点head找到index处的节点
	Student* pre = head;
	for (int i = 0; i < index; i++)
	{
		pre = pre->next;
	}

	//创建需插入的新节点
	Student* newNode = new Student;
	cout << "please insert a new name and a new age:" << endl;
	cin >> newNode->name;
	cin >> newNode->age;

	//先让newNode指向pre的next,然后让pre指向newNode,反过来会丢失pre后面的节点
	newNode->next = pre->next;
	pre->next = newNode;

}

//删除元素
void removeElement(Student* head, int index)
{
	if (index<0 || index>length(head) - 1)
		throw "out of range";

	Student* pre = head;
	for (int i = 0; i < index; i++)
	{
		pre = pre->next;
	}
	Student* p = pre->next;
	pre->next = p->next; //pre->next=pre->next->next也可以
	delete p;
}

//显示链表
void display(Student* head)
{
	Student* p = head->next;
	while (p != NULL)
	{
		cout << p->name << "  " << p->age << endl;
		p = p->next;
	}
}

int main()
{
	int n = 3;
	Student *head=createList(n);
	
	insertElement(head, 2);
	display(head);
	cout << "length: " << length(head) << endl;

	int index = 0;
	while (1)
	{
		if (length(head) == 0)
		{
			cout << "empty!" << endl;
			break;
		}
		cout << "please input the index to remove:" << endl;
		cin >> index;
		removeElement(head, index);
		display(head);
	}
		
	return 0;
}

参考链接:
https://www.bilibili.com/video/BV1kx411g7Tjfrom=search&seid=13488292352233614535

你可能感兴趣的:(C++学习笔记,c++,链表)