自我感觉静态链表的实现过程比动态链表困难了不少,需要考虑更多的参数和更多的边界条件。还需要不断加强训练,写代码的过程比较混乱,而且不能够完全不看书。戒骄戒躁,继续加油。
静态链表与链表的顺序存储结构一样,也是将数据存储在数组中。
本例题中,数组的每个元素都是一个string对象。代码及函数功能如下:
struct Node //定义的每个节点的内容
{
string data;
int cur;
};
bool InitList(Node *sl) //链表初始化,主要是将每个节点中的cur赋值,还有首尾;
int Malloc_SLL(Node *sl) //返回下一个空闲空间位置;
int ListLength(Node *sl) //返回List的长度;
bool ListInsertHead(Node *sl) //为初始化的链表赋初始值;
bool ListInsert(Node *sl, int i) //在链表的第i个位置插入新元素
void show(Node *sl) //展示链表中的所有元素;
void free_SLL(Node * ls, int i) //释放删除的内存空间,并对链表的指示性参数赋值;
bool ListDelete(Node *sl, int k) //删除第k个位置的元素;
静态链表实现头文件
#pragma once
#ifndef LINEARLIST_H_
#define LINEARLIST_H_
#include<string>
using namespace std;
const int MAXSIZE = 10000;
struct Node
{
string data;
int cur;
};
bool InitList(Node *sl)
{
for (int i = 0; i < MAXSIZE-1; i++)
sl[i].cur = i + 1;
sl[MAXSIZE - 1].cur = 1;
return true;
}
int Malloc_SLL(Node *sl)
{
int i = sl[0].cur;
if(i)
sl[0].cur = sl[i].cur;
return i;
}
int ListLength(Node *sl)
{
int index = sl[MAXSIZE - 1].cur;
int k = 0;
while (index) {
index = sl[index].cur;
k++;
}
return k;
}
bool ListInsertHead(Node *sl)
{
string input;
int insert;
cout << "Enter a new string data (q to quit): ";
getline(cin, input);
while(input != "q"){
insert = Malloc_SLL(sl);
sl[insert].data = input;
cout << "Enter a new string data (q to quit): ";
getline(cin, input);
}
sl[insert].cur = 0;
return true;
}
bool ListInsert(Node *sl, int i)
{
if (i<1 || i>ListLength(sl) + 1)
return false;
int insert = Malloc_SLL(sl);
string input;
cout << "Enter a new string data: ";
getline(cin, input);
sl[insert].data = input;
int index = sl[MAXSIZE - 1].cur;
for (int k = 1; k < i-1; k++)
index = sl[index].cur;
sl[insert].cur = sl[index].cur;
sl[index].cur = insert;
return true;
}
void show(Node *sl)
{
int idx = sl[MAXSIZE - 1].cur;
int i = 1;
while (idx) {
cout << "# " << i << ": " << sl[idx].data << endl;
i++;
idx = sl[idx].cur;
}
}
void free_SLL(Node * ls, int i)
{
ls[i].cur = ls[0].cur;
ls[0].cur = i;
}
bool ListDelete(Node *sl, int k)
{
if (k<1 || k>ListLength(sl))
return false;
int index = sl[MAXSIZE - 1].cur;
for (int i = 1; i < k - 1; i++)
index = sl[index].cur;
int temp = sl[index].cur;
sl[index].cur = sl[temp].cur;
free_SLL(sl, temp);
}
#endif // !LINEARLIST
静态链表使用示例
#include<iostream>
#include"linearlist.h"
#include<random>
#include<ctime>
using namespace std;
void main()
{
Node StaticLinkList[MAXSIZE];
InitList(StaticLinkList);
cout << "Enter initial value for List: \n";
ListInsertHead(StaticLinkList);
cout << "\nYour list is:\n";
show(StaticLinkList);
cout << "\nInsert a data:\n";
ListInsert(StaticLinkList, 2);
cout << "\nAfter insert a data:\n";
show(StaticLinkList);
ListDelete(StaticLinkList, 5);
cout << "\nAfter delete a data:\n";
show(StaticLinkList);
}