线性表
(看的是严蔚敏清华大学的数据结构(C语言版))
1、线性表:最常用最简单的数据结构,是一个n个数据元素的有限序列。
2、理解重点:顺序存储,任意存取
3、实现线性表前的一些宏定义以及typedef
1 #define LIST_INIT_SIZE 100//存储空间初始分配量 2 #define LISTINCREMENT 10//存储空间的分配增量 3 4 #define ERROR 0 5 #define OK 1 6 #define TURE 1 7 #define FALSE 0 8 9 typedef int ElemType; 10 typedef int Status;
线性表的存储结构
1 typedef struct{ 2 ElemType *elem; //存储空间基址 3 int length;//当前长度 4 int listsize;//当前分配的长度 5 }SqList;
4、部分算法。
1、初始化空表
1 2 3 4 5 6 7 8 9 10 | Status InitList_Sq(SqList *L){ L->elem = (ElemType *)malloc(LIST_INIT_SIZE* sizeof (ElemType)); if (!L->elem) { exit(1); //这里存储空间分配失败怎么写??异常退出 } L->length = 0; L->listsize = LIST_INIT_SIZE; return OK; } |
2、输出线性表
void Output_L(SqList *L) { for(int i = 0;i<L->length;i++) { printf("%d ",L->elem[i]); } printf("\n"); }
3、插入数,参数有插入位置和插入的数(书上的是插入的数的地址)
Status ListInsert_Sq(SqList *L,int i,int e){ int *newbase; int *q; int *p; if(i < 1 || i > L->length) { return ERROR; } if(L->length >= L->listsize) { newbase = (int *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(int)); if(!newbase) { exit(1); } L->elem = newbase; L->listsize += LISTINCREMENT; } q = &(L->elem[i-1]); for(p = &(L->elem[L->length-1]);p >= q; --p) { *(p+1) = *p; } *q = e; L->length++; return OK; }
4、删除线性表的一个数,参数给定位置,保存删除的值
Status ListDelete_Sq(SqList *L,int i,ElemType *e) { int *p; int *q; if(i < 1 || i > L->length) { return ERROR; } p = &(L->elem[i-1]); *e = *p; q = L->elem+L->length-1;//表尾元素位置 //elem其实是数组的名字,数组首地址 for(++p;p<=q;++p){ *(p-1) = *p; } L->length--; return OK; }
5、查找值,给定值,如果线性表中有就返回位置,如果线性表中没有,就返回0
int LocateElem(SqList *L,ElemType *e) { ElemType *p; p = L->elem; int i = 1; while(i <= L->length){ if(*e == *p) { break; } i++; p++; } // printf("%d\n",i); if(i <= L->length) { return i; } else{ return 0; } }
6、对应主函数
int main() { int j; int a=0; int *e = (int *)malloc(sizeof(int)); SqList *L1 = (SqList *)malloc(sizeof(SqList)); //SqList L1[1]; InitList_Sq(L1); L1->length = 10; for(j = 0; j<L1->length; j++) { L1->elem[j] = j; } Output_L(L1); ElemType LI1 = 8; ListInsert_Sq(L1,5,LI1); Output_L(L1); ListDelete_Sq(L1,5,e); Output_L(L1); printf("%d\n",*e); *e =4; a= LocateElem(L1,e); printf("%d\n",a); free(L1->elem); free(L1); free(e); return 0; }
7、la lb非递减传递给Lc非递减
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | /La,Lb非递减给Lc void MergeList(SqList La,SqList Lb,SqList *Lc){ ElemType *pa; ElemType *pb; ElemType *pc; int *pa_last; int *pb_last; pa = La.elem; pb = Lb.elem; Lc->listsize = Lc->length = La.length + Lb.length; pc = Lc->elem = (ElemType *)malloc(Lc->listsize* sizeof (ElemType)); if (!Lc->elem) { exit(3); } pa_last = La.elem+La.length-1; pb_last = Lb.elem+Lb.length-1; while (pa<=pa_last&&pb<=pb_last) { if (*pa<=*pb) { *pc++ = *pa++; } else { *pc++ = *pb++; } } while (pa<=pa_last) { *pc++ = *pa++; } while (pb<pb_last) { *pc++ = *pb++; } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)