每一种数据类型都有一些基本的操作运算,今天规范一下单链表的基本运算
【链表操作集】--增删改查
typedef struct ListNode{ ......}LNode //定义链表结构体
InitList(LNode*&L) //初始化链表
DestroyList(LNode*& L) //销毁链表
EmptyList(LNode* L) //判断链表是否为空
LengthList(LNode* L) //求链表的长度
DispList(LNode* L) //输出链表
LocateElem(LNode* L, ElemType e) //查询元素位置
GetElem(LNode* L, int i, ElemType &e) //访问指定位置的元素
InserList(LNode*& L, int i, ElemType e) //插入元素
DeleteList(LNode*& L, int i, ElemType& e) //删除元素一、定义结构体
typedef char ElemType;
//定义单链表结构体
typedef struct LNode {
ElemType data;
struct LNode* next;
}LinkNode;二、链表的头插法与尾插法
//头插法插入元素----逆序
void CreateListF(LinkNode*& L, ElemType a[], int n)
{
LinkNode* s;
L = new LinkNode;
L->next = NULL;
for (int i = 0; i < n; i++)
{
s = new LinkNode;
s->data = a[i];
s->next = L->next;
L->next = s;
}
}头插法是指在链表头插入新元素,所以实际的逻辑顺序跟物理顺序是相反的
//尾插法插入元素----正序
void CreateListR(LinkNode*& L, ElemType a[], int n)
{
LinkNode* s, * r;
L = new LinkNode;
r = L;
for (int i = 0; i < n; i++)
{
s = new LinkNode;
s->data = a[i];
r->next = s;
r = s;
}
r->next = NULL;
}三、链表的九大操作
// 1.初始化链表
void InitList(LinkNode*& L)
{
L = new LinkNode; //or L = (LinkNode *) malloc (sizeof(LNode)) new比较慢;
L->next = NULL;
}
// 2.销毁链表
void DestroyList(LinkNode*& L)
{
LinkNode* pre = L, * p = L->next;
while (p != NULL)
{
free(pre);
pre = p;
p = p->next;
}
free(pre);
}
// 3.判断链表是否为空
bool EmptyList(LinkNode* L)
{
return NULL == L->next;
}
// 4.求链表的长度
int LengthList(LinkNode* L)
{
int cnt = 0;
LinkNode* p = L;
while (p->next != NULL)
{
cnt++;
p = p->next;
}
return cnt;
}
// 5.输出链表
void DispList(LinkNode* L)
{
LinkNode* p = L->next;
while (p!= NULL)
{
printf("%c ", p->data);
p = p->next;
}
printf("\n");
}
//6.查找链表元素位置
int LocateElem(LinkNode* L, ElemType e)
{
int i = 1;
LinkNode* p = L->next;
while (p!= NULL && p->data != e) //由于&运算存在短路现象,这两个条件千万不能调换
{
p = p->next;
i++;
}
if (p == NULL) return 0; //p==NULL 说明遍历完了也找不到
return i;
}
//7.查找链表第i位元素并返回是什么元素
bool GetElem(LinkNode* L, int i, ElemType & e)
{
int j = 0;
LinkNode* p = L;
if (i <= 0) return false; //越界
while (j < i && p != NULL)
{
j++;
p=p->next;
}
if (p == NULL) //没有第i个节点
return false;
e = p->data;
return true;
}
//8.在第i位插入数据元素e----(单链表:必须找到它的前驱节点 )
bool InserList(LinkNode*& L, int i, ElemType e)
{
int j = 0;
LinkNode* p = L, * s;
if (i <= 0) return false;
while (j < i - 1 && p != NULL) //找到前驱节点
{
j++;
p = p->next;
}
if (p == NULL) return false;
else { //头插法
s = new LinkNode;
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
}
// 9.删除链表第i元素,并返回是什么元素---(找到前驱节点,直接改变指针的指向)
bool DeleteList(LinkNode*& L, int i, ElemType& e)
{
int j = 0;
LinkNode* p = L, * q;
if (i <= 0)return false;
while (j < i - 1 && p != NULL)
{
j++;
p = p->next;
}
if (p == NULL) return false;
else {
q = p->next;
if (q == NULL)return false; //没有第i个节点
e = q->data;
p->next = q->next;
free(q);
return true;
}
}图解日后完善!!!
本文介绍了单链表的基本操作,包括初始化、销毁、判断空、计算长度、输出、查找元素位置、访问元素、插入和删除元素。还详细展示了头插法和尾插法的实现,以及链表的九大操作的C语言代码实现。
341

被折叠的 条评论
为什么被折叠?



