请详细说明网站开发流程及原则,怎么做网站咨询,织梦网站后台管理教程,阳江市网络问政双向循环链表
节点类型与双链表的节点类型完全相同双向循环链表的操作也与双链表的操作基本一致。
例题 将自然数一到N按由小到大的顺序沿顺时针方向围成一个圈#xff0c;然后以一为起点先沿顺时针方向数到第N个数将其划去#xff0c;再沿逆时针方向数到第K个数将其滑去然后以一为起点先沿顺时针方向数到第N个数将其划去再沿逆时针方向数到第K个数将其滑去重复上述操作直到剩下一个数为止问最后剩下的是哪个数。用带头节点双向循环链表实现。 静态链表 图示 适用情况 无法实现上述的链式存储但可以借用一维数组来实现的情况可以使用。 优点 线性表的插入和删除操作时不需要移动元素仅需要修改指针游标就行。具有链式存储的主要优点 主要函数 1、定义结构 代码 #includestdio.h
typedef int Element;
#define Maxsize 100
//定义结构
typedef struct {Element date;int cur;
}StaLink[Maxsize]; 注意 date数据cur游标看作指针也可以StaLink[i]i即为下标) 2、初始化申请空间 建立一个空的静态链表space将一维数组space中各分量炼成一个备用链表零表示空指针根据当前地图 理解 代码 //初始化
void creatLink(StaLink space){int i0;for(i0;iMaxsize-1;i){space[i].curi1;space[Maxsize-1].cur0;}
} 3、获取结点函数 从备用链表上获取一个新的结点如果备用连表已经空了获取节点的操作失败 理解 感觉就是把头结点的next的结点的下标返回【不太理解】 通过看第5个建立静态表可以知道 4、回收结点函数释放 将从链表中删除的结点插入到备用链表中的头结点之后 5、建立静态表 建立一个含有n个节点的静态链表head //建立静态链表
int createlink(StaLink space,int n){int k,head,s;//把头head申请出来 kheadallocnode(StaLink space);for(int i0;in;i){//循环把结点一个一个申请出来sallocnode(StaLink space);scanf(%d,space[s].date);space[k].cursks;//因为新的s就是下一个循环的头 }space[k].cur0;return head;//返回即为头结点的下标
} 6、求表长 计算静态链表head中数据元素的个数 //求表长
int getlen(StaLink space,int head) {int i0,s;sspace[head].cur;while(s!0){sspace[s].cur;i;}return i;
} 7、取元素: 取出静态链表head中的第i个结点的元素值 //取元素:取出静态链表head中的第i个结点的元素值
int getdate(StaLink space,int i,int head,Element *e){
//此时多加一个Element而不是直接返回
//可以理解为Element数据类型不一定为int方便后续修改和使用 int j0,s,khead; //补加khead; sspace[head].cur;//如何考虑i不在范围内 if(igetlen(StaLink,head)||i1)return 0; while(jik!0) //补加 k!0{sspace[s].cur;j;}if(k0)return 0; //补加 *espace[j].date;return 1;
} 8、定位: 确定静态链表head中第1个值为x的结点的位置 //定位确定静态链表head中第1个值为x 的结点的位置
int locate(StaLink space,int head,Element x){//遍历比较数据int k;kspace[head].cur;while(space[k].date!xk!0){kspace[k].cur;}while(k0)return 0;return k;
} 9、插入 在静态链表head的第i个结点之前插入一个值为x的新结点 10、删除 讲静态链表head中的第i个结点 11、输出 从头结点开始依次输出静态链表head中的所有元素值。