ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

使用c++实现单链表的部分操作

2021-01-18 23:58:49  阅读:128  来源: 互联网

标签:head 单链 int c++ next num len Student 操作


关于本篇文章说明

对于代码块中出现的函数的作用会在标题下说明,函数体中出现的指针(除head头指针外)
皆为中间指针变量。

代码中出现了一些c的函数printf,但只有printf函数,其余全为c++中函数,请放心阅读。

代码并没有使用类的包装,类的包装会在作者开学后再进行添加。

最后,可以设置头指针指向的单元值为单链表长度,但本文并没有这样设置,而是设置了全局变量

单链表的结构单元

其中num为单元携带的数值,next指针则指向下一个单元。

typedef struct node
{
	int num;
	struct node* next;
}Student;

单链表的创建(头插法和尾插法)

创建单链表,并将其相连接,最后返回头指针(头指针是开启单链表大门的钥匙)

头插法

Student* createList_1()
{
	cout << "请输入链表长度:";
	cin >> len;
	Student* head =new Student;
	head->next = NULL;
	for (int i = 0; i < len; i++)
	{
		Student* p = new Student;
		printf("请输入第%d个节点的数值:",len- i - 1);
		cin >> p->num;
		p->next = head->next;
		head->next = p;
	}
	return head;
}

尾插法

Student* createList_2()
{
	Student* head = new Student;
	head->next = NULL;
	Student* r = head;
	cout << "请输入链表长度:";
	cin >> len;
	for (int i = 0; i < len; i++)
	{
		Student* p = new Student;
		printf("请输入第%d个节点的数值:", i + 1);
		cin >> p->num;
		r->next = p;
		r = p;

	}
	return head;
}

单链表的输出

oid display(Student* head)
{
	Student* p=head->next;
	cout << endl;
	for (int i = 0; i < len; i++)
	{
		if (i != 0)
			cout << "  -->  ";
		cout << p->num ;
		p = p->next;
	}
}

单链表删除某一结点

void delet_point(Student* head)
{
	int n;
	Student* p = head, * r = head;
	printf("\n请输入想要删除的节点数:");
	cin >> n;
	while (n<=0 || n>len + 1)
	{
		printf("\n输入错误,请重新输入(%d,%d):", 1, len + 1);
		cin >> n;
	}
	for (int i = 0; i < n; i++)
	{
		p = p->next;
		if (i < n - 1)
			r = r->next;
	}
	r->next = p->next;
	delete p;
	len--;
}

单链表删除某一数值

void delet_num(Student* head)
{
	int num, a = 1;
	Student* p = head, * r = head;
	printf("\n请输入想要删除的数值:");
	cin >> num;
	for (int i = 0; i < len; i++)
	{
		p = r->next;
		if(p->num==num)
		{
			r->next = p->next;
			delete p;
			len--;
			a = 0;
		}
		r = r->next;
	}
	if (a)
		printf("\n该链表中不存在该数.\n");
}

单链表的插入

void input(Student* head)
{
	int n;
	Student* p = new Student;
	Student* r = head;
	printf("\n请输入新增节点数值:");
	cin >> p->num;
	printf("\n请输入新增节点位置(%d,%d):",1,len+1);
	cin >> n;
	while (n<=0 || n>len + 1)
	{
		printf("\n输入错误,请重新输入(%d,%d):", 1, len + 1);
		cin >> n;
	}
	for (int i = 0; i < n-1; i++)
		r = r->next;
	p->next = r->next;
	r->next = p;
	len++;
}



单链表的取值

void absorb(Student* head)
{
	int n;
	printf("\n请输入想取值的节点数(%d,%d):",1,len);
	cin >> n;
	while (n <= 0 || n > len)
	{
		printf("\n输入错误,请重新输入(%d,%d):", 1, len);
		cin >> n;
	}
	Student* p=head;
	for (int i = 0; i < n; i++)
		p = p->next;
	printf("该值为:%d", p->num);
}

单链表逆转

void reverse(Student* head)
{
	Student* p = head, * t = NULL, * r = p->next;
	for (int i = 0;i<len; i++)
	{	
		p = r;
		r = r->next;
		p->next = t;
		t = p;
	}
	head->next = p;

}

单链表的选择排序

void sort(Student* head)
{
	Student* r = head->next, * p = r, * t = r;
	int tem = 0;
	for(int i=0;i<len;i++)
	{
		t = r;
		for (int j = i ; j < len; j++)
		{
			if (r->num> p->num)
				t = p;
			p = p->next;
		}
		tem = r->num;r->num = t->num;t->num = tem;
		r = r->next;
		p = r;
	}
}

关于两个单链表的合并

两个单链表的有序合并要将两个链表合并后再进行排序,无序合并直接连接链表即可。

标签:head,单链,int,c++,next,num,len,Student,操作
来源: https://blog.csdn.net/fallleeeer/article/details/112797346

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有