int i,len; LinkList p; i=1; len=ListLength(S); p=S; while(p->next!=S) p=p->next;//把p指向第一个结点的前驱 while(len>1){//若链表中还多
时间: 2023-05-31 13:05:57 浏览: 49
于一个结点
if(i%2==0){//如果当前结点是偶数结点,删除之
LinkList q=p->next;
p->next=q->next;
free(q);
len--;
}
else{//如果当前结点是奇数结点,继续遍历
p=p->next;
}
i++;
}
return p->data; //返回最后剩下的结点的数据
相关问题
LinkList joseph(LinkList S,int m) { int i,len; LinkList p; i=1; len=ListLength(S); p=S; while(p->next!=S) p=p->next;//把p指向第一个结点的前驱 while(len>1){
这是一个约瑟夫问题的解法,使用循环链表来实现。具体实现细节可以参考代码:
LinkList joseph(LinkList S, int m) {
int i, len;
LinkList p, q;
i = 1;
len = ListLength(S);
p = S;
while (p->next != S) p = p->next; // 把p指向第一个结点的前驱
while (len > 1) {
for (i = 1; i < m; i++) {
p = p->next;
}
q = p->next;
p->next = q->next;
len--;
free(q);
}
return p;
}
这个函数的作用是解决约瑟夫问题,其中参数S是一个循环链表的头结点,m是每次删除的数的个数。函数返回最后剩下的结点。
注意,这个函数的实现并不完整,需要自己实现一些辅助函数,比如ListLength等。
typedef struct Lnode { struct Lnode* next; int data; }Lnode, * LinkList; void InitList(LinkList & L) { L = new Lnode; L->next = NULL; }
L)
{
L = NULL; // 将头指针置为 NULL,表示链表为空
}
void CreateList(LinkList& L, int n)
{
Lnode* p, * q;
L = new Lnode; // 创建头结点
L->next = NULL;
q = L;
for (int i = 0; i < n; i++)
{
p = new Lnode; // 创建新节点
cin >> p->data;
p->next = NULL;
q->next = p;
q = p; // 将新节点插入到链表尾部
}
}
void DestroyList(LinkList& L)
{
Lnode* p, * q;
p = L;
while (p != NULL)
{
q = p->next;
delete p;
p = q; // 释放链表中所有节点的内存空间
}
L = NULL;
}
int ListLength(LinkList L)
{
int len = 0;
Lnode* p = L;
while (p->next != NULL)
{
len++;
p = p->next;
}
return len;
}
bool ListEmpty(LinkList L)
{
return L->next == NULL;
}
void GetElem(LinkList L, int i, int& e)
{
Lnode* p = L->next;
int j = 1;
while (p != NULL && j < i)
{
p = p->next;
j++;
}
if (p == NULL || j > i)
{
cout << "Error: out of range" << endl;
return;
}
e = p->data;
}
int LocateElem(LinkList L, int e)
{
Lnode* p = L->next;
int i = 1;
while (p != NULL && p->data != e)
{
p = p->next;
i++;
}
if (p == NULL)
return 0;
else
return i;
}
void ListInsert(LinkList& L, int i, int e)
{
Lnode* p = L;
int j = 0;
while (p != NULL && j < i - 1)
{
p = p->next;
j++;
}
if (p == NULL || j > i - 1)
{
cout << "Error: out of range" << endl;
return;
}
Lnode* q = new Lnode;
q->data = e;
q->next = p->next;
p->next = q; // 在第 i 个位置插入元素 e
}
void ListDelete(LinkList& L, int i, int& e)
{
Lnode* p = L;
int j = 0;
while (p->next != NULL && j < i - 1)
{
p = p->next;
j++;
}
if (p->next == NULL || j > i - 1)
{
cout << "Error: out of range" << endl;
return;
}
Lnode* q = p->next;
e = q->data;
p->next = q->next;
delete q; // 删除第 i 个位置的元素,并将其值赋给 e
}
void ListTraverse(LinkList L)
{
Lnode* p = L->next;
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
阅读全文