参照<<大话数据结构>> 仅做学习记录
-
线性表
顺序存储结构
一维数组,内存是连续挨着的
基本的增删查改
/* InitList(*L): 初始化操作,建立一个空的线性表L。 ListEmpty(L): 若线性表为空,返回true,否则返回false。 ClearList(*L): 将线性表清空。 GetElem(L, i, *e): 将线性表L中的第 i 个位置元素值返回给e。 InsertElem(L, i, *e): 将线性表L中的第 i 个位置元素设置为e LocateElme(L, e): 在线性表L中查找与给定值e相等的元素, */ #include "stdio.h" #include "stdlib.h" #include <string.h> #define MAXSIZE 5 typedef int Element; typedef struct { Element data[MAXSIZE]; int length; } SqList; void InitList(SqList* L) { L->length = 0; memset(L->data,0x00,MAXSIZE* sizeof(Element)); printf("InitList\n"); } int ListEmpty(SqList* L) { if (L->length == 0) { printf("ListEmpty %d\n", 0); return 0; } else { printf("ListEmpty %d\n", L->length); return L->length; } } void ClearList(SqList* L) { L->length = 0; memset(L->data, 0, sizeof(Element)*MAXSIZE); } void GetElem(SqList* L, int i, Element* e) { memcpy(e, L->data+i, sizeof(Element)); printf("GetElem %d val = %d\n", i, *e); } int LocateElme(SqList* L, Element* e) { Element* tmp = L->data; int val = -1; for (int i = 0; i < sizeof(L); i++) { if (*e == tmp[i]) { val = i; break; } } printf("LocateElme pos = %d\n", val); return val; } // i :0-(MAXSIZE-1) int InsertElem(SqList* L, int i, Element e) { if (i < 0 || i > MAXSIZE) { return -1; } // 是否已有数据 memcpy(L->data+i, &e, sizeof(Element)); L->length++; return 0; } int DelectElem(SqList* L, int i) { if (i < 0 || i > MAXSIZE) { return -1; } memset(L->data+i, 0x00, sizeof(Element)); L->length--; return 0; } void prinfList(SqList* L) { for (int i = 0; i< MAXSIZE; i++) { printf("data[%d] = %d ,", i, L->data[i]); } printf("\n"); } int main() { SqList Ltmp; Element Etmp = 200; InitList(&Ltmp); InsertElem(&Ltmp, 0, (Element)(100)); InsertElem(&Ltmp, 1, (Element)(200)); prinfList(&Ltmp); LocateElme(&Ltmp, &Etmp); ListEmpty(&Ltmp); GetElem(&Ltmp, 0, &Etmp); DelectElem(&Ltmp, 1); }
缺点:删除和插入非常耗时低效
链式存储结构
结点 = 数据域 + 指针域,n个结点组合起来的称为链表。
由于指针域只有一个指针,故称之为单链表。
线性链表:第一个结点的指针域称为头指针, 最后一个节点为NULL
单链表
头插法---尾插法
静态链表:用数组描述的链表叫做静态链表
结构体 {
数据域;
游标:代表下一个数据的位置;
} 数组
插入/删除数据:可以不改动之前的数据即可插入,删除数据。
循环链表:默认尾节点的指针是空,把尾结点的指针指向头结点,即可形成循环链表
双向链表:为了克服单链表的单向循环查找,如果需要查找上个结点,需要再转一圈,所以相较单链表,在指针域在加了一个指针,指向上一个结点。