版权声明:版权所有!转载通知我! https://blog.csdn.net/qq_41775119/article/details/82833458
1
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OK 1
#define TRUE 1
#define OVERFLOW -2
#define ERROR 0
typedef char ElemType;
typedef int Status;
typedef int Locate;
//定义链表
typedef struct LNode{
ElemType data;
LNode *next;
}*LinkList; //结构体指针名字前必须加*
//初始化代码
Status InitList(LinkList &L)
{
L = (LinkList) malloc (sizeof(LNode));
if(!L) exit(OVERFLOW);
//如果L空 如返回0表示程序/进程是正常结束,而大于0则一般表示有异常,可以根据相应的返回值来让调用者作出相应的处理。
L->next = NULL;
return OK;
}
//插入数据 总是插到第一个位置 所以要倒着插入
Status ListInsert(LinkList L,int i,ElemType e){//在链表L的i位置插入e
int j=0;
LinkList p = L, s;
while(p && j<i-1)
{
p=p->next;
j++;
}
if(!p || j>i-1) return ERROR;
s=(LinkList)malloc(sizeof(LNode));
s->data = e; //图解见书P29 2.8
s->next = p->next;
p->next = s;
return OK;
}
//删除数据
Status ListDelete(LinkList L,int i,ElemType e){//删除第I个元素 并返回元素e
LinkList p = L;
int j = 0;
while (p->next && j<i-1){
p = p->next;
++j;
}
if (!(p->next) || j>i-1) return ERROR;
LinkList q = p->next;
p->next = q ->next;
e = q->data;
free(q);
return OK;
}
// 查找数据
Status GetElem(LinkList L,ElemType e)
{
int i=1;
LinkList p = L->next;
while(p){
if (p->data != e){
i++;
p = p->next;
}
else break;
}
if(!p) return ERROR;
return i;
}
//打印链表
void print(LinkList L){
LinkList p = L->next;
while (p){
printf("%c ",p->data);
p = p->next;
}
printf("\n");
}
int main(){
LinkList L;
InitList(L);
char letter = 'A';
for (int i = 25;i >= 0; --i){
ListInsert(L,1,letter+i);
}
ListDelete(L,1,'A');
print(L);
Locate location;
location = GetElem(L,'D');
printf("Location:%d\n",location);
return 0;
}
2
/**
Joseph问题
Author:BaoMinyang(他的原创)
Date:2018/09/20
*/
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int ElemType;
typedef int DeleteType;
typedef int Status;
//定义链表结点 【注意是节点啊喂!
typedef struct LNode{
ElemType num;
ElemType data;
LNode *next;
}*LinkList; //是指针!结构体!指针!
//定义被删除的结点编号变量
DeleteType del_num;
//链表初始化
Status InitRList(LinkList &L){
L = (LinkList) malloc (sizeof(LNode));
if(!L) exit(OVERFLOW);
L->next = NULL;
return OK;
}
//创建链表
Status CreateRList(LinkList &L,int a[],int n){
LinkList r = L;
for (int i = 0; i < n; ++i){
LinkList q = (LinkList) malloc (sizeof(LNode));
q->num = i+1;
q->data = a[i];
r->next = q;
r = q;//原来的r指针指向新加的q指针的地址 实现了链表结点的添加
printf("num:%d,p:%d\n",q->num,q->data);
}
r->next = L->next; //循环链表定义 将尾结点的后继指针指向头结点的地址
return OK;
}
//删除链表结点
LinkList DeleteRList(LinkList &m,int key){
LinkList p,q;
p = m;
for (int j = 0; j < key-1; j++) p = p->next;
q = p->next;
p->next = q->next;
printf("num:%d出列\n",q->num);
del_num = q->data;
free(q);
return p;
}
//游戏开始
Status Joseph(LinkList &L,int n,int key){
LinkList q = L;
bool isDone = 1;//差不多一个flag标记
while (n-1){
if (isDone){
q = DeleteRList(q,key);
isDone = 0;
}
else {
q = DeleteRList(q,del_num);
}
n--;
}
return q->num;
}
int main(){
int a[35],n=0,init_m;
LinkList L;
printf("请输入m的初始值:");
scanf("%d",&init_m);
printf("请输入参加游戏的人数n:");
scanf("%d",&n);
printf("请输入每个人的密码:");
for (int i = 0; i < n; ++i){
scanf("%d",&a[i]);
}
InitRList(L);
CreateRList(L,a,n);
printf("游戏开始:\n");
printf("最终剩下的是num:%d",Joseph(L,n,init_m));
return 0;
}