应用场景
一、线性表是什么?
二、抽象数据集
三、顺序存储
1)定义,初始化,查找:
//线性表的定义与操作-顺序表
typedef int Position;
typedef struct LNode{
ElementType Data[MAXSIZE];
Position Last;
}LNode,*List;
//初始化
List MakeEmpty(){
List L;
L=(List)malloc(sizeof(struct LNode));
L->Last=-1;
return L;
}
//查找
#define ERROR -1
Position Find(List L,ElementType X){
Position i=0;
while(i<=L->Last &&L->Data!=X){
i++;
}
if(i>L->Last){
return ERROR;//没找到,返回-1
}
else {
return i;//找到,返回存储位置
}
}
2)插入
//插入
bool Insert(List L,ELementType X,Position P){
//在L里指定位置P前插入X
Position i;
if(L->Last == MAXSIZE-1){//表空间已满,不能插入
printf("表满");
return false;
}
if(P<0||p>L->Last +1){//检查插入位置合法否
printf("位置不合法");
return false;
}
for(i=L->Last;i>=P;i--){
L->Data[i+1]=L->Data [i];
}//将位置P及后单元顺序向后移动
L->Data [P]=X;//新元素插入
L->Last ++;//Last指向最后元素
return true;
}
3)删除
//删除
bool Delete(List L,Position P){
Position i;
if(P<0||P>L->Last ){//检查空表及删除位置的合法性
printf("位置%d不存在元素",P);
return false;
}
for(i=P;i<L->Last ;i++){
L->Data [i]=L->Data [i+1];//将位置P及以后元素向前移
}
L->Last --;
return true;
}
四、链式存储
1)定义、求表长、查找(按序号、按值)
//线性表的定义与操作-链式表
struct LNode{
ElementType data;
struct LNode *next;
};
typedef struct LNode *List;
//求表长
int Length(List Ptrl) {
List p = Ptrl;
int j=0;
while(p){
p=p->next ;
j++
}
return j;
}
/*查找*/
//按序号查找:Findkth
List FindKth(int K,List Ptrl){
List p=Ptrl;
int i=1;
while(p!=NULL&&i<K){
p=p->next;
i++;
}
if(i==K){
return P;//找到第K个,返回指针
}
else return NULL;//没找到,返回NULL
}
//按值查找:Find
List Find(ElementType X,List Ptrl){
List P=Ptrl;
while(p!=NULL&&P->data !=X){
p=p->next;
}
return P;
}
2)插入
//插入(在i-1个节点后面插入一个值为X的新节点)
List Insert(ElementType X,int i,List Ptrl){
List p,s;
if(i==1){
s=(List)malloc(sizeof(LNode));
s->data =X;
s->next =Ptrl;
return s;
}
p=FindKth(i-1,Ptl);
if(p==NULL){
printf("i-1不存在,不能插入");
return NULL;
}
else{
s=(List)malloc(sizeof(LNode));
s->data =X;
s->next = p->next ;//新结点插在第i-1个结点后面
p->next = s;
return Ptrl;
}
}
3)删除
//删除(删除链表的第i个位置上的节点)
List Delete(int i,List Ptrl){
List P,S;//S stand,P pre
if(i==1){
S=Ptrl;
if(Ptrl!=NULL){
Ptrl=Ptrl->next;
free(S);
return Ptrl;
}
else {
printf("第1个结点不存在");
return NULL;}
}
P=FindKth(i-1,Ptrl);
if(p==NULL){
printf("第%d个结点不存在",i-1);
return NULL;
}
else if(p->next==NULL){
printf("第%d个结点不存在",i);
return NULL;
}
else{
S=P->next ;//S指向第i个结点
P->next =S->next ;//从链表中删除S
free(S);//释放被删除的结点S
return Ptrl;
}
}