线性表(Linear List):由同类型数据元素构成有序序列的线性结构
利用数组来的连续存储空间顺序存放线性表
#include <stdio.h>
#include <stdlib.h>
#define LIST_INIT_SIZE 100
typedef int ElemType;
typedef struct LNode *List;
struct LNode{
ElemType Data[LIST_INIT_SIZE];
int last;
}Sqlist;
int main(int argc,char *argv[]){
}
// 初始化顺序表
struct LNode* MakeEmpty(void){
List L;
L = (List)malloc(sizeof(struct LNode));
L->last = -1;
return L;
}
//查找,根据值查找所在位置
int Find(ElemType e,List Ptrl){
int i = 0;
while(i<=Ptrl->last && Ptrl->Data[i] != e){
i++;
}
if(i > Ptrl->last){
return -1;/*寻找完整个表格仍然没有找到,返回-1 */
}else{
return i;
}
}
//插入,在第i(1<i<=n+1)个位置上插入一个值为e的新元素
int Insert(ElemType e,int i,List Ptrl){
int j;
if(Ptrl->last==LIST_INIT_SIZE-1){
printf("表满");
return -1;
}
if(i<1 || i > Ptrl->last+2){
printf("位置不合法");
return -1;
}
for(j=Ptrl->last;j>i-1;j--){
Ptrl->Data[j+1]=Ptrl->Data[j];
}
Ptrl->Data[i-1]=e;
Ptrl->last++;
return 1;
}
//删除(删除表的第i(1<=i<=n)个位置上的元素)
int Delet(int i,List Ptrl){
if(i<1 || i>Ptrl->last+1){
printf("位置不合法");
return -1;
}
for(i;i<=Ptrl->last+1;i++){
Ptrl->Data[i-1]=Ptrl->Data[i];
}
Ptrl->last -= 1;
return 1;
}
利用链式存储实现线性表
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode *List;
int main(int argc,char *argv[]){
}
struct LNode{
ElemType Data;
List next;
};
//求表长
int Length(List Ptrl){
List p = Ptrl;
int i = 0;
while(p){
i++;
p=p->next;
}
return i;
}
//按序号查找
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;
}else{
return NULL;
}
}
//按值查找
List Find(ElemType e,List Ptrl){
List p = Ptrl;
while(p != NULL && p->Data != e){
p = p->next;
}
if(p != NULL){
return p;
}else{
return NULL;
}
}
//插入(在第i-1个结点后插入一个值为X的新结点)
List Insert(ElemType e,int i,List Ptrl){
List s,p;
//当插入在头结点位置时
if(i == 1){
s = (List)malloc(sizeof(struct LNode));
s->Data = e;
s->next = Ptrl;
return s;
}
p = FindKth(i-1,Ptrl);
if(p!=NULL){
s = (List)malloc(sizeof(struct LNode));
s->Data = e;
s->next = p->next;
p->next = s;
return Ptrl;
} else{
printf("参数错误");
}
}
//删除(删除链表第i(1<=i<=n)个位置的结点)
List Delete(int i,List Ptrl){
List s,p;
//当删除头结点时
if(i == 1){
s = Ptrl;
if(Ptrl != NULL){
Ptrl = Ptrl->next;
}else{
return NULL;
}
free(s);
return Ptrl;
}
p = FindKth(i-1,Ptrl);
if(p == NULL){
printf("第%d个结点不存在",i-1);
return NULL;
}else if(p->next == NULL){
printf("第%d个结点不存在",i);
}else{
s = p->next;
p->next = s->next;
free(s);
return Ptrl;
}
}