㈠ 寫演算法,求出單循環鏈表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;
}