1.创建双向链表
代码:
struct Dblink* create_dblink()
{
struct Dblink* head = (struct Dblink*)malloc(sizeof(struct Dblink));
if(head == NULL)
{
printf("双向链表创建失败!!\n");
return (struct Dblink*)-1;
}
head->txt.len = 0;
head->next =NULL;
head->prev = NULL;
printf("双向链表创建成功!!\n");
return head;
}
2.头插法插入节点
代码
//头插
void insert_head(struct Dblink* head)
{
struct Dblink* p = head;
printf("请输入要插入的数据:\n");
dataType data;
scanf("%d",&data);
struct Dblink* temp = (struct Dblink*)malloc(sizeof(struct Dblink));
temp->txt.data = data;
temp->next=NULL;
temp->prev=NULL;
if(head->next == NULL)
{
head->next = temp;
temp->prev = head;
head->txt.len++;
}else{
temp->next = head->next;
head->next = temp;
temp->prev = head;
temp->next->prev = temp;
head->txt.len++;
}
return;
}
3.尾插法插入节点
代码:
//尾插
void insert_tail(struct Dblink* head)
{
struct Dblink* temp = (struct Dblink*)malloc(sizeof(struct Dblink));
printf("请输入要插入的数据:\n");
dataType data;
scanf("%d",&data);
temp->next = NULL;
temp->prev = NULL;
temp->txt.data = data;
struct Dblink* p = head;
while(p->next != NULL)
{
p=p->next;
}
p->next = temp;
temp->prev = p;
head->txt.len++;
return;
}
4.头删法删除节点
代码:
//头删
void delate_head(struct Dblink* head)
{
struct Dblink *p = head->next;
if(p == NULL)
{
printf("顺序表为空,删除失败!!!\n");
return;
}
if(p->next == NULL)
{
head->next = NULL;
free(p);
return;
}else
{
head->next = p->next;
p->next->prev = head;
free(p);
head->txt.len--;
return;
}
}
5.尾删
代码:
//尾删
void delate_tail(struct Dblink* head)
{
struct Dblink*p = head;
if(p->next == NULL)
{
printf("链表为空,删除失败!!!\n");
return;
}
while(p->next != NULL)
{
p = p->next;
}
p->prev->next = NULL;
free(p);
head->txt.len--;
return;
}
6.按位置插入
代码:
//按位置插入
void insert_pos(struct Dblink*head)
{
printf("请输入要插入的数据的位置和数据:\n");
int pos,data;
scanf("%d %d",&pos,&data);
if(pos<1 ||pos>head->txt.len+1){
printf("插入位置不合法!!\n");
}
struct Dblink* p = head;
struct Dblink* temp = (struct Dblink*)malloc(sizeof(struct Dblink));
temp->txt.data = data;
temp->next = NULL;
temp->prev = NULL;
if(p->next != NULL){
for(int i=0;i<pos-1;i++)
{
p=p->next;
}
temp->next = p->next;
p->next = temp;
p->next->prev = temp;
temp->prev = p;
head->txt.len++;
return;
}
else
{
p->next = temp;
temp->prev = p;
head->txt.len++;
return;
}
return;
}
7.按位置删除
代码:
//按位置删除
int delate_pos(struct Dblink*head)
{
printf("请输入要删除的数据的位置:\n");
int pos,data;
scanf("%d",&pos);
if(pos<1 || pos>head->txt.len)
{
printf("输入的位置不合法!!!\n");
}
struct Dblink* p = head;
if(head->next == NULL)
{
printf("链表为空,删除失败!!!\n");
}
for(int i=0;i<pos;i++)
{
p = p->next;
}
if(p->next == NULL)
{
head->next = NULL;
p->txt.data = data;
free(p);
head->txt.len--;
return data;
}else
{
head->next = p->next;
p->next->prev = head;
p->txt.data = data;
free(p);
head->txt.len--;
return data;
}
}
8.遍历
代码:
//遍历
void show(struct Dblink* head)
{
struct Dblink* p = head;
while(p->next != NULL)
{
p=p->next;
printf("%d\t",p->txt.data);
}
printf("\n");
return;
}
9.约瑟夫问题
1.设编号分别为:1,2,...,n的n个人围坐一圈。
2.约定序号为k(1<=k<=n)的人从1开始计数,数到m的那个人出列,
3.他们的下一位又开始从1开始数,数到m那个人又出列,以此类推,直到所有人出列为止。
代码:
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node *next;
};
struct Node* createCircularLinkedList(int n) {
struct Node *head, *temp, *p;
int i;
head = (struct Node*)malloc(sizeof(struct Node));
head->data = 1;
p = head;
for (i = 2; i <= n; i++) {
temp = (struct Node*)malloc(sizeof(struct Node));
temp->data = i;
p->next = temp;
p = temp;
}
p->next = head; // 链接最后一个节点和头节点,形成循环链表
return head;
}
int josephus(struct Node **head, int m) {
struct Node *current = *head, *p = NULL;
while (current->next != current) {
// 找到第m个节点
int count = 1;
while (count != m) {
p = current;
current = current->next;
count++;
}
// 删除当前节点
p->next = current->next;
free(current);
current = p->next;
}
int lastPerson = current->data;
free(current);
*head = NULL;
return lastPerson;
}
int main() {
int n, m;
printf("请输入参与游戏的人数n:");
scanf("%d", &n);
printf("请输入数字m:");
scanf("%d", &m);
struct Node *head = createCircularLinkedList(n);
int lastPerson = josephus(&head, m);
printf("最后留下来的人的编号为:%d", lastPerson);
return 0;
}