双向链表
typedef struct doulink
{
int val;
struct doulink* prev;
struct doulink* next;
};
初始化
doulink* initdoulink()
{
doulink* head = (doulink*)malloc(sizeof(doulink));
doulink* temp = head;
head->prev = NULL;
head->next = NULL;
head->val = 1;
for (int i = 2; i < 5; i++)
{
doulink* a = (doulink*)malloc(sizeof(doulink));
a->val = i;
a->next = NULL;
a->prev = temp;
temp->next = a;
temp = a;
}
return head;
}
打印
void printdoulink(doulink* dl)
{
doulink* temp = dl;
while (temp != NULL)
{
cout << temp->val << endl;
temp = temp->next;
}
}
插入(头插尾插另写)
doulink* insertdoulink(doulink* dl, int val, int num)
{
doulink* temp = dl;
for (int i = 1; i < num; i++)
{
if (temp == NULL)
{
cout << "wx" << endl;
return dl;
}
temp = temp->next;
}
doulink* ndl = (doulink*)malloc(sizeof(doulink));
ndl->val = val;
doulink* a = temp->next;
temp->next = ndl;
ndl->prev = temp;
ndl->next = a;
a->prev = ndl;
return dl;
}
循环链表
typedef struct xlink
{
int val;
struct xlink* next;
};
初始化
xlink* initxlink(int num)
{
xlink* head = (xlink*)malloc(sizeof(xlink));
xlink* temp = head;
head->val = 1;
head->next = NULL;
for (int i = 2; i < num+1; i++)
{
xlink* a = (xlink*)malloc(sizeof(xlink));
a->val = i;
if (i == 5)
{
a->next = head;
}
else
{
a->next = NULL;
}
temp->next = a;
temp = a;
}
return head;
}
打印
void printxlink(xlink* dl)
{
xlink* temp = dl;
xlink* flag = dl;
while (temp != NULL)
{
cout << temp->val << endl;
temp = temp->next;
if (temp == flag) break;
}
}
循环链表解决约瑟夫环
xlink* digui(xlink* xl,int num)
{
if (xl == xl->next)
{
return xl;
}
xlink* temp = xl;
for (int i = 1; i < num; i++)
{
temp = temp->next;
}
xlink* flag = temp;
while (flag->next != temp)
{
flag = flag->next;
}
flag->next = temp->next;
cout<<"出列:"<<temp->val<<endl;
digui(temp->next, num);
}
//实现约瑟夫环
int xlinky(xlink* xl, int start, int num)
{
xlink* temp = xl;
for (int i = 1; i < start; i++)
{
temp = temp->next;
}
xlink* n = digui(temp, num);
return n->val; //返回最后一个人
}
判断一个链表是否为环
最佳方法:快慢指针
bool ishuan(link* head)
{
bool flag=false;
link* fast,slow;
fast=slow=head;
while(fast!=NULL && slow!=NULL)
{
fast=fast->next->next;
slow=slow->next;
if(fast==slow)
{
flag=true;
}
}
return flag;
}
俄罗斯轮盘赌小游戏
xlink* edigui(xlink* head)
{
if (head->next == head)
{
return head;
}
int m = rand() % 6 + 1; // 1 2 3 4 5 6
xlink* temp = head;
for (int i = 1; i < m; i++)
{
temp = temp->next;
}
xlink* flag = temp;
while (flag->next != temp)
{
flag = flag->next;
}
flag->next = temp->next;
cout << temp->val << "号死" << endl;
edigui(temp->next);
}
//俄罗斯轮盘赌
int els(xlink* xl)
{
xlink* temp = xl;
xlink* a = edigui(temp);
return a->val;
}