3.2 单向链表
顺序表适用于不常进行插入或删除的操作,链表插入和删除非常高效,但访问不是很方便。
线性表的链式存储的特点是用一组任意的存储单元存储线性表的数据元素(可连续,可不连续)。
3.2.1 单链表和指针
结点中存储数据元素的域称为数据域(设域名为data),存储直接后继存储位置的域称为指针域(设域名为next)
/***********************************************************************************************************************
[单链表操作]
[1] destroyList, 销毁单链表
[2] initList, 初始化一个带头结点的空单链表,如果传入一个不为空的单链表,将被重置
[3] insertElem, 在单链表中第 i 个位置插入元素 elem
[4] removeElem, 在单链表中移除第 pos 个元素,并由 elem 返回其值
[5] createList, 根据数组 elems 构建一个单链表
[6] isEmptyList, 判断单链表是否为空
[7] getElem, 获取单链表上位置为 pos 的元素
[8] locateElem, 获取元素 elem 在单链表上第一次出现的位置,如果不存在返回 -1
[9] getLength, 获取单链表长度
[10] printList, 打印整个单链表
[11] reverseList, 反转单链表
***********************************************************************************************************************/
LinkList.h
#pragma once
#include <iostream>
using namespace std;
#define MAXSIZE 5;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
LNode *next;
}LNode;//主要分号的位置上,还有一种写法: //LNode, *LinkList;
void destroyList(LNode* &pHead)
{
//方式1,间隔切断链表
//LNode* p = pHead;
//LNode* q = NULL;
//while (p && p->next)
//{
// q = p->next;
// p = q->next;
// free(q);
// q = NULL;
//}
//free(pHead);
//pHead = NULL;
//方式2 依次摧毁
if (pHead == NULL)
{
return;
}
LNode* p = NULL;
while (pHead)//画结点图就很清楚了
{
p = pHead->next;
free(pHead);
pHead = p;
}
}
void initList(LNode * &pHead)
{
if (pHead != NULL)
{
destroyList(pHead);
}
LNode* p = (LNode*)malloc(sizeof(LNode));//sizeof(LNode) == 8
p->data = 1;
p->next = NULL;
//cout << sizeof(p) << sizeof(p->data) << sizeof(p->next) << sizeof(LNode);//32位:4 4 4 8 。64位:8 4 8 16。
pHead = p;
}
void creatList(LNode* &pHead,const ElemType a[], const int len)
{
if (pHead == NULL)
{
return;
}
LNode *q = pHead;
LNode *p = NULL;
for (int i = 0; i < len; ++i)
{