一、循环链表
#include "stdio.h"
#include "stdlib.h"
typedef struct node
{
int data;
struct node *next;
}node;
初始化循环链表
void ds_init(node **pNode) // 初始化循环链表, **pNode:链表上
{
int item;
node *temp;
node *target;
printf("输入结点的值, 输入0完成初始化\n");
while(1)
{
scanf("%d", &item);
fflush(stdin);
if(item == 0)
return;
if((*pNode) == NULL){
// 循环链表中只有一个结点
*pNode = (node*)malloc(sizeof(struct CLinkList)); // 分配空间
if(!(*pNode))
exit(0); // 错误退出
(*pNode)->data = item;
(*pNode)->next = *pNode;
}
else{
// 找到next指向第一个结点的结点
for(target = (*pNode); target->next != (*pNode); target = target->next);
// 生成一个新的结点
temp = (node*)malloc(sizeof(struct CLinkList));
}
}
}
返回结点所在位置
int ds_search(node *pNode, int elem)
{
node *target;
int i = 1;
for(target = pNode; target->data != elem && target->next != pNode; ++i)
{
target = target->next;
}
if(target->next == pNode) // 表中不存在改元素
return 0;
else
return i;
}
/**********************************
功能:插入结点
参数:链表的第一个位置,插入的位置
**********************************/
void ds_insert(node **pNode, int i)
{
node *temp;
node *target;
node *p;
int item;
int j = 1;
printf("输入要插入的结点值:");
scanf("%d", &item);
if(i == 1){
// 新增结点作为你第一个结点
temp = (node *)malloc(sizeof(struct CLinkList));
if(!temp)
exit(0);
temp->data = item;
// 寻找到最后一个结点
for(target = 0; target->next != (*pNode); target = target->next); // 寻找到最后一个结点
temp->next = (*pNode); // 插入结点的指针指向第一个结点的
target->next = temp; // 最后一个结点指针指向新插入的
*pNode = temp; //
}
else{
target = *pNode;
for(; j < (i - 1); ++j)
{
target = target->next;
}
// 若i = 3 则target指向第三个元素
temp = (node *)malloc(sizeof(struct CLinkList));
if(!temp)
exit(0);
temp->data = item;
p = target->next;
target->next = temp;
temp->next = p;
}
}
删除结点
void ds_delete(node **pNode, int i)
{
node *target;
node *temp;
int j = 1;
if(i == 1){ // 删除的是第一个结点
for(target = *pNode; target->next != *pNode; target = target->next); // 寻找到最后一个结点
temp = *pNode;
*pNode = (*pNode)->next;
target->next = *pNode;
free(temp);
}
else{
target = *pNode;
for(; j < (i - 1); ++j)
{
target = target->next; // 找到删除的结点
}
temp = target->next;
target->next = temp->next;
free(temp);
}
}
二、约瑟夫环
#include "stdio.h"
#include "stdlib.h"
typedef struct node
{
int data;
struct node *next;
}node;
node *create(int n)
{
node *p = NULL, *head;
head = (node*)malloc(sizeof (node));
p = head;
node *s;
int i = 1;
if(0 != n){
while(i <= n){
s = (node *)malloc(sizeof (node));
s->data = i++; // 先赋值,再自增
p->next = s;
p = s;
}
s->next = head->next;
}
free(head); // 去掉头结点构成环
return s->next;
}
int main()
{
int n = 41;
int m = 3;
int i;
node *p = create(n);
node *temp;
m %= n; // m = 2
while(p != p->next){ // 若指向头,头为空退出循环
for(i = 1; i < m - 1; i++) // 执行一次
{
p = p->next; // 第一个结点指针指向第二个,p 为第二个结点
}
printf("%d->", p->next->data); // 打印第三个结点的数据
temp = p->next; // 将第三个结点暂时赋给temp
p->next = temp->next; // 第二个结点指针指向第四个结点
free(temp); // 释放第三个结点
p = p->next; // p赋值为第四个结点
}
printf("%d\n", p->data);
return 0;
}
三、问题