开始学习数据结构,把写过的代码发上来,希望可以给有需要的人一个参考。
//本代码由 大漠孤烟 整理编写,并验证通过
//求解约瑟夫问题,涉及到链表节点的生成,节点的插入和删除,对理解链表非常有好处
//N个节点围城一圈,从第一个节点开始计数(1),每数到第M的数删除,看最后留下那个数
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct LNode
{
int item;
LNode *next;//注意,这里要用自己的类型声明一个指针
}LNode;
//这个声明创建了一个链表节点的结构体,包括数据域个指针域
//LNode是一个结构变量,可以用来计算结构体占用的内存
//声明一个指向链表节点的指针
typedef struct LNode *LinkList;
int main(int argc,char *argv[])//使用参数之后要从dos界面运行并输入参数
{
int N,M;
int i;
N = atoi(argv[1]);
M = atoi(argv[2]);
LinkList Lhead,p,q;//定义三个指向链表结构的指针
//将malloc()的返回值强制转换为LinkList类型,不可少
Lhead = (LinkList)malloc(sizeof(LNode));//为头结点分配空间
if(!Lhead)
return 1;//分配内存空间失败
Lhead->item = 1;
Lhead->next = Lhead;
p = Lhead;
for(i = 2; i <= N; i++)
{
q = (LinkList)malloc(sizeof(LNode));//重新申请一个节点空间
if(!q)
return 1;
q->next = p->next;
p->next = q;//插入一个节点
q->item = i;
p = q;//这样下次循环的时候节点可以接在本次节点的后面
}
//此时q是最后一个节点
while(q != q->next)//直到指向自己,也就是说剩下一个
{
for(i= 1; i < M; i++)
{
q = q->next;
//printf("%d",q->item);
}
//printf(" ");
p = q->next;
printf("删除节点: %d\n",p->item);
q->next = q->next->next;//删除一个节点
N--;
free(p);//及时释放内存
}
printf("最后剩下的节点:%d\n",q->item);
free(q);
while(1);
}
最后上传一个运行结果截图