鉴于老师上课讲的东西太抽象,理论性也太强,估计好多同学都不知老师在说些什么,所以我把线性表的实现用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;
}