c++数据结构之单链表(二)

1.编写程序完成单链表的下列基本操作:

  1. 用头插入法生成一个链表[ 2 4 6 8 10],结点的数值从键盘上输入。输出上 述链表
  2. 在链表的第 1 个位置插入元素 7,输出上述链表;
  3. 删除链表的第 4 个元素,输出链表;
    4)查找链表中最大和最小元素;
  4. 求链表的长度,并输出表长。

2.构造一个单链表 L,其头结点指针为 head,编写程序实现将 L 逆置。(即最 后一个结点变成第一个结点,原来倒数第二个结点变成第二个结点,如此等 等。)

四 、思考与提高 思考与提高 思考与提高 思考与提高
1.如何将一个带头结点的单链表 La 分解成两个同样结构的单链表 Lb,Lc,使 得 Lb 中只含 La 表中奇数结点,Lc 中含有 La 表的偶数结点?再对 Lb 和 Lc 的 元素按值非递减排列,将 Lb 和 Lc 合并得到新的单链表 Ld。

using namespace std;
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>

struct LinkList
{
	int number;
	struct LinkList *Next;
};

//头插法
void CreateList(LinkList *&L, int &number, int n)
{
	int i;
	LinkList *s;
	L = new LinkList;
	L->Next = NULL;
	for (i = 0; i < n; i++)
	{
		cout << "请输入第" << i << "个参数" << endl;
		cin >> number;
		s = new LinkList;
		s->number = number;
		s->Next = L->Next;
		L->Next = s;
	}
}


//尾插法
//void CreateList_back(LinkList *&L, string a[], string b[], string c[], int n)
//{
//	int i;
//	LinkList *s, *r;  //这里r都是先指向一个struct的头,然后再指向尾
//	L = new LinkList;
//	r = L;
//	for (i = 0; i < n; i++)
//	{
//		s = new LinkList;
//		s->name = a[i];
//		s->number = b[i];
//		s->marks = c[i];
//		r->Next = s;
//		r = s;
//	}
//	r->Next = NULL;
//}


int LengthList(LinkList *L)
{
	int n = 0;
	LinkList *p = L;
	while (p->Next != NULL)
	{
		n++;
		p = p->Next;
	}
	return n;
}


void ShowList(LinkList *L)
{
	int i = 0;
	LinkList *p = L->Next;
	for (i ; i < LengthList(L); i++)
	{
		cout << p->number << endl;
		p = p->Next;
	}
}

bool InsertList(LinkList *L, int i, int number)
{
	int j = 0;
	LinkList *p = L, *s;
	while (j < LengthList(L)-i+1 && p != NULL)
	{
		j++;
		p = p->Next;
	}
	if (p == NULL)
	{
		return false;
	}
	else
	{
		s = new LinkList;
		s->number = number;
		s->Next = p->Next;
		p->Next = s;
		return true;
	}
}


bool RemoveLinklist(LinkList *L, int i)
{
	int j = 0;
	LinkList *p = L, *s;
	while (j < LengthList(L) - i  && p != NULL)
	{
		j++;
		p = p->Next;
	}
	if (p == NULL)
	{
		return false;
	}
	else
	{
		s = p->Next;
		if (s == NULL)
			return false;
		p->Next = s->Next;
		free(s);
		return true;
	}
}


void min_max_value(LinkList *&L, int & min, int &max)
{
	LinkList * p = L->Next;  //此时p指向第一个节点
	min = p->number;
	max = p->number;
	p = p->Next;    //此时指向第二个节点

	while (p != NULL)
	{
		if (p->number <= min)
		{
			cout << "p.number_min" << p->number << endl;
			min = p->number;
		}
		p = p->Next;
	}

	p = L->Next;  //此时p指向第一个节点
	p = p->Next;  //此时指向第二个节点
	while (p != NULL)
	{
		if (p->number >= max)
		{
			cout << "p.number_max" << p->number << endl;
			max = p->number;
		}
		p = p->Next;
	}
	
}


LinkList * ResvereLinkList(LinkList *&L)
{
	/*
	LinkList * prev = NULL;
	LinkList * head = L;
	LinkList * next;
	while (head != NULL)
	{
		next = head->Next;
		head->Next = prev;
		prev = head;
		head = next;
	}
	*/
	LinkList *p, *r;
	p = L->Next;  //从第一个节点开始
	L->Next = NULL;
	while (p != NULL)
	{
		r = p->Next;   //将r放置到p之后
		p->Next = L->Next;  //将p节点插入到头结点之后
		L->Next = p;
		p = r;   //将p向后走一个节点
	}
	return L;
}


void think_more(LinkList *&L, LinkList *&L1, LinkList *&L2)
{
	int counts = 1;
	L1 = new LinkList;
	L2 = new LinkList;
	L1->Next = NULL;
	L2->Next = NULL;
	LinkList * s1;
	LinkList * s2;
	LinkList *p = L->Next;  //指向第二个节点
	while (p != NULL)
	{
		if (counts % 2 == 1)   //如果为奇数节点
		{
			s1 = new LinkList;
			s1->number = p->number;   //La链表将该内容赋值给Lb链表
			s1->Next = L1->Next;
			L1->Next = s1;
		}
		else
		{
			s2 = new LinkList;
			s2->number = p->number;
			s2->Next = L2->Next;
			L2->Next = s2;
		}
		p = p->Next;
		counts++;
	}

}


void SortLInkList(LinkList *&L)
{
	/*
	for (int i = 0; i < length; i++)
	{
		for (int j = i; j > 0 && arr[j - 1] > arr[j]; j--)
		{
			swap(arr[j], arr[j - 1]);
		}
	}
	*/
	int temp;
	LinkList *p = L->Next;
	LinkList *r;
	while (p != NULL)
	{
		r = p->Next;
		while (r != NULL)
		{
			if (p->number > r->number)
			{
				temp = p->number;
				p->number = r->number;
				r->number = temp;
			}
			r = r->Next;
		}
		p = p->Next;
	}

}


void merger_LinkList(LinkList *La, LinkList *&Lb, LinkList *&Ld)
{
	Ld = new LinkList;
	LinkList *s3;
	LinkList * p = La->Next;
	LinkList * r = Lb->Next;
	Ld->Next = NULL;
	for (int i = 0; i < (LengthList(La) + LengthList(Lb)); i++)
	{
		if (i < (LengthList(La)))
		{
			s3 = new LinkList;
			s3->number = p->number;
			s3->Next = Ld->Next;
			Ld->Next = s3;
			p = p->Next;
		}
		else
		{
			s3 = new LinkList;
			s3->number = r->number;
			s3->Next = Ld->Next;
			Ld->Next = s3;
			r = r->Next;
		}
	}
}


int main()
{
	LinkList *L;
	LinkList *L1;      //La链表
	LinkList *L2;      //Lb链表
	LinkList *L3;      //Lc链表
	int numbers;
	int array_numbers;
	int insert_number;   //要插入的数据
	int insert_adress;   //要插入的数据位置
	int remove_number;   //要删除的数据
	int min_number;
	int max_number;
	cout << "请输入链表的大小" << endl;
	cin >> array_numbers;
	CreateList(L, numbers, array_numbers);
	ShowList(L);

	cout << "请输入需要插入链表的位置" << endl;
	cin >> insert_adress;
	cout << "请输入需要插入的值" << endl;
	cin >> insert_number;

	cout << endl;
	InsertList(L, insert_adress, insert_number);
	ShowList(L);

	cout << "请输入需要删除链表的位置" << endl;
	cin >> remove_number;
	cout << endl;
	RemoveLinklist(L, remove_number);
	ShowList(L);
	cout << endl;

	min_max_value(L, min_number, max_number);
	cout << "最小的值为:" << min_number << endl;
	cout << "最大的值为:" << max_number << endl;

	cout << "反向的链表" << endl;
	ShowList(ResvereLinkList(L));
	cout << endl;

	think_more(L, L1, L2);
	cout << "La链表的值为" << endl;
	ShowList(L1);
	cout << "Lb链表的值为" << endl;
	ShowList(L2);


	cout << "La的链表排序" << endl;
	SortLInkList(L1);
	ShowList(L1);

	cout << "Lb的链表排序" << endl;
	SortLInkList(L2);
	ShowList(L2);

	cout << "La和Lb合并后形成的Lc链表为:" << endl;
	merger_LinkList(L1, L2, L3);
	ShowList(L3);
	cout << endl;

	system("pause");
	return 0;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值