-
实现目的:
创建一个带头结点的单链表L,其数据域存放的是整型数据元素,设计一个算法,- 1)将该单链表进行逆置。
测度数据:原单链表L(5,16,8, 36,4),逆置后变为L(4,36,8,16,5)。 - 2)在该非空单链表第一个最大值结点之前插入一个值为x的结点。
测试数据:已知单链表L(5,16,8,36,4),x的值为30,插入后单链表为L(5,16,8, 30,36,4)。
- 1)将该单链表进行逆置。
-
代码:
#include<stdlib.h>
#include <iostream>
using namespace std;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LinkList;
void CreateListR(LinkList *&L, ElemType a[], int n)//尾插法建立单链表
{
LinkList *s, *r;
int i;
L = (LinkList *)malloc(sizeof(LinkList));
r = L;
for (i = 0; i<n; i++)
{
s = (LinkList *)malloc(sizeof(LinkList));
s->data = a[i];
r->next = s;
r = s;
}
r->next = NULL;
}
void CreateListF(LinkList *&L, ElemType a[], int n)//头插法建表
{
LinkList *s;
int i;
L = (LinkList *)malloc(sizeof(LinkList));
L->next = NULL;
for (i = 0; i<n; i++)
{
s = (LinkList *)malloc(sizeof(LinkList));
s->data = a[i];
s->next = L->next;
L->next = s;
}
}
void DispList(LinkList *L)//输出单链表
{
LinkList *p = L->next;
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
void ListInsert(LinkList *&L, ElemType e)//在最大元素前插入e,首先找到第一个最大元素,记住其指针地址
{
int j = 0;
LinkList *p = L->next, *pre=L;
LinkList *maxp = p, *maxpre = L, *s;
while (p != NULL)//找到第一个最大元素,记住其地址
{
if (maxp->data < p->data)
{
maxp = p;
maxpre = pre;
}
pre = p;
p = p->next;
}
s = (LinkList *)malloc(sizeof(LinkList));
s->data = e;
s->next = maxpre->next;
maxpre->next = s;
}
void turn(LinkList *Z)//逆置单链表
{
LinkList *L;
int b[5];
int i = 0, n = 5, k = 0;
LinkList *q = Z->next;
while (q != NULL)
{
b[i] = q->data;
q = q->next;
i++;
}
CreateListF(L, b, 5);
DispList(L);
}
int main()
{
LinkList *L;
int a[] = { 5,16,8,36,4 };
CreateListR(L, a, 5);
cout << "原单链表为:";
DispList(L);
cout << endl;
cout << "逆置后的单链表为:";
turn(L);
cout << "在最大元素前插入30后的单链表为:" << endl;
ListInsert(L,30);
DispList(L);
system("pause");
return 1;
}