稍微写下解答,不保证对
[2-1] 编写一个实现在顺序表中删除给定元素操作的函数:
bool deletion(sqList &L, element e);
这篇博客以及很好了
https://blog.csdn.net/qq_37618760/article/details/104207248
[2-2] 编写一个实现在单链表中的元素a之前插入元素b操作的函数:
bool insertion(linknode *hp, element a, element b);
看我上篇博客https://blog.csdn.net/Jerome_Chen_Y/article/details/109208826
[2-3] 若要求在时间复杂度为O(1)的前提下实现线性表访问当前元素的前趋和后继,线性表可以采用哪些存储结构?
顺序表,双向链表都可
[2-4] 比较线性表的顺序存储结构和链式存储结构。
嗯哼
[2-5]* 运用单向循环链表求解约瑟夫环问题,试编程实现输出出列序列。
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐一圈。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到所有人全部出列。
题目,可以自己做做提交看
https://www.luogu.com.cn/problem/P1996
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
typedef struct Node
{
int data;
struct Node* next;
}LinkedList;
LinkedList *Initiate()
{
LinkedList* list = (LinkedList*)malloc(sizeof(LinkedList));
list->data = 0;
list->next = NULL;
return list;
}
//要建环
void Create(LinkedList *list, int n)
{
LinkedList* scan = list;
for(int i = 1; i <= n; i++)
{
LinkedList* pnew = (LinkedList*)malloc(sizeof(LinkedList));
pnew->data = i;
pnew->next = scan->next;
scan->next = pnew;
if(i != n)
scan = scan->next;
}
scan = scan->next;
//头尾相接,单向循环链表
scan->next = list->next;
}
void Printoutline(LinkedList *list, int m)
{
LinkedList* scan = list->next;
while(scan->next != scan) //没全出列就继续循环
{
LinkedList* temp;
for(int i = 1; i < m - 1; i++) //找到出列的前一个人
scan = scan->next;
temp = scan->next;
cout << temp->data << ' ';
scan->next = scan->next->next;
free(temp);
scan = scan->next; //从下一个人开始
}
cout << scan->data;
}
int main()
{
int n = 0, m = 0;
cin >> n >> m;
LinkedList* list = Initiate();
Create(list, n);
//把自己出列不好处理,就单独拉出讨论了
if(m == 1)
for(int i = 1; i <= n; i++)
cout << i << ' ';
else
Printoutline(list, m);
system("pause");
return 0;
}
不一定是最好的解,但可以AC噢