系列文章传送门:
数据结构与算法之树和二叉树(一):二叉树基本操作的实现及应用
数据结构与算法之线性表(二):链式表的实现和应用
数据结构与算法之线性表(三):顺序栈的实现和应用
数据结构与算法之线性表(四):链式栈的实现和应用
数据结构与算法之线性表(五):链式队列的实现和应用
数据结构与算法之线性表(六):顺序队列及循环队列的实现和应用
数据结构与算法之线性表(二):链式表的实现和应用
一.链式表基本操作实现(所有代码均在Embarcadero DevC++6.0和VSCode 2021上编译运行通过):
#include<stdio.h>
#include<stdlib.h>
#define ElemType int
#define LIST_INIT_SIZE 100 //顺序表总初始分配量
#define LISTINCREMENT 10 //顺序表间隔量
#define OVERFLOW -1
#define STACK_INIT_SIZE 10
#define STACKINCREMENT 2
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
//int InitList(Sqlist L); //构造一个空的线性表L
//ListEmpty(L); //判断线性表L是否是空表,若是,则返回TRUE,否则返回FALSE
//ListLength(L); //返回线性表L的长度
//GetElem(L,i,&e) ; //用e返回线性表L的第i个数据元素的值
//LocateElem(L,e,compare());//在线性表L中查找第一个和元素e满足compare关系//的元素,若找到则返回其位序;否则返回0
//PriorElem(L,e, &pre_e); //用pre_e返回线性表L中元素e的直接前驱
//NextElem(L, e, &next_e); //用next_e返回线性表L中元素e的直接后继
//ListInsert(&L,i,e) ; //将数据元素e插入到线性表L的第i个数据元素之前
//ListDelete(&L,i,&e); //删除线性表L的第i个数据元素,并将其值用e返回
//ListTraverse(L,visit()); //依次对线性表L中的每个元素调用visit进行访问
//ClearList(&L); //重置线性表L为空表
//DestroyList(&L); //销毁线性表L,可能的话释放其空间
typedef int Status;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
Status InitList(LinkList &L)
{
L = (LinkList)malloc(sizeof(LNode));//申请空间
if(!L) //判空
return OVERFLOW;
L->next = NULL;
return OK;
}
Status ListEmpty(LinkList &L) //判断线性表L是否是空表,若是,则返回TRUE,否则返回FALSE
{
if(!L)
return OK;
else
{
return FALSE;
}
}
Status DestroyList(LinkList &L) //销毁线性表L,可能的话释放其空间
{
LinkList p = (LinkList)malloc(sizeof(LNode));
while (L)
{
p = L->next;
free(L);
L = p;
}
return OK;
}
Status ClearList(LinkList &L)
{
LinkList p = (LinkList)malloc(sizeof(LNode));
for (p = L->next; p; p = L->next)
{
L->next = p->next;
free(p);
}
return OK;//销毁除表头以外的其他所有结�?
}
int ListLength(LinkList L) //返回线性表L的长�?
{
int count = 0;
LinkList p = (LinkList)malloc(sizeof(LNode));
p = L->next;
while(p)
{
count++;
p = p->next;
}
return count;
}
Status ListInsert(LinkList &L,int i,ElemType e) //将数据元素e插入到线性表L的第i个数据元素之�?
{
LinkList p = (LinkList)malloc(sizeof(LNode));
LinkList q = (LinkList)malloc(sizeof(LNode));
p= L;
int count = 0;
if(ListLength(L)>=1)
{
while (p && count+1<i)
{
count++;
p = p->next;
}
//退出循环时两种情况:i大于表长;找到待插入的元素位�?
if(!p) //若i大于表长
return FALSE;
q->next =p->next; //找到该位�?
p->next = q;
q->data = e;
}
else
{ //长度�?
q->next = L->next;
q->data = e;
L->next = q;
}
return OK;
}
Status ListDelete(LinkList &L,int i,ElemType &e) //删除第i个元�?
{
int count=0;
LinkList p = (LinkList)malloc(sizeof(LNode));
LinkList q = (LinkList)malloc(sizeof(LNode));
p = L;
while (p->next && count+1<i)
{
count++;
p = p->next;
}
q = p->next;
p->next = q->next;
e = q->data;
free(q);
return OK;
}
Status GetElem(LinkList L,int i,ElemType &e) //用e返回线性表L的第i个数据元素的�?
{
int count=1;
LinkList p = (LinkList)malloc(sizeof(LNode));
p = L->next;
while (p && count <i)
{
p = p->next;
count++;
}
if(!p||count>i) //因p==0而提前终�?
return FALSE;
e = p->data; //count==i即找到该数�?
return OK;
}
Status LocateElem(LinkList L,ElemType e)//在线性表L中查找第一个和元素e满足compare关系//的元素,若找到则返回其位序;否则返回0
{
if(!L)
return OVERFLOW;
LinkList p = (LinkList)malloc(sizeof(LNode));
p = L->next;
int i= 0;
while (p && e!=p->data)
{
p = p->next;
i++;
}
if(!p)//两种情况:表中无所寻元�?找到表中元素
return 0;
return i;
}
Status ListTraverse(LinkList L,Status (*visit)(ElemType )) //依次对线性表L中的每个元素调用visit进行访问
{
LinkList p = (LinkList)malloc(sizeof(LNode));
p = L->next;
while (p)
{
if(!visit(p->data)) //若访问失�?
return ERROR;
p = p->next;
}
return OK;
}
Status print(ElemType e )
{
printf("%d->",e);
return OK;
}
int main()
{
LinkList L;
ElemType e;
InitList(L);
for (int i = 1; i <= 10; i++)
{
ListInsert(L,i,i);
}
ListDelete(L,5,e);
if(ListTraverse(L,print))
printf("\nOK\n");
else
printf("\nERROR\n");
return 0;
}