数据结构实验课 笔记

版权声明:版权所有!转载通知我! 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;
}

猜你喜欢

转载自blog.csdn.net/qq_41775119/article/details/82833458