线性表

您所在的位置:网站首页 c语言建立线性表的步骤 线性表

线性表

2024-05-21 08:43| 来源: 网络整理| 查看: 265

代码里面的一些 define先了解一下:

#define LIST_INIT_SIZE 100 //线性表的初始建立长度 #define LISTINCREMENT 10 //每次增加的长度#define ElemType int //线性表的存储的基本数据型 #define OK 1 #define OVERFLOW -2 #define ERROR -1 #define Status int

 

 我用的书是严蔚敏的《数据结构(C语言版)》 紫色书。

书上的代码都很好理解,学习时候碰到过的小问题会总结提醒一下。

1. 函数会出现 类似于 void MergeList(List La,List Lb, List &Lc) 这样的函数定义,一开始我也是直接照着抄上了,记着在用C++时用过,结果一直报错,

百度一下发现,C语言是没有&Lc这种形式的形参的,在C++中叫做引用。

2. 所以传入函数的应该是线性表的地址,函数里面对线性表的操作都要用指针实现  例如:L.length  要改成 L->length

 

1 Status InitList_Sq(Sqlist *L) 2 { //构造一个空的线性表 3 L->elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); 4 if(!L->elem) exit(OVERFLOW); //储存分配失败 5 L->length = 0; //空表长度为0 6 L->listsize = LIST_INIT_SIZE; //初始存储容量 7 return OK; 8 }//InitList_Sq 1 Status ListInsert_Sq(Sqlist *L, int i, ElemType e) 2 { 3 //在顺序线性表L中第i个位置之前插入新的元素e 4 //i的合法值为1length + 1) return ERROR;//i值不合法 8 if(L->length >= L->listsize) //当前存储空间已满,增加分配 9 { 10 newbase = (ElemType *)realloc(L->elem, 11 (L->listsize + LISTINCREMENT)*sizeof(ElemType)); 12 if(!newbase) return ERROR; //分配失败 13 L->elem = newbase; //新基址 14 L->listsize += LISTINCREMENT; //增加存储容量 15 } 16 q = &L->elem[i-1]; //q为插入位置 17 for(p = &L->elem[L->length-1]; p >= q; --p) 18 *(p+1) = *p; //插入位置及之后的元素后移 19 *q = e; //插入e 20 L->length++; //表增长1 21 return OK; 22 }//ListInsert_Sq 1 Status ListDelete_Sq(Sqlist *L, ElemType i, ElemType *e) 2 { 3 //在顺序线性表L中删除第i个元素,并用e返回其值 4 //i的合法值为1length + 1) return ERROR;//i 值不合法 7 8 p = &L->elem[i-1]; //p为被删除元素的位置 9 *e = *p; //被删除元素的值赋给e 10 q = &L->elem[i] + L->length - 1;//表尾元素的位置 11 for(++p; p length--; //表长减一 14 return OK; 15 }//ListDelete_Sq

下面的完整代码,可以试一试:

#include #include #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define ElemType int #define OK 1 #define OVERFLOW -2 #define ERROR -1 #define Status int typedef struct{ ElemType *elem;//存储空间基址 int length; //当前长度 int listsize; //当前分配的存储容量 }Sqlist; Status InitList_Sq(Sqlist *L) { //构造一个空的线性表 L->elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); if(!L->elem) exit(OVERFLOW); //储存分配失败 L->length = 0; //空表长度为0 L->listsize = LIST_INIT_SIZE; //初始存储容量 return OK; }//InitList_Sq Status ListInsert_Sq(Sqlist *L, int i, ElemType e) { //在顺序线性表L中第i个位置之前插入新的元素e //i的合法值为1length + 1) return ERROR;//i值不合法 if(L->length >= L->listsize) //当前存储空间已满,增加分配 { newbase = (ElemType *)realloc(L->elem, (L->listsize + LISTINCREMENT)*sizeof(ElemType)); if(!newbase) return ERROR; //分配失败 L->elem = newbase; //新基址 L->listsize += LISTINCREMENT; //增加存储容量 } q = &L->elem[i-1]; //q为插入位置 for(p = &L->elem[L->length-1]; p >= q; --p) *(p+1) = *p; //插入位置及之后的元素后移 *q = e; //插入e L->length++; //表增长1 return OK; }//ListInsert_Sq Status ListDelete_Sq(Sqlist *L, ElemType i, ElemType *e) { //在顺序线性表L中删除第i个元素,并用e返回其值 //i的合法值为1length + 1) return ERROR;//i 值不合法 p = &L->elem[i-1]; //p为被删除元素的位置 *e = *p; //被删除元素的值赋给e q = &L->elem[i] + L->length - 1;//表尾元素的位置 for(++p; p length--; //表长减一 return OK; }//ListDelete_Sq int main() { Sqlist L; if(!InitList_Sq(&L)) exit(OVERFLOW); int a[ ] = {12, 13, 21, 24, 28, 30, 42, 77};//线性表的元素 for(int i=0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3