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

关于本篇文章说明

对于代码块中出现的函数的作用会在标题下说明,函数体中出现的指针(除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, * p = r, * t = r;
	int tem = 0;
	for(int i=0;i<len;i++)
	{
		t = r;
		for (int j = i ; j < len; j++)
		{
			if (t->num> p->num)
				t = p;
			p = p->next;
		}
		tem = r->num;r->num = t->num;t->num = tem;
		r = r->next;
		p = r;
	}
}

关于两个单链表的合并

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值