数据结构与算法之线性表(二):链式表的实现和应用

系列文章传送门:

数据结构与算法之树和二叉树(一):二叉树基本操作的实现及应用
数据结构与算法之线性表(二):链式表的实现和应用
数据结构与算法之线性表(三):顺序栈的实现和应用
数据结构与算法之线性表(四):链式栈的实现和应用
数据结构与算法之线性表(五):链式队列的实现和应用
数据结构与算法之线性表(六):顺序队列及循环队列的实现和应用

数据结构与算法之线性表(二):链式表的实现和应用

一.链式表基本操作实现(所有代码均在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;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值