导航:首页 > 计算方法 > 单循环链的计算方法

单循环链的计算方法

发布时间:2022-08-02 01:31:05

㈠ 写算法,求出单循环链表L中值为最大的结点的指针。已知各结点中有data和next两个字段

中间变量指针a, 初始化为头节点的指针。中间变量(存数据的)b,初始化头节点的data的值

从头开始遍历,比较每个节点的data和b的大小
节点的data大的,把该节点指针和data保存到a和b中
节点data小的,什么都不做

遍历完,a就是你要求的

㈡ 用带尾指针的单循环链表作为队列的存储结构 设计算法以实现队列的各运算

typedef struct LNode {
//定义链表节点
int data;
struct LNode *next;
}LNode, *LinkList;

LinkList Head; //定义全局变量链表头

//构造空链表
LinkList InitList( )
{
static LinkList head;
head = (LinkList) malloc (sizeof(LNode));
if( ! head) exit (OVERFLOW);
head->next = NULL;
return head;
}

//输入数据插入到链表后,创建循环链表
Status CreateList(LinkList head ,int m)
{
LinkList p,q;
int i;
p = head;
for(i=1;i<m+1;i++) {
q = (LinkList)malloc(sizeof(LNode));
q->data = i;
q->next = NULL;
p->next = q;
p = p->next;
if(i == m) { p->next = Head->next; } //链成循环链表
}
return OK;
}

㈢ 3.以单循环链表作为存储结构,设计一个解决约瑟夫问题的算法。约瑟夫问题为:设编号为1,2,......,n

以前做的你试试吧

# include<stdio.h>
# include<malloc.h>
# define LEN sizeof(struct people)

struct people //定义结构体people
{
int num;
struct people *next;
};

struct people *creat(int n) //创建节点,并按在节点赋值以作为节点序号
{
struct people *p;
p=(struct people *) malloc(LEN);
p->num=n;
return(p);
}

void main()
{
struct people *p,*head,*p1; //p指针为创建指针;head指向num=0节点;p1为实际运算时所用指针
int num,jump,start,i,j=1;
printf("\n********************************* Josephus问题 *********************************\n");
printf("请输入参与人数:\n");
scanf("%d",&num);
printf("请输入间隔数:\n");
scanf("%d",&jump);
printf("请输入从第几人开始:\n");
scanf("%d",&start);
while(num<1||jump<1||start<1) //防止输入出错,增强强壮性
{
getchar();
printf("输入人数有误,请重新输入:\n");
printf("请输入参与人数:\n");
scanf("%d",&num);
printf("请输入间隔数:\n");
scanf("%d",&jump);
printf("请输入从第几人开始:\n");
scanf("%d",&start);
}
head=p=creat(1); //给head和p赋初值
for(i=2;i<=num;i++) //根据输入的num数,创建num个节点
{
p->next=creat(i);
p=p->next;
}
p->next=head; //将最后一个节点的next指向head,使链表成环
for(i=1;i<start;i++) //根据输入的Start数,将p向后移Start-1位,将值给p1
p=p->next;
p1=p; //将p1指向要开始计数的前一个节点
printf("结果排序如下:\n");
if(num!=1)
{
do //当num不为1时,p1每向后移一位,j的值增加一位
{
if(jump==1) //当junp=1时顺序输出各数
{
printf("%d\t",p1->next->num);
p1->next=p1->next->next;
j=1;
}
else
{
p1=p1->next;
j++;
if(j==jump) //当j的值等于jump值时,输出p1指向的下一个节点的num值,并将p1的下一个节点跳过,j重新计数
{
printf("%d\t",p1->next->num);
p1->next=p1->next->next;
j=1;
}
}
}while(p1->next!=p1); //当p1指向节点的next等于它本身时,循环结束
}
printf("%d\n",p1->num);
}

㈣ 设已有一个单循环链表,结点有三个域,pre 、data、next ,请设计一个算法,大家帮帮忙啊

struct node{
int data;
node *pre,next;
}

假设单循环链表中,头结点指针为head,所有结点的next域已全部赋值。

void Change(node *head)
{
if(head == NULL)
{
return;
}
if(head->next == NULL)
{
head->pre = head;
head->next = head;
return;
}

node *p,*q;
p=head;
q=head->next;
while(q->next != NULL)
{
q->pre = p;
p = p->next;
q = q->next;
}
q->next = head;
head->pre = q;
}

㈤ 关于C语言版数据结构中的单循环链表

void showlist(linklist head){//遍历输出链表
listnode *p;
p=head;
if(p->next=head){//这行里的p->next=head应写成p->next==head
printf("list is empty!\n");
return;
}
else{
while((p=p->next)!=head){
printf("%d ",p->data);
}
}
}

㈥ 试编写算法求单循环链表的表长

typedef struct Node
{int data;
struct Node *next;
}Node,*Link;
typedef structu
{Link *head,*tail;
int len;
}LinkList;

int length(LinkList L)
{return L.len;
}

㈦ 有两个带头结点的单循环链表L1和L2,编写算法将链表L2链接到链表L1之后成为一个单循环链表

list * connect(list* L1,list* L2)
{
list * p=L1
while(p->next)
p=p->next; //找到L1最后一个节点
p->next=L2->next; //把L2的节点连到L1的末端
while(p->next)
p=p->next; //找到L2最后一个节点
p->next=L1; //将next指向L1头节点,形成循环链表
return L1;
}

㈧ 单循环赛制怎么计算

单循环比赛的场数,可用下面的公式计算(简单的数学组合公式):

比赛场数= 队数*(队数-1)/2

如6个队或7个队参加比赛,则比赛场数为:

6 *(6-1)/2 =15(场) 7*(7-1)/2 =21(场)

比赛轮数:在循环制的比赛中,各队都参加完一场比赛即为一轮。(所有队数同时进行一场比赛为一轮)

参加比赛的队数为单数时,比赛轮数等于队数。如5个队参加比赛,即比赛轮数为五轮。

参加比赛的队数为双数时,比赛轮数等于队数减一。如6个队参加比赛,则比赛轮数为五轮。

(8)单循环链的计算方法扩展阅读:

循环赛的各个参赛者(队)的名次需在整个比赛结束以后,统计各自的积分才能最终全部确定,所以一旦开赛就不便增减参赛者,不然就会影响各参赛者成绩的计算,不时闹出的退赛风波就暴露了这个弱点。

另外,循环赛的每一场比赛除了产生当事双方的成绩以外,还可能影响到第三方的名次,这就为产生各种涉及人情、关系、利益的比赛埋下了隐患,以影响比赛的公平公正。由此可见,循环赛是种封闭式的、易受干扰的比赛制度。

为避免循环赛运行时可能出现的麻烦,可选用排位赛制度予以代之。

㈨ 单链表、单循环链表和双向链表

1.单链表不行,因为单链表没有办法得到其前驱;
2. 单循环链表可以,假设链表的元素大于等于2:
struct Node
{
Node * next;
int data;
};

循环链表 Node * list;
Node *pnode = p;

while(pnode->next != p)
{
pnode = pnode->next;
}

//找到其前驱了
int tmp = pnode->data;
pnode->data = p->data;
p->data->tmp;

3.双向链表可以,假设链表的元素大于等于2,且p不为链表头。
struct Node
{
Node * next;
Node * pre;
int data;
}

双向链表list;
Node *pnode = p;
if(p->pre != NULL)
{
int tmp = p->data;
p->data = p->pre->data;
p->pre->data = tmp;
}

阅读全文

与单循环链的计算方法相关的资料

热点内容
什么样的方法能瘦下来 浏览:429
虫牙打洞治疗方法 浏览:881
糖尿病检测方法题 浏览:528
2012年汾酒鉴定方法及技巧 浏览:119
如何自己制作竹子的方法 浏览:854
面部混合痣的最佳治疗方法 浏览:361
中种发酵方法和技巧 浏览:407
中学生物教学方法ppt 浏览:985
怎么设置qq铃声设置方法 浏览:64
如何用最快的方法打气球 浏览:827
绿建三星计算方法 浏览:601
正确汽车打蜡方法图解 浏览:20
周长有哪些混合运算方法 浏览:383
毛细管方法检测HbA1c优点 浏览:665
清洗冰箱方法和步骤 浏览:595
如何制作直播的方法 浏览:983
腰间盘锻炼的方法 浏览:1006
缓解疲劳的方法都有哪些 浏览:856
民间投篮训练方法 浏览:963
哪些方法可以捕捉文案创作灵感 浏览:197