数据结构 静态链表

数据结构 静态链表做一个豁达而努力的自己 静态链表的定义 用数组来代替指针数组元素 由 data 和 cur 组成 data 为数据域 cur 代替 next 指针存放的是下一个后继节点的下标 称 cur 为游标 用数组描述的链表成为静态链表 顺序表的静态链表存储结构 defineMAXSIZ nbsp nbsp 这里必须加结构体名称 不加的话只能在主函数声明一个结构体数组 不能在其它函数参

做一个豁达而努力的自己。

静态链表的定义:用数组来代替指针数组元素,由data和cur组成,data为数据域,cur代替next指针存放的是下一个后继节点的下标,称cur为游标,用数组描述的链表成为静态链表。

顺序表的静态链表存储结构:

#define MAXSIZE 1000

typedef struct Node    //这里必须加结构体名称,不加的话只能在主函数声明一个结构体数组,不能在其它函数参数里声明

{

    ElemType data;

    int cur;

}StaticLinkList[MAXSIZE];    

要点:数组的第一个元素和最后一个元素作为特殊元素处理,不存放数据;我们把未使用过的元素称为备用链表;数组第一个元素的cur存放的则是备用链表第一个节点的下标,最后一个元素则存放的是第一个有数值元素的下标,相当于头结点。

静态链表的优缺点:优点是在插入和删除时,自己只需要修改游标,,,缺点是没能解决连续分配空间带来表长难确定,失去了随机存取的特性。

代码:

#include <iostream> #include <cstdlib> using namespace std; #define MAXSIZE 1000 typedef struct Node { int data; //数据域 int cur; //游标 }StaticLinkList[MAXSIZE]; //静态链表的初始化 void InitList(StaticLinkList space) { int i; for(i = 0; i < MAXSIZE - 1; i++) space[i].cur = i + 1; space[MAXSIZE - 1].cur = 0; //个人觉得这里完全可以改为1,因为创建的时候也是要改为1的,,, } //静态链表的创建 void CreateLink(StaticLinkList space) { int n, mov; mov = MAXSIZE - 1; space[mov].cur = 1; cout << "请输入元素个数:"; cin >> n; cout << "输入int型数据:" << endl; while(n--) { mov = space[mov].cur; cin >> space[mov].data; } space[0].cur = space[mov].cur; space[mov].cur = 0; } //静态链表的输出 void PutList(StaticLinkList space) { int mov; mov = MAXSIZE - 1; while(space[mov].cur) { mov = space[mov].cur; cout << space[mov].data << endl; } } //为静态链表分配备用空间 int MallocspaceList(StaticLinkList space) { int i; i = space[0].cur; if(space[0].cur) space[0].cur = space[i].cur; return i; } //静态链表的长度 int LengthList(StaticLinkList space) { int mov, i; mov = MAXSIZE - 1; i = 0; while(space[mov].cur) { mov = space[mov].cur; i++; } return i; } //静态链表的插入 bool InsertList(StaticLinkList space, int i, int e) { if(i < 1 || i > LengthList(space)) return false; int n, mov; mov = MAXSIZE - 1; n = MallocspaceList(space); if(n) { space[n].data = e; for(int j = 1; j < i; j++) mov = space[mov].cur; space[n].cur = space[mov].cur; space[mov].cur = n; } return true; } //为静态链表释放节点 void FreeList(StaticLinkList space, int n) { space[n].cur = space[0].cur; //将第一个备用节点连接到释放节点的后面 space[0].cur = n; //数组第一个元素的cur存放要释放节点的下标 } //静态链表的删除 bool DeleteList(StaticLinkList space, int i) { if(i < 1 || i > LengthList(space)) return false; int mov, n; mov = MAXSIZE - 1; for(int j = 1; j < i; j++) mov = space[mov].cur; n = space[mov].cur; //获取删除节点的下标 space[mov].cur = space[n].cur; //将要删除的节点的前一个与后一个节点连接起来 FreeList(space, n); //释放节点 return true; } //静态链表的读取 bool GetList(StaticLinkList space, int i, int &e) { if(i < 1 || i > LengthList(space)) return false; int mov; mov = MAXSIZE - 1; for(int j = 1; j <= i; j++) mov = space[mov].cur; e = space[mov].data; return true; } //菜单 void menu() { cout << "1.静态链表的初始化" <<endl; cout << "2.静态链表的创建" <<endl; cout << "3.静态链表当前的长度" <<endl; cout << "4.静态链表的读取" <<endl; cout << "5.静态链表的插入" <<endl; cout << "6.静态链表的删除" <<endl; cout << "7.静态链表的输出" <<endl; cout << "0.退出静态链表" <<endl; } int main() { StaticLinkList space; int i, e, n, num = -1; while(num) { system("cls"); menu(); cout << "请输入选项:"; cin >> num; switch(num) { case 1: InitList(space); cout << "初始化成功" << endl; break; case 2: CreateLink(space); cout << "创建成功" << endl; break; case 3: cout << "当前静态链表的长度为:" << LengthList(space) << endl; break; case 4: cout << "请输入要读取的位置:"; cin >> i; n = GetList(space, i, e); if(n == 0) cout << "读取失败" << endl; else cout << "数据为:" << e << endl; break; case 5: cout << "请输入要插入的位置:"; cin >> i; cout << "请输入要插入的int型元素:"; cin >> e; n = InsertList(space, i, e); if(n == 0) cout << "插入失败" << endl; else cout << "插入成功" << endl; break; case 6: cout << "请输入要删除的位置:"; cin >> i; n == DeleteList(space, i); if(n == 0) cout << "删除失败" << endl; else cout << "删除成功" << endl; break; case 7: cout << "数据元素:" << endl; PutList(space); case 0: break; default : cout << "没有所选项" << endl; } system("pause"); } return 0; } 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231920.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux命令大全(超详细版)[通俗易懂]

    Linux命令大全(超详细版)[通俗易懂]史上最全的Linux常用命令汇总(超全面!超详细!)收藏这一篇就够了!

    2022年10月4日
    4
  • (6)JMeter元件详解之 While Controller条件控制器

    (6)JMeter元件详解之 While Controller条件控制器

    2021年7月13日
    105
  • STM32delay函数应用与说明[通俗易懂]

    STM32delay函数应用与说明[通俗易懂]STM32delay函数应用应用与说明CortexM4内核编程手册有关时钟系统的内容定时函数的实现delay_init函数delay_us函数对与32中的delay函数有很多中形式可以使用,这里提供一些自己使用遇到过的函数类型。CortexM4内核编程手册有关时钟系统的内容p230SysTicktimer(STK)Theprocessorhasa24-bitsystemtimer,SysTick,thatcountsdownfromthereloadvalu

    2022年6月2日
    70
  • 三极管驱动继电器电路

    三极管驱动继电器电路    继电器线圈需要流过较大的电流(约50mA)才能使继电器吸合,一般的集成电路不能提供这样大的电流,因此必须进行扩流,即驱动。图1所示为用NPN型三极管驱动继电器的电路图,图中阴影部分为继电器电路,继电器线圈作为集电极负载而接到集电极和正电源之间。当输入为0V时,三极管截止,继电器线圈无电流流过,则继电器释放(OFF);相反,当输入为+VCC时,三极管饱和,继电器线圈有相当的电流流过,…

    2022年6月24日
    29
  • 那四年,我们一起逝去的青春

    今天是2011年10月1日,是我出生后的第21个国庆节,也是大学生涯里最后一个国庆节,这篇日志可能有点长,闲着蛋疼的童鞋可以泡杯咖啡,一边喝一边看,就当看笑话好了。日志发出来估计已经是几个月后的事了,这也是记录了大学里的点点滴滴。前几天大一新生的军训闭幕式也落下了帷幕,上周五毕业设计的初稿已经发下来了,室友在实习的公司上班马上就要发工资了,考研的童鞋已经进入了积极备战的状态,据说毕

    2022年4月8日
    39
  • 向用户、竞争对手学习,是360的微创新之源 ( 转发自周鸿祎博客 )

    向用户、竞争对手学习,是360的微创新之源 ( 转发自周鸿祎博客 )写道现在,我说一说360的微创新,这是我这么多年来做互联网产品的一个总结,对我来说是方法论,希望能跟朋友们分享,切磋。我记得比尔-盖茨有一句话,大意是他愿意为微软一直服务下去,因为他喜欢跟一群聪明人打交道。跟聪明人在一起交流是快乐的,大家都是聪明人,大拿不少,即使拍砖也能拍出水平。闲话少叙,言归正传。但提前说明一下,这篇博文牵涉到一些产品功能,不感兴趣的同志可以掠过。2008年7月

    2022年7月26日
    11

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号