#include<iostream>
using namespace std;
typedef int Elemtype;
typedef struct Lnode {
Elemtype data;
struct Lnode* next;
}Lnode, * LinkList;
void InitList(LinkList &L)
{
L = (Lnode*)malloc(sizeof(Lnode));
L->next = NULL;
//空表判断方法:L->next==NULL;
}
//按位序插入:在第i个位置插入元素e
bool ListInsert(LinkList& L, int i, Elemtype e)
{
if (i < 1) return false;
Lnode* p = L;//指针p指向当前扫描到的结点,初始化为头结点
int jp = 0;//jp用于跟踪p当前指向的结点位置
while (p != NULL && jp < i - 1)
{
p = p->next;
jp++;
}
if (p == NULL) return false;//链表长度小于i-1
//找到插入的位置后
Lnode* s = (Lnode*)malloc(sizeof(Lnode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
//指定结点的后插操作(在p结点之后插入元素e)
bool InsertNextNode(Lnode* p, Elemtype e)
{
if (p == NULL) return false;//p结点必须存在
//将s连接在p结点后
Lnode* s = (Lnode*)malloc(sizeof(Lnode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
//指定结点的前插操作
bool InsertLastNode(Lnode* p, Elemtype e)
{
if (p == NULL) return false;// p结点必须存在
//这里先在P结点之后连接一个结点S,然后再交换这两个结点的数据,S结点就在P结点前面了
Lnode* s = (Lnode*)malloc(sizeof(Lnode));
// 新节点s接收p节点的数据
s->data = p->data;
s->next = p->next;
p->next = s;
// 将新数据赋值给p结点
p->data = e;
return true;
}
//按位序删除:删除表 L 中第 i 个位置的元素,并用e 返回删除元素的值
bool ListDelete(LinkList& L, int i, Elemtype& e)
{
if (i < 1) return false;
Lnode* p = L;//指针p指向当前扫描到的结点
int jp = 0;//当前jp(p)指向的是第几个结点
while (p != NULL && jp < i - 1)
{
p = p->next;
jp++;
}
if (p == NULL) return false;//i值要合法
if (p->next == NULL) return false;//准备删除的结点必须存在
Lnode* q = p->next;//令q指向被删除结点(可简化代码)
e = q->data;
p->next = q->next;
free(q);//记得要释放内存
return true;
}
//指定结点的删除操作(删除结点p)
bool DeleteNode(Lnode* p)
{
if (p == NULL || p->next == NULL) return false; // 确保p结点存在且不是最后一个结点
Lnode* q = p->next;
p->data = q->data;
p->next = q->next;
free(q); //记得要释放内存
return true;
}
//尾插法
LinkList CreatList_back(LinkList& L)
{
int n;
cin >> n;
L = (LinkList)malloc(sizeof(Lnode));
Lnode* s, * r = L;
for (int i = 0; i < n; ++i)
{
int x;//假设插入n个整型x;
cin >> x;
s = (Lnode*)malloc(sizeof(Lnode));
s->data = x;
r->next = s;
r = s;
}
r->next = NULL;
return L;
}
//头插法
LinkList CreatList_head(LinkList& L)
{
int n;
cin >> n;
L = (LinkList)malloc(sizeof(Lnode));//建立头结点
L->next = NULL;//注意这里
Lnode* s;
for (int i = 0; i < n; ++i)
{
int x;//假设插入n个整型x;
cin >> x;
s = (Lnode*)malloc(sizeof(Lnode));
s->data = x;
s->next = L->next;
L->next = s;
}
return L;
}
int main() {
LinkList L;
Elemtype e;
bool result;
// 初始化链表
InitList(L);
// 使用尾插法创建链表
cout << "Creating list by appending elements...\n";
CreatList_back(L);
for (Lnode* p = L->next; p != NULL; p = p->next) {
cout << p->data << " ";
}
cout << "\n";
// 使用头插法创建链表
cout << "Creating list by prepending elements...\n";
CreatList_head(L);
for (Lnode* p = L->next; p != NULL; p = p->next) {
cout << p->data << " ";
}
cout << "\n";
// 在第2个位置插入元素 99
cout << "Inserting 99 at position 2...\n";
result = ListInsert(L, 2, 99);
if (result) {
for (Lnode* p = L->next; p != NULL; p = p->next) {
cout << p->data << " ";
}
cout << "\n";
}
// 删除第3个元素
cout << "Deleting element at position 3...\n";
result = ListDelete(L, 3, e);
if (result) {
cout << "Deleted element: " << e << "\n";
for (Lnode* p = L->next; p != NULL; p = p->next) {
cout << p->data << " ";
}
cout << "\n";
}
// 在指定节点后插入元素 77 (假设有足够节点)
cout << "Inserting 77 after the first node...\n";
result = InsertNextNode(L->next, 77);
if (result) {
for (Lnode* p = L->next; p != NULL; p = p->next) {
cout << p->data << " ";
}
cout << "\n";
}
// 在指定节点前插入元素 88 (假设有足够节点)
cout << "Inserting 88 before the second node...\n";
result = InsertLastNode(L->next, 88);
if (result) {
for (Lnode* p = L->next; p != NULL; p = p->next) {
cout << p->data << " ";
}
cout << "\n";
}
return 0;
}
对单链表的操作
最新推荐文章于 2024-07-09 19:36:25 发布