【数据结构】C语言实现顺序表

来源:互联网 发布:网络安全产品排名榜 编辑:程序博客网 时间:2024/04/28 07:43

这是自己上数据结构课程时候的练习,贴出来,供大家参考一下,注释写的很详细,main函数里有测试的代码.


#include "stdafx.h"#include<stdio.h>#include<stdlib.h>#define LIST_INIT_SIZE 100#define LIST_INCREASMENT 10#define FALSE 0#define TRUE 1#define ERROR 0#define OK 1typedef int ElemType;//定义的数据元素的类型,之所以设置为ElemType是考虑到可扩展行的原因,如果想把数据元素的类型修改成其他的话,只需要在这里修改一次据好了,比较方便typedef int Status;/***定义线性表的数据结构*/typedef struct{ElemType *base;//base为线性表指向线性表起始地址的指针int length;//length为当前线性表的长度int listSize;//listSize为线性表的总长度} SqList;/*创建线性表*/void initList(SqList *L){L->listSize = LIST_INIT_SIZE;  //初始化线性表的总长度为我们事先定义好的LIST_INIT_SIZE,也就是100L->base = (ElemType *)malloc(L->listSize * sizeof(ElemType));  //为线性表申请内存空间,大小为线性表的总长度 乘以 每一个元素所占空间的大小L->length = 0;//创建线性表的时候没有数据元素,长度默认为0}/***判断顺序表是否为空*/bool listEmpty(SqList *L){return L->length == 0;}/***得到线性表当前的长度*/int listLength(SqList *L){if(L->length >= 0 && L->length <= L->listSize){return L->length;} else{return -1;}}/***线性表的插入操作*/Status listInsert(SqList *L, int i, ElemType e){//我们这里传入的i是用户眼中的位置,意思就是从1开始,而不是从程序员熟悉的0开始int k;if(L->length == L->listSize){printf("线性表已满,不能插入");return ERROR;}if(i<1 || i>L->length + 1){printf("插入的位置不正确");return ERROR;}if(i <= L->length){  //若插入的位置不在表尾for(k=L->length - 1; k>i - 1; k--){L->base[k + 1] = L->base[k];}}L->base[i - 1] = e;L->length = L->length + 1;return OK;}/***删除一个表中的元素*/Status listDelete(SqList *L, int i, ElemType *e){int k;//这里的e是用来暂存被删除的元素的if(L->length == 0){//如果表为空的话,则返回错误return ERROR;}if(i<1 || i>L->length){//如果删除的位置不正确return ERROR;}*e = L->base[i - 1]; if(i < L->length){for(k=i; k<L->length; k++){L->base[k - 1] = L->base[k];}}L->length = L->length - 1;return OK;}/***得到指定位置的元素的值*/ElemType getElem(SqList *L, int i){if(i<1 || i>L->length){//先做检查return ERROR;}return L->base[i - 1];//结果一返回值的形式得到}/***得到指定位置元素的前驱*/ElemType priorElem(SqList *L, int i){if(i<1 || i>L->length){//先做检查return ERROR;}if(i != 1){return L->base[i-2];} else {printf("线性表的第一个元素没有前驱,操作错误!");return ERROR;}}/***得到指定位置元素的后继*/ElemType nextElem(SqList *L, int i){if(i<1 || i>L->length){//先做检查return ERROR;}if(i != L->length){return L->base[i];} else {printf("线性表的最后一个元素没有后继,操作错误!");return ERROR;}}/***清空线性表*/bool clearList(SqList *L){if(L->length>0 && L->length<L->listSize){L->length = 0;return OK;} else{return ERROR;}}/***销毁线性表*/Status destroyList(SqList *L){clearList(L);//先清空线性表L->listSize = 0;//把线性表的总长度归零free(L->base);//释放内存空间if(L->base == NULL && L->length == 0 && L->listSize == 0){//最后再进行确认return TRUE;} else{return FALSE;}}/***遍历当前线性表,打印输出所有的元素*/void listTraverse(SqList *L)  {      ElemType *p;      int i;      p = L->base;        for(i = 1; i <= L->length; i++)      {          printf("%d ", *(L->base + i - 1));      }        printf("\n\n");  }  /***定位一个指定的值在线性表里的具体位置*/int LocateElem(SqList *L, int e)  {      ElemType *p;      int i = 1; // i的初值为第1个元素的位序      p = L->base; // p的初值为第1个元素的存储位置        while(i <= L->length && *(p++) != e){          ++i;      }        if(i <= L->length)      {          return i;      }      else      {          return 0;      }    }  int _tmain(int argc, _TCHAR* argv[]){ElemType e;char ch = NULL;SqList L;initList(&L);//创建一个表printf("创建线性表后\n线性表的当前长度:%d", L.length);printf("\n线性表的总长度:%d", L.listSize);if(listEmpty(&L)){//判断表是否为空printf("\n此时线性表为空");} else {printf("\n此时线性表不为空");}//插入一个元素if(listInsert(&L, 1, 500)){printf("\n第一个元素的值:%d", getElem(&L, 1));}printf("\n线性表的当前长度:%d", L.length);if(listInsert(&L, 2, 1000)){printf("\n第二个元素的值:%d", getElem(&L, 2));}printf("\n线性表的当前长度:%d", L.length);if(listInsert(&L, 3, 2000)){printf("\n第三个元素的值:%d", getElem(&L, 3));}printf("\n线性表的当前长度:%d\n", L.length);listTraverse(&L);printf("\n第二个元素的前驱是:%d", priorElem(&L, 2));printf("\n第二个元素的后继是:%d", nextElem(&L, 2));if(listDelete(&L, 1, &e)){printf("\n被删除的元素的值:%d", e);}printf("\n线性表的当前长度:%d\n", L.length);listTraverse(&L);scanf("%c", &ch);return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 1969年退伍的退伍证丢了怎么办 江苏移动没实名认证停机了怎么办呀 亿达老年手机来电音量太大怎么办 挑三十六乘二的内螺纹丝瞳毛怎么办 内六角螺丝的冒滑了怎么办 孔里的内六角滑了怎么办 十字螺丝刀的头卡在螺母里怎么办 内六角扳手断在螺丝孔里怎么办 六棱螺丝刀折进螺丝里了怎么办 内6棱螺丝拧花了怎么办 只有pe模式可以用键盘鼠标怎么办 电脑重做了系统连不上无线网怎么办 联想手机死机了怎么办不可拆卸电池 手机界面弹出后大小无法调整怎么办 方向盘打方向瑟瑟的吱吱响怎么办 三脚架提升杆螺丝滑丝了怎么办 花土里面有很多细长的螺丝怎么办 防盗门外边上边缝宽螺丝松了怎么办 填充墙与框架梁不对齐怎么办 亚轧滚珠丝杠螺帽超程了怎么办 在公司交的五险一金辞职了怎么办 铝合金的渣子整到眼睛里怎么办 铁锅手柄上的铆钉拧不动怎么办 喂完鱼鱼缸上边飘着一层油膜怎么办 铸铁管道横着排的结口漏水怎么办 缤智行李架免打孔螺丝款怎么办 前保险杠和叶子板缝隙大怎么办 新奥拓的大灯调节螺丝滑丝了怎么办 小米手环2计步不准怎么办 小米手环3计步不准怎么办 眼镜用洗发水洗了后模糊怎么办 雷朋近视镜眼镜腿折了怎么办 近视镜眼镜腿断了该怎么办 老师把学生的眼镜打坏了怎么办 生死狙击忘了密保改不了密码怎么办 我叫mt狂猎之弓怎么办 你能利用你的弱点打击你怎么办 研控两相混合伺服电机反转怎么办? 战地一要我升级显卡驱动怎么办 刺客信条兄弟会存档损坏了怎么办 电脑上所有软件和文件被删了怎么办