线性表
什么是线性表
1.线性表是真实世界中对具有相同特性的数据元素的有限序列的别名。每一个数据元素都有自己唯一的编号以作区分。也就是说,线性表是真实世界中描述数据对象的称呼,它包含逻辑结构和数据运算。(可以和树,图,集合等价的地位,他们都是现实生活描述数据对象的形式)
2.线性表的存储结构有顺序存储结构和链式存储结构。
线性表的顺序存储结构
1.概括:线性表的元素按照顺序(编号顺序或是其他给定的顺序)存储。存储器分配出的是一片连续的空间。
2.代码
声明定义
typedef struct { ELemTYpe data[MAXV]; int length; }Sqlist;
初始化顺序表(注意顺序表和线性表的区分,不然后面真的可能会糊涂,顺序表是线性表的存储结构)
void InitList(Sqlist *&L) { L=(Sqlist*)malloc(sizeof(Sqlist)); int length=0; }
销毁线性表
void DestroyList(Sqlist *&L) { free(L); }
判定是否为空
bool ListEmpty(Sqlist *&L) { return(L->length==0); }
输出线性表
void DispLIst(Sqlist *&L) { if(ListEmpty(L)) return; for(int i=0;i<L->length;i++) { printf("%d",L->data[i]); printf("\n"); } }
求某个元素值
void GetElem(Sqlist *&L,int i,Elemtype e) { if(i<1||i>=L->length)return false; e=L->data[i]; return true; }
顺序表插入元素
void ListInsert(Sqlist *&L,int i,ElemType e) { if(i<1||i>=L->length+1)return false; i--; for(int j=L->length;j>i;j--) L->data[j]=L->data[j-1]; L->data[i]=e; L->length++; return true; }
线性表的链式存储结构
1.在节点内增加一个指针域作为和其他节点连接的手段。增加一个指向后继节点的指针我们称之为单链表,再增加一个指向前驱结点的指针我们称之为双链表。最后一个节点指向后继节点的指针指向最开始的结点,则是循环链表,当然也分循环单链表和循环双链表。
2.这里增加一个知识点,存储密度=节点中数据所占的存储空间/结点所占的总空间。因此顺序表是100%,而链表因为有指针域所以小于100%。
3.代码
声明定义
typedef struct LNode { Elemtype data; struct LNode *next; }LinkNode;
头插法建表
void CreateListF(LinkNode *&L,Elemtype a[],int n) { LinkNode *s; L=(LinkNode *)malloc(sizeof(LinkNode)); L->next=NULL; for(int i=0;i<n;i++) { s=(LinkNode *)malloc(sizeof(LinkNode)); s->data=a[i]; s->next=L->next; L->next=s; } }
尾插法建表
void CreateListR(LinkNode *&L,Elemtype a[],int n) { LinkNode *s,*r; L=(LinkNode *)malloc(sizeof(LinkNode)); r=L; for(int i=0;i<n;i++) { s=(LinkNode *)malloc(sizeof(LinkNode)); s->data=a[i]; r->next=s; r=s; } r->next=NULL; }
销毁表
void DestroyList(LinkNode *&L) { LinkNode *pre,*p; pre=L; p=L->next; while(p!=NULL) { free(pre); pre=p; p=p->next; } free(pre); }
插入数据元素
bool ListInsert(LinkNode *&L,int i,Elemtype e) { int j=0; LinkNode *p=L,*s; while(j<i-1&&p!=NULL) { j++: p=p->next; } if(p==NULL)return false; else { s=(LinkNode *)malloc(sizeof(LinkNode)); s->data=e; s->next=p->next; p->next=s; return true; } }
双链表换汤不换药,举一反三。