零个或多个数据元素的有限序列
在较复杂的线性表中,一个数据元素可以由诺干个数据项组成
定义:是指用一段地址连续的存储单元一次存储线性表的数据元素
结构代码:
#define ListSize 100 //线性表的最大长度 typedef int DataType; typedef struct { DataType data[ListSize]; //用数组存储线性表中的元素 DataType length; //顺序表中元素的个数 }SeqList;DataType是数据元素类型,可以根据需要定义,可以使用SeqList定义数据表类型变量
数组长度与线性表长度区别:
数组长度是存放线性表的存储空间的长度 线性表的长度是线性表中数据元素的个数
顺序表的基本操作:
**(1)**按序号查找(用e返回L中第i个数据元素的值):
#define ok 1 #define error 0 typedef int status; status getelem(sqlist L,int i,elemtype *e) { if (L->length < 1 || (L->length > LengthList(L))) { return error; } *e=L.data[i-1]; }**(2)**插入操作(在L中第i个位置之前插入新的数据元素e,L的长度+1)
status InsList(PSeqList L, int i, DataType e) { int k; //判断插入位置是否合法 if (i < 1 || L->length >(LengthList(L) + 1)) { printf("插入位置不合法!\n"); return error; } //判断顺序表是否已满 else if (L->length >= ListSize) { printf("顺序表已满,不能插入!\n"); return error; } else { for (k = i; k <= L->length; k--) { L->data[k + 1] = L->data[k]; } L->data[i - 1] = e;//将新元素插入 L->length++; //数据表的长度加1 return ok; } return 0; }**(2)**删除操作
status DelList(PSeqList L, DataType i, DataType* e) { int k; if (L->length < 1) { printf("表为空!\n"); return error; } *e = L->data[i - 1]; for (k = i; k < L->length; k++) { L->data[k - 1] = L->data[k]; } L->length--; return *e; }优点: 无需为表中元素之间的逻辑关系增加额外的存储空间,可以快速存取表中任一位置的元素 缺点: 插入和删除操作需要移动大量元素,当线性表长度变化较大时,难以确定存储空间的容量,造成存储空间碎片
分类:单链表,双向链表,循环链表 定义:对数据元素a来说,除了存储其本身的信息之外,还需要存储一个指示其直接后继的信息(其中存储数据的为数据域,存储直接后继位置称为指针域) 注意:要注意区分头指针和头结点之间的区别 结构代码描述:
typedef struct node { elemtype data; struct node *next; }链表的基本操作:
**(1)**读取(用e返回l中第i个数据元素的值)
status getelem(linklist l,int i,elemtype *e) { int j; linklist p; p=l ->next; j=1; while(p&&j<i) { p=p->next; ++j; } if(!p||j>i) return error; *e=p>data; return ok; }**(2)**插入(在l中第i个位置之前插入新的数据元素e,l的长度加1)
statues listinsert(linklist *l,int i,elemtype e) { int j; linklist p,s; p=*l; j=1; while(p&&j<i) { p=p->next; ++j; } if(p||j>i) { return error; } //生成新节点 s=(linklist)malloc(sizeof(node)); . s->data=e; s->next=p->next; p->next=s; return ok; }**(3)**删除(删除l的第i个数据元素,并用e返回其值,l的长度-1)
status listdelete(linklist *l,int i,elemtype *e) { int j; linklist p,q; p=*l; j=1; while(p->&&j<i) { p=p->next; ++j; } if(!(p->next)||j>i) retuen 0; q=p->next; p->next=q->next *e=q->data; free(q); return ok; }