做一个豁达而努力的自己。
静态链表的定义:用数组来代替指针数组元素,由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; }