线性表:
是由同类型数据元素构成有序序列的线性结构。
关于线性表:
表中元素个数成为线性表的长度;
线性表没有元素时,成为空表;
表的起始位置称为表头,表结束位置称为表尾;
线性表的顺序存储实现:
利用数组的连续存储空间顺序存放线性表的各元素;
创建一个线性表的模板:
typedef struct node*list;
struct node{
elementtype arr[200];
int last;
};
struct node l;
list ptrl;
访问下标为i的元素:l.arr[i]或ptrl->arr[i];
线性表的长度:l.last+1或ptrl->last+1;
list makeempty(){
list p;
p=(list)malloc(sizeof(struct node));
p->last=-1;//last代表最后一个元素,所以last为0时代表这个表里
//有一个元素放在第一个位置,没元素设为1;
return p;//然后返回结构的指针
}
int find(elementtype x,list p){
int i=0;
while(i<=p->last&&p->arr[i]!=x){
i++;
}
if(i>p->last) return -1;//如果没找到返回-1
else return i;//找到后返回的是存储位置
}
先移动后插入
void sert(elementtype x,int i,list p){
int j;
if(p->last==maxsize-1){
cout<<"表空间已满,不能插入"<<endl;
return ;
}
if(i<1||i>p->last+2){
cout<<"插入的位置不合法"<<endl;
return ;
}
for(int j=p->last;j>=i-1;j--){
p->arr[j+1]=p->arr[j];//将i~n的元素倒序向后移动
}
p->arr[i-1]=x;//新元素插入
p->last++;//多了一个元素,需要+1
return ;
}
void Delete(int i,list p){
int j;
if(i<1||i>p->last+1){
cout<<"不存在那个元素"<<endl;
return ;
}
for(int j=i;j<=p->last;j++){
p->arr[j-1]=p->arr[j];//将i+1~n元素的顺序向前移动
}
p->last--;//last仍指向最后元素
return;
}
关于线性表的链式存储:
求表长
int length(list p){
list a=p;//设置一个临时指针,指向表头第一个结点
int j=0;
while(a){
a=a->Next;
j++;
}
return j;
}
//按序号查找
list find(int k,list p){
list a=p;
int i=1;
while(p!=NULL&&i<k){
a=a->Next;
i++;
}
if(i==k){
return a;
}else return NULL;
}
//按值查找
list find(elementtype x,list p){
list a=p;
while(p!=NULL&&a->arr!=x){
a=a->Next;
}
return a;
}
list insert(elementtpe x,int i,list p){
list a,s;
if(i==1){ //新结点插入在表头,申请填装节点
s=(list)malloc(sizeof(struct node));
s->arr=x;
s->next=p;
return s;//返回新表头指针
}
a=find(i-1,p);//查找第i-1个结点
if(a==NULL){ //第i-1个不存在,不能插入
cout<<"参数i错了"<<endl;
return NULL;
}else{
s=(list)malloc(sizeof(struct node));//申请填装结点
s->arr=x;
s->next=a->next;//新结点插入在第i-1个结点的后面
a->next=s;
return p;
}
}
list delete(int i,list p){
list a,s;//若要删除的是表的第一个结点
if(i==1){//s指向第一个结点
s=p;
if(p!=NULL) p=p->next;//从链表中删除
else return NULL;
free(s);//释放被删除结点
return p;
}
a=find(i-1,p);//查找第i-1个结点
if(a==NULL){
printf("第i-1个结点不存在");
return NULL;
}else if(a->next==NULL){
printf("第i个结点不存在");
return NULL;
}else{
s=a->next;//s指向第i个结点
a->next=s->next;//从链表中删除
free(s);//释放被删除结点
return p;
}
}