通过一道题来写对静态链表学习之后的全部理解
题目在这里 link.
静态链表简单说是以结构体数组形式实现的链表。这里最简单的结构体里的元素可只有两个:1.数据(data)2.后继元素的位置下标
此题的结构体和备用链表(结构体数组)
typedef struct{
ElemType data;
int cur;//后继元素的位置下标
}NodeType;
NodeType space[MAXSIZE];//有点像迭代器
重点
——————————————
当实现insert的操作时,虽然用户可以选择所插入的位置,可是data进入space的方式其实是一种“尾插”,但是由于cur是后继元素的位置下标,所以输出时space[i].data后继不是space[i+1],而是space[space[i+1].cur].data
举个抽象的🌰通过cur可以实现这输出
接下来细说题解
建立链表&初始化备用链表
typedef struct {//链表结构体
int elem;
int length;
int listSize;
}SLinkList;
void InitSpace_SL(){//初始化备用链表
memset(space,0,sizeof(space));
for(int i=0;i<MAXSIZE-1;++i)
space[i].cur=i+1;
space[MAXSIZE-1].cur=0;
}
void CreatL(SLinkList &S)//初始化链表
{
S.elem=Malloc_SL();//用于获取头节点(并不是第一个节点)
space[S.elem].cur=0;
S.length=0;
S.listSize=9;
}
int main()//主函数
{
SLinkList S;
char str[10];
int a;
ElemType e;
InitSpace_SL();
CreatL(S);
while(cin>>str){
if(strcmp(str,"insert")==0)
{
cin>>a>>e;
insert(S, a, e);
}
else if(strcmp(str,"delete")==0)
{
cin>>a;
Delete(S,a);
}
else if(strcmp(str,"search")==0)
{
cin>>e;
cout<<" "<<LocateElem_SL(S, e)<<endl<<"********************\n";
}
else if(strcmp(str,"show")==0)
{
show();
cout<<"********************\n";
}
}
}
insert
int Malloc_SL(){
int i=space[0].cur;//一直都是插入元素的下标
if(space[0].cur)
space[0].cur=space[space[0].cur].cur;
return i;
}
void insert(SLinkList &S,int a,ElemType e)
{
int cur=S.elem;
int New;
for(int j=0;j<a-1;j++)//找到现有数组的最后一个元素的cur
{
cur=space[cur].cur;
}
New=Malloc_SL();//获取插入元素的位置
strcpy(space[New].data, e);
space[New].cur=space[cur].cur;//插入的元素的cur应该为之前最后一个元素的cur
space[cur].cur=New;//之前最后一个元素的cur现在指向插入元素的位置下标
S.length++;
}
delete
如果消除的是第2个元素,则将第1元素的cur直接改成第3个元素的位置下标
void Free_SL(int k){
space[k].cur=space[0].cur;
space[0].cur=k;
}
void Delete(SLinkList &S,int a)
{
int cur=S.elem;
for(int j=0;j<a-1;j++)//找到所要删除的元素位置
cur=space[cur].cur;
space[cur].cur=space[space[cur].cur].cur;//将前一元素的cur直接改成a后一元素的位置下标
Free_SL(space[cur].cur);
S.length--;
}
show
void show()
{
for(int i=0;i<MAXSIZE;i++)
printf("%8s%2d\n",space[i].data,space[i].cur);
}
按顺序show(自己加的)😐
输出一个元素之后直接找下一个元素的坐标
void Show()
{
int i;
int a=0;
a=space[1].cur;
for(i=0; i<MAXSIZE; i++)
{
printf("%-8s\n", space[a].data);
a=space[a].cur;//输出一个元素之后直接找下一个元素的坐标
}
}
本文部分参考来源link.