#include<iostream>
using namespace std;
typedef int ElemType;
typedef struct LNode//结点结构体
{
ElemType data;//数据域,int类型
struct LNode* next;//指针域,next指向下一个结点
}LNode,*LinkList;//LNode为结构体,*LinkList为结构体指针,等价于LNode*
//尾插入法建立不带头结点的单链表L
//尾插入法:生成的结点作为原有链表的表尾
void CreateList01(LinkList& L, int n)
{
LinkList p, q;
L = new LNode;
L->data = rand() % 100;
L->next = NULL;
q = L;
for (int i = 0; i < n; i++)
{
p = new LNode;//生成新结点
p->next = NULL;
p->data = rand() % 100;
q->next = p;
q = p;//将q指向p结点,此时q就成了尾结点,下一个循环生成新的p结点,重复相同操作
}
}
// 尾插入法建立带头结点的单链线性表L
void CreateList02(LinkList& L, int n)
{
LinkList p, q;
L = new LNode;
L->next = NULL; // 建立头结点
q = L;//将q指向L头结点
for (int i = 0; i < n; i++)
{
p = new LNode; // 生成新结点
p->data = rand() % 100;
p->next = NULL;
q->next = p; //将q对应结点的next指针指向p
q = p;//将q指向p结点,此时q就成了尾结点
}
}
//头插入法建立不带头结点的单链表L
//头插入法:生成的结点作为原有链表的表头
void CreateList03(LinkList& L, int n)
{
LinkList p, q;
L = new LNode;
L->data = rand() % 100;
L->next = NULL;
q = L;
for (int i = 0; i < n; i++)
{
p = new LNode;
p->data = rand() % 100;
p->next = q;
q = p;
L = p;//因为L指向的结点先生成,所以要前移,否则循环结束后L就指向了表尾
}
}
//头插入法建立带头结点的单链表L
void CreateList04(LinkList& L, int n)
{
LinkList p, q;
L = new LNode; //建立头结点
L->next = NULL;
q = L;
for (int i = 0; i < n; i++)
{
p = new LNode;
p->data = rand() % 100;
p->next = q->next;
q->next = p;//这里的next交换顺序不能反了,先将p->next指向q->next,再将q->next指向p
}
}
int main()
{
LinkList L1, L2, L3, L4;
cout << "01检验:" << endl;
CreateList01(L1, 8);
for (int i = 0; i < 8; i++)
{
cout << L1->data << endl;
L1= L1->next;
}
cout << "02检验:" << endl;
CreateList02(L2, 8);
L2 = L2->next;
for (int i = 0; i < 8; i++)
{
cout << L2->data << endl;
L2=L2->next;
}
cout << "03检验:" << endl;
CreateList03(L3, 8);
for (int i = 0; i < 8; i++)
{
cout << L3->data << endl;
L3 = L3->next;
}
cout << "04检验:" << endl;
CreateList04(L4, 8);
L4 = L4->next;
for (int i = 0; i < 8; i++)
{
cout << L4->data << endl;
L4 = L4->next;
}
}
运行结果并无异常: