线性表的C语言实现

这篇博客详述了如何使用C语言实现线性表,旨在帮助理解抽象的理论知识。作者提供了完整代码,并强调注释详细,适合学习和复习C语言。如果遇到困难,作者鼓励读者留言交流,同时推荐关注其微博@挨踢实习生,代码已在VC6.0环境下通过编译和运行。
摘要由CSDN通过智能技术生成

鉴于老师上课讲的东西太抽象,理论性也太强,估计好多同学都不知老师在说些什么,所以我把线性表的实现用C语言完整的写出来,供大家学习参考,并且也让我温习一下C的知识。希望这样能给大家提供或多或少的帮助


我会尽可能的将注释写全,

如果还是看不懂的话,建议先把C语言的书在抱起来看一看。

或者是请教一下别的同学。


有问题的童鞋请在下边留言,我会及时解答。

并且记得关注一下我的微博!@挨踢实习生


以下代码已在VC6.0下编译运行通过。


#include <stdio.h>
#include <stdlib.h>

#define TRUE 1 //TRUE为1
#define FALSE 0 //FALSE为0
#define MAXSIZE 11 //MAXSIZE为11

typedef int elemType;//给int取别名为elemType,后边的代码可以直接用elemType取代int

typedef struct //声明并定义一个结构体
{
    elemType *list;
    int length;//记录表中元素给出(下文中用我会直接说表长)
	
	//大家可能发现我这里缺少一个 int size;
	//来记录表的总共的长度(一共可存放的元素个数),我觉得这个没必要,大家如果觉得有用可自己加上
	//如果加上后,后边的代码也需要修改
}sqList;//给这个结构体取别名为sqList

//init
void initList(sqList *L)//初始化线性表
{
    L->length = 0;//将表长至为0
    L->list = (elemType*)malloc(MAXSIZE * sizeof(elemType));//向内存申请存放MAXSIZE个elemType的空间(在本程序中,MAXSIZE为11,elemType代表int)

    if(!L->list)//检查内存是否分配成果,若分配失败则退出
    {
        printf("failure!\n");//分配失败后提示
    	exit(0);
    }
    printf("init success!\n");//分配成功后提示
    return;
}

//destroy
void destroyList(sqList *L)//销毁线性表
{
    if(!L->list)//检查表是否真的存在,若不存在,则退出
    {
        printf("not exit!\n");//若表不存在,提示not exit
        exit(0);
    }
    free(L->list);//释放空间
    L->list = NULL;//将list至为空指针,防止垂悬指针
    L->length = 0;//将length至为0
    printf("destroy successful ! \n");//销毁成功后提示
    return;
}

//clear
void clearList(sqList *L)//清空线性表
{
    if(!L->list)//检查表是否存在,若存在,讲表长至为0
	{
        L -> length = 0;
    }
    return;
}

//isEmpty
int listEmpty(sqList *L)//判断表是否为空
{
    return L->length == 0 ? TRUE : FALSE;//若为空返回TURE,不空返回FALSE
	/*
	上边那条语句等价于

	if(L->length == 0)
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}

	 一定要学会用最简洁的语句表达自己的目的。
	*/
}

//return the count of L
int listLength(sqList *L)//检测表中元素个数
{
    return L->length;//因为length就是记录的元素个数,所以直接将length返回即可
}

//return element of the position
elemType getElem(sqList *L, int i)//获取表中元素
{
    if(i<1 || i > listLength(L))//检查我们给定的位置是否在合理范围之内(即大于1小于length),若不在,则退出
    {
        printf("out of bound!");//没有在合理范围内的提示
        exit(0);
    }
    return L->list[i-1];//返回表中对应元素的值,为什么是i-1大家自己想
}

//return index of the element, if not exit return 0
int locateElem(sqList *L, elemType e)//在表中查找元素
{
    elemType *p = L->list;
    int i = 0;
    while(i < listLength(L) && *p != e)//检查有没有到达表尾,同时检查是否使我们想要查找的值
    {
        p++;							//若不是,则指向下一元素
        i++;							//i是用来检查是否到达表尾的数字
    }

    if(i == listLength(L))				//如果最后i的值为表长,说明没找到
	{
		i = -1;							//将i至为-1
    }

    return i+1;							//返回i+1的值,若为0则说明未找到
}

//insert element
void listInsert(sqList *L, int i, elemType e)//向表中插入元素
{
    if(i < 1 || i > listLength(L) + 1)//检查插入位置是否合法,若不合法则退出
    {
	    printf("out of bound, insert failure !\n");//不合法提示
	    exit(0);
    }

    if(listLength(L) >= MAXSIZE)//检查表是否已满,若表中元素大于MAXSIZE则插入失败
    {
	    printf("full, insert failure !\n");
	    exit(0);
    }
	
    int j = listLength(L);//将表长赋给j
    while(j >= i)//如果j在我们想插入的位置的后边,则向后移动个位置
    {
	    L->list[j] = L->list[j-1];
	    j--;
    }

    L->list[i-1] = e;//插入我们想插入的元素
    L->length++;//表长加1
    return;
}

//delete element and return this element
elemType listDelete(sqList *L, int i, elemType e)//删除对应位置上的元素,并返回所删除元素的值
{
    if(i < 1 || i > listLength(L))//检查我们想删除元素的位置是否合法,若不合法则退出
    {
	    printf("out of bound delete failure !\n");
	    exit(0);
    }
    e = L->list[i-1];//将我们想删除的元素赋值给e,以便一会返回

    while(i < listLength(L) + 1)//将想删除位置的元素后边的所有元素依次前移
    {
	    L->list[i-1] = L->list[i];
	    i++;
    }
	
    L->length--;//表长减1
    return e; //将删除的元素返回,以便查看我们删除的是几
}

//traverse sqList
void listTraverse(sqList *L)//遍历线性表
{
    int i;

    for(i = 0; i < listLength(L); i++)//从下标0开始,到表长减1依次遍历
    {
	    printf("%d ", L->list[i]);//依次打印每个元素的值
    }

    printf("\n");
    return;
}

int main()
{
	//下边对这个线性表进行测试!

    sqList L;  //声明一个线性表

    initList(&L);  //初始化线性表

    listInsert(&L, 1, 23);  //在第一个位置插入23
    listInsert(&L, 1, 12);  //在第一个位置插入12
    listInsert(&L, 1, 1);   //在第一个位置插入1
	//注意是在第一个位置! 所以现在表中元素为1 12 23

    printf("共有%d个元素\n", listLength(&L));  //查看表中元素个数  此时应该为3

    listTraverse(&L);  //遍历线性表

    elemType e;  //还记不记得我最前边说的elemType是什么吗?
    e = listDelete(&L, 1, e); //删除位置1上的元素,并将删除的元素赋值给e 
    printf("被删除元素是:%d\n", e);  //查看删除元素的值

    printf("共有%d个元素\n", listLength(&L));  //再次查看表中元素个数

    listTraverse(&L);  //再次遍历线性表

    //e = L.list[0]; //将表中第一个元素赋值给e 
	int i = 23;
    printf("元素%d的位置是:%d\n", i, locateElem(&L, i));  //查看表中有没有值为23的元素并打印

    e = getElem(&L, 1);  //获取位置1的元素并赋值给e
    printf("1号元素是:%d\n", e);  //打印位置1的元素的值
    destroyList(&L);  //销毁表

    return 0;
}


  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值