//静态链表的插入删除
#include<stdio.h>
#define Max 1000
typedef int ElemType;
typedef struct {
ElemType Data;
int cur;
}StaticLinkList[Max];
int InitList(StaticLinkList Init);
int InsertList(StaticLinkList L, int i, ElemType e);
int Malloc(StaticLinkList space);
int DeleteList(StaticLinkList L, int i);
int Free(StaticLinkList L, int i);
int PrintInsert(StaticLinkList L);
int PrintDelete(StaticLinkList L);
int ListLength(StaticLinkList L);
//初始化
int InitList(StaticLinkList Init){
int i;
for(i=0;i<Max-1;i++){
Init[i].cur=i+1;
}
Init[Max-1].cur=0;
return 1;
}
//插入
int InsertList(StaticLinkList L, int i, ElemType e){
int j,k,l;
k=Max-1;
j=Malloc(L);
if(j){
L[j].Data=e;
for(l=1;l<=i-1;l++){
k=L[k].cur;
}
L[j].cur=L[k].cur; //插入元素的游标获取了原来应该指向下一个的位置
L[k].cur=j; //原来游标的指向改成指向插入元素
return 1;
}
return 0;
}
//备用链表申请空间(改游标指向)
int Malloc(StaticLinkList space){
int i;
i=space[0].cur; //给予新的空间
if(space[0].cur){
space[0].cur=space[i].cur; //将备用链表的游标改成新的空间
}
return i;
}
//删除
int DeleteList(StaticLinkList L, int i){
int j,k;
k=Max-1;
for(j=1;j<=i-1;j++){
k=L[k].cur;
}
j=L[k].cur;
L[k].cur=L[j].cur; //删前的一个元素的游标等于删除元素的游标
Free(L,j);
return 1;
}
//释放结点(等待被新元素覆盖的状态)
int Free(StaticLinkList L, int j){
L[j].cur=L[0].cur; //删除元素的游标改成新的空间
L[0].cur=j; //下一个元素插入首选地方就是被删除的这个地方
}
//建表插入后的输出
int PrintInsert(StaticLinkList L){
int j,temp;
j=ListLength(L);
printf("表长:%d\n",j);
temp=Max-1;
temp=L[temp].cur;
while(L[temp].cur<=j){ //利用游标来循环,游标不大于表长就输出,最后游标会到最后一个数据的游标,也就是0,而0的游标是一个新的空间,大于了表长
printf("%d ",L[temp].Data); //不可以用下标来循环哦,这样看不出插入的效果的
temp=L[temp].cur;
}
printf("\n");
}
//删除后的输出
int PrintDelete(StaticLinkList L){
int temp,j,i;
j=ListLength(L);
temp=Max-1;
temp=L[temp].cur;
printf("表长:%d\n",j);
while(i++<=j){ //这里就不能和插入后的输出一样了,因为有个位置被删除了,那个位置的游标值是大于表长的
printf("%d ",L[temp].Data);
temp=L[temp].cur;
}
printf("\n");
}
//长度
int ListLength(StaticLinkList L){
int i,j=0;
i=L[Max-1].cur; //i=1
while(i){ //游标不等于最后一个也就是不等于0就循环
i=L[i].cur; //每次循环等于下一个游标
j++; //记录循环了几次就是表的长度
}
return j;
}
int main(){
StaticLinkList L;
InitList(L);
for(int i=1;i<6;i++){
InsertList(L,i,i*10);
}
PrintInsert(L);
printf("插入后\n");
InsertList(L,4,99);
PrintInsert(L);
printf("删除后\n");
DeleteList(L,2);
PrintDelete(L);
}
静态链表的操作
最新推荐文章于 2022-08-02 16:50:36 发布