#include <iostream>
using namespace std;
typedef struct LNode {
int data;
struct LNode *next;
}LNode, *LinkList;
// 构造一个空的单链表L
bool initList(LinkList &L) {
L = new LNode;
if (!L) {
return false;
}
L->next = NULL;
return true;
}
// 在带头结点的单链表L中根据序号i获取元素的值
bool getElem(LinkList L, int i, int &e) {
LinkList p = L->next;
int j = 1;
while (p && j < i) { // 顺序扫描,直到p为空或者指向第i个元素
p = p->next;
j++;
}
if (!p || j > i) {
return false;
}
e = p->data;
return true;
}
// 在带头结点的单链表L中查找值为e的元素
LinkList LocateElem(LinkList L, int e) {
LinkList p = L->next;
while (p && p->data != e) { // 顺序扫描,直到p为空,或者p的数据域等于e
p = p->next;
}
return p;
}
// 在带头结点的单链表L中第i个位置插入值为e的新结点
bool listInsert(LinkList &L, int i, int e) {
LinkList p = L;
int j = 0;
while (p && j < i-1) { // 查找第i-1个结点
p = p->next;
++j;
}
if (!p || j > i-1) { // 不是第i-1个结点
return false;
}
// 生成新结点
LinkList s = new LNode;
s->data = e;
// 第i-1个结点的next指向新结点,新结点的next指向第i个结点
s->next = p->next;
p->next = s;
return true;
}
// 在带头结点的单链表L中,删除第i个元素
bool listDelete(LinkList &L, int i) {
LinkList p = L;
int j = 0;
while (p && j < i-1) { // 查找第i-1个结点
p = p->next;
++j;
}
if (!p || j > i-1) { // 不是第i个结点
return false;
}
LinkList q = p->next; // 暂存第i个结点
p->next = q->next; // 第i-1个结点指向第i+1个结点
delete q; // 释放第i个结点
return true;
}
// 头插法,逆位序输入n个元素的值,建立带头结点的单链表
void createListHeadInsert(LinkList &L, int n) {
L = new LNode; // 初始化头结点
L->next = NULL;
LinkList p;
for (int i = 0; i < n; ++i) {
p = new LNode;
cin >> p->data;
// p结点插在头结点后
p->next = L->next;
L->next = p;
}
}
// 尾插法,正位序输入n个元素的值,建立带头结点的单链表
void createListTailInsert(LinkList &L, int n) {
L = new LNode;
L->next = NULL;
LinkList p = L, q; // p代表尾结点
for (int i = 0; i < n; ++i) {
q = new LNode;
cin >> q->data;
q->next = NULL;
// 新节点插在尾结点后
p->next = q;
// 更新尾结点
p = q;
}
}
// 打印带头结点的单链表
void printList(LinkList L) {
LinkList p = L->next;
while (p) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
int main() {
LinkList L; // 头指针
cout << "头插法创建10个元素的单链表:" << endl;
createListHeadInsert(L, 10);
printList(L);
for (int i = 1; i <= 5; ++i) {
listInsert(L, i * 3, 100);
}
printList(L);
for (int i = 1; i <= 5; ++i) {
listDelete(L, i * 2);
}
printList(L);
cout << "尾插法创建10个元素的单链表:" << endl;
createListTailInsert(L, 10);
printList(L);
for (int i = 1; i <= 5; ++i) {
listInsert(L, i * 3, 100);
}
printList(L);
for (int i = 1; i <= 5; ++i) {
listDelete(L, i * 2);
}
printList(L);
return 0;
}
[数据结构]--单链表的实现
最新推荐文章于 2022-04-10 15:08:25 发布