1.编写程序完成单链表的下列基本操作:
- 用头插入法生成一个链表[ 2 4 6 8 10],结点的数值从键盘上输入。输出上 述链表
- 在链表的第 1 个位置插入元素 7,输出上述链表;
- 删除链表的第 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;
}