实现代码:
线性链表存储.cpp
#include "pch.h"
#include <iostream>
#include <cstdlib>
#include "LinkList.h"
using namespace std;
int main()
{
LinkList ls;
//初始化
InitList(&ls);
//插入数据
for (int i = 0; i < 10; ++i) {
ListInsert(&ls, i, i + 5);
}
//遍历链表
for (int i = 0; i < ListLength(ls); ++i) {
int tmp;
GetElem(ls, i, &tmp);
cout << "elem value = " << tmp << endl;
}
//删除全部
while (ListEmpty(ls) != 1) {
int tmp;
//逐个删除
ListDelete(&ls, 0, &tmp);
cout << "删除值 = " << tmp << endl;
}
//销毁链表
DestroyList(&ls);
std::cout << "Hello World!\n";
}
LinkList.cpp
#include "pch.h"
#include "LinkList.h"
#include <cstdlib>
//初始化链表
void InitList(LinkList *L) {
//初始化
L->length = 0;
L->header.next = NULL;
}
//判断链表是否为空
int ListEmpty(LinkList L) {
if (L.length == 0) {
return 1;
}
return 0;
}
//清空当前链表
void ClearList(LinkList *L) {
//删除并释放所有结点
while (L->length) {
int tmp;
ListDelete(L, 0, &tmp);
}
}
//获取指定位置节点的值
void GetElem(LinkList L, int pos, int *e) {
//错误检查
if (pos < 0 || pos >= L.length) {
return;
}
//定义辅助指针,指向头结点
Node *pCur = &(L.header);
//遍历链表,找到pos位置
for (int i = 0; i <= pos; ++i) { //i执行了pos+1次
//辅助指针后移
pCur = pCur->next;
}
//取值
*e = pCur->data;
}
//在链表中间的pos位置插入值为e的结点
void ListInsert(LinkList *L, int pos, int e) {
//错误检查
if (pos < 0 || pos > L->length) {
return;
}
//定义辅助指针,指向头结点
Node *pCur = &(L->header);
//遍历链表,找到pos位置
for (int i = 0; i < pos; ++i) { //i执行了pos次
//辅助指针后移
pCur = pCur->next;
}
//创建新结点
Node * pNew = (Node *)malloc(sizeof(Node));
//初始化
pNew->data = e;
//插入结点操作(对指针域进行操作)
//先连接后半部分
pNew->next = pCur->next;
pCur->next = pNew;
//长度+1
L->length++;
}
//删除pos位置的结点
void ListDelete(LinkList *L, int pos, int *e) {
//错误检查
if (pos < 0 || pos >= L->length) {
return;
}
if (L->length == 0) {
return;
}
//定义辅助指针,指向头结点
Node *pCur = &(L->header);
//遍历链表,找到pos位置
for (int i = 0; i < pos; ++i) { //i执行了pos次
//辅助指针后移
pCur = pCur->next;
}
//定义辅助指针
Node * pDel = pCur->next;
//保存pos结点位置的值
*e = pDel->data;
//从链表中删除结点
pCur->next = pDel->next;
//释放内存
free(pDel);
//长度-1
L->length--;
}
//链表的长度
int ListLength(LinkList L) {
return L.length;
}
//销毁链表
void DestroyList(LinkList *L) {
//如果typedef struct LINKLIST中Node header;为Node *header;就需要销毁
//这里我们不需要销毁,只调用个清空就行
ClearList(L);
}
LinkList.h
#pragma once
#ifndef _LINKLIST_H
#define _LINKLIST_H
#include "pch.h"
typedef int ElemType;
typedef struct NODE
{
ElemType data; // 数据
struct NODE *next; // 指向后继节点的指针
}Node;
typedef struct LINKLIST //管理链表的结构体
{
int length;
Node header;
}LinkList;
//初始化链表
void InitList(LinkList *L);
//判断链表是否为空
int ListEmpty(LinkList L);
//清空当前链表
void ClearList(LinkList *L);
//获取指定位置节点的值
void GetElem(LinkList L, int pos, int *e);
//在链表的pos位置插入值为e的结点
void ListInsert(LinkList *L, int pos, int e);
//删除pos位置的结点
void ListDelete(LinkList *L, int pos, int *e);
//链表的长度
int ListLength(LinkList L);
//销毁链表
void DestroyList(LinkList *L);
#endif