实验目的:
锻炼对链表的熟悉使用 特别是循环链表应用
锻炼对实际问题的分析抽象出正确的数据结构;
问题描述:
有n个数 每走过m个数就剔除一个数。得出删除数的顺序
例如 1 2 3 4 5 6 7 8 9 此时 n=9
m=3 则输出顺序应该是 4 7 1 5 9 6 3 8 2
求解问题基本思路:
利用循环链表 外层循环 9次 找到9个数
内层循环3次找到适合的数 每一次找到符合条件的数
就将其删除 并且将这个数存入一个数组中。
数据结构:
typedef struct LNode{//指向结构体成员 必然是结构体指针
int data;
struct LNode *next;
}LNode,*LinkList;
//循环链表的定义
算法流程步骤:
void CreateList(LinkList &L,int *b){
int i,j;
LinkList phead,tail,pnew;
phead = (LinkList)malloc(sizeof(LNode));
phead ->data = b[0];
L = phead;
for(i = 1; i < N; i++)
{
pnew =(LinkList)malloc(sizeof(LNode));
pnew ->data =b[i];
L->next = pnew;
L = pnew;
}
tail = L;
tail ->next = phead;
L = phead;L必须赋值为phead下次引用时候L时将出现错误 L将直接指向尾结点 而不是头结点。
}
创建循环链表 循环链表不带头结点或者头结点也存取数据;
void yuese(LinkList &L,int *a)
{
int i, j,m;
LinkList p;//记取循环时候的前一个结点//用双向循环链表可以省掉这个变量
printf("请输入隔取的人数:");
scanf("%d",&m);
for(j = 0; j < N; j++)
{
for(i = 0; i < m; i++)
{
p = L;
L = L ->next;
}
p ->next = L->next;//删除结点
a[j] = L->data; //将将要删去的数存储到数组中
}
for(i = 0; i < N ;i++)//打印数据
printf("%d
",a[i]);
}
完整代码演示
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define N 9
typedef struct LNode{//指向结构体成员 必然是结构体指针
int data;
struct LNode *next;
}LNode,*LinkList;
void CreateList(LinkList &L,int *b){
int i,j;
LinkList phead,tail,pnew;
phead = (LinkList)malloc(sizeof(LNode));
phead ->data = b[0];
L = phead;
for(i = 1; i < N; i++)
{
pnew =(LinkList)malloc(sizeof(LNode));
pnew ->data =b[i];
L->next = pnew;
L = pnew;
}
tail = L;
tail ->next = phead;
L = phead;
}
void yuese(LinkList &L,int *a)
{
int i, j,m;
LinkList p;
printf("请输入隔取的人数:");
scanf("%d",&m);
for(j = 0; j < N; j++)
{
for(i = 0; i < m; i++)
{
p = L;
L = L ->next;
}
p ->next = L->next;
a[j] = L->data;
}
for(i = 0; i < N ;i++)
printf("%d
",a[i]);
}
void DestroyList(LinkList &L)
{
LinkList q,phead;
phead = L;
while(L->next !=L)
{
q = L -> next;
free(L);
L = q;
}
}
int main(){
int a[9];
int i;
int b[9] = {1,2,3,4,5,6,7,8,9};
LinkList L;
CreateList(L,b);
yuese(L,a);
DestroyList(L);
return 0;
}