知识点:
1:缺点
1.插入和删除操作需要移动大量的元素 2.当线性表长度变化较大时,难以确定存储空间的容量 3.任意造成存储空间的碎片
2:优点
1.无须为表示表中元素之间的逻辑关系而增加额外的存储空间。 2.可以快速的存取表中的任意位置的元素。
3:代码中增加,删除,是需要在原来线性表中进行,所以需要用到引用对原数据进行操作;不需要对原来数据进行的操作,我们直接对赋值后的局部变量(含有原线性表的所有数据)参数进行操作,即可
#include <stdio.h> #include <stdlib.h> #define initSize 20//顺序表初始大小 typedef int elemType;
静态存储-(数组大小不变)
typedef struct { elemType data[initSize]; int length;//每增加一个数,length增加1 }
动态存储-(动态分配存储,以下代码均为动态存储)
typedef struct { elemType* elem;//动态分配空间首地址 int length;//线性表当前长 int listSize;//线性表最大长 }sqList;
初始化
void initSqList(sqList *l) { l->elem=(elemType *)malloc(initSize*sizeof(elemType)); if(!l->elem) { printf("动态分配内存失败\n"); exit(0); } else { l->length=0; l->listSize=initSize; } printf("初始化成功\n"); }
销毁
void destorySqList(sqList *l) { if(l->elem)free(l->elem);//释放空间 l->elem=NULL;//指针指向空 printf("销毁成功\n"); }
清空
void clearSqList(sqList *l) { l->length=0; printf("清空成功\n"); }
判空
int isEmptySqList(sqList l) { if(l.length==0) { return 0; } else { return 1; } }
求表长
//求表长 int getSqListLength(sqList l) { return l.length; }
按位置查找
elemType getSqListElem(sqList l,int i) { if(i<1||i>l.length) { printf("位置不合法!\n"); return 0; } else { printf("找到了:%d\n",l.elem[i-1]); return l.elem[i-1]; } }
按数据查找
elemType getSqListloc(sqList l,elemType e) { int i,flag=1; for(i=0;i<l.length;i++) { if(l.elem[i]==e) { flag=0; printf("所查元素位序为%d", i + 1); return i+1; } } if(flag) { printf("查询无果"); return 0; } }
求前驱
elemType getSqListPre(sqList l,elemType cur_e,elemType *pre_e) { int i,k=-1; for(i=0;i<l.length;i++) { if(l.elem[i]==cur_e) { k=i-1; break; } } if(k>-1) { *pre_e=l.elem[k]; printf("前驱元素为%d\n", *pre_e); return pre_e; } if(k=-1) { printf("查询无果"); return 0; } }
求后继
elemType getSqListNext(sqList l,elemType cur_e,elemType *next_e) { int i,k=-1; for(i=0;i<l.length;i++) { if(l.elem[i]==cur_e) { k=i+1; break; } } if(k>-1) { *next_e=l.elem[k]; printf("前驱元素为%d\n", *next_e); return next_e; } if(k==-1) { printf("查询无果"); return 0; } }
末尾插入元素
void insertSqListLastElem(sqList *l,elemType e) { int k=l->length; //不能大于顺序表的当前储存空间 否则开辟空间 if(k>=l->listSize) { printf("顺序表已满!\n");//如果数组超出listSize,就动态的开辟同样大小空间末尾分配加入 l->elem=(elemType *)realloc(l->elem,(l->listSize+initSize)*sizeof(elemType)); if(!l->elem) { printf("分配空间失败!\n"); return 0; } l->listSize+=initSize; } l->elem[k+1]=e; l->length++; }
指定位置插入元素
void insertSqListElem(sqList *l,int i,elemType e) { int k; if(i<1||i>l->length+1) { printf("插入位置%d不合法!\n", i); return 0; } if(l->length>=l->listSize) { printf("顺序表已满!\n");//如果数组超出listSize,就动态的分配加入 l->elem=(elemType *)realloc(l->elem,(l->listSize+initSize)*sizeof(elemType)); if(!l->elem) { printf("分配空间失败!\n", i); return 0; } l->listSize+=initSize; } for(k=l->length;k>i-1;k--)//i之后元素往后挪 { l->elem[k]=l->elem[k-1]; } l->elem[i-1]=e; l->length++; }
末尾删除
elemType deleteSqListLastElem(sqList* l) { l->length--; return l->length; }
指定位置删除
elemType deleteSqListElem(sqList* l,int i,elemType* e) { int k; if(i<1||i>l->length) { printf("删除位置%d不合法\n", i); return 0; } *e=l->elem[i-1]; for(k=i-1;k<l->length;k++)//i之后元素往前挪 { l->elem[k]=l->elem[k+1]; } l->length--; return *e; }
遍历输出
void ListTraverse(sqList l) //遍历所有元素 { int i; if (isEmptySqList(l)) { printf("顺序表为空\n"); return 0; } for (i = 0; i < l.length; i++) printf("%-5d", l.elem[i]); }