#include "stdio.h"
#include "stdlib.h"
typedef struct LNode
{int data;
int num;
struct LNode *next;
}LNode,*linklist;
linklist creat(int n)
{/*构造一个长度为n的无头节点的循环链表,并返回指向最后一个节点的指针*/
linklist head,s;
int i;
s=head=(linklist)malloc(sizeof(LNode));
for(i=1;i<n;i++)
{s->data=i;
printf("num%d: ",i);
scanf("%d",&(s->num));/*输入第i个人的密码*/
while(s->num<=0)
{/*如果输入的s->num小于等于0,要求重新输入*/
printf("请重新输入\nnum%d: ",i);
scanf("%d",&s->num);
}
s->next=(linklist)malloc(sizeof(LNode));
s=s->next;
}
s->data=i;
printf("num%d: ",i);
scanf("%d",&(s->num));
s->next=head;
return(s);
}
linklist find(int m,linklist s) //找到当前元素后面第m个元素
{
int i;
for(i=0;i<m-1;i++)
s=s->next;
return(s);
}
void print(int &m,int &n,linklist &s)
{
linklist p;
s=find(m,s);
printf("%d ",s->next->data);/*输出找到的元素*/
m=s->next->num;/*将此元素从链表中删除,并释放此节点*/
p=s->next;
s->next=s->next->next;
free(p);
--n;
}
void main()
{/*解决约舍夫问题的主函数*/
int n,m;
printf("type in n :");
scanf("%d",&n);/*输入n*/
while(n<=0)
{/*如果输入的n小于等于0,要求重新输入*/
printf("please type n in again \ntype in n :");
scanf("%d",&n);
}
printf("type in m :");
scanf("%d",&m);/*输入m*/
while(m<0)
{/*如果输入的m小于0,要求重新输入*/
printf("please type m in again \ntype in m :");
scanf("%d",&m);
}
linklist s;
s=creat(n);/*创建无头节点的循环链表,返回指向最后一个元素的指针*/
printf("the sequence is ");
print(m,n,s);//输出第一个出列的元素
while(n)
{
print(m,n,s);//输出剩余出列的元素
}
printf("\n");
}
1 #include "stdio.h"
2 #include "stdlib.h"
3 typedef struct LNode
4 {int data;int num;struct LNode *next;}LNode,*linklist;
5 linklist creat(int n)
6 {/*构造一个长度为n的无头节点的循环链表,并返回指向最后一个节点的指针*/
7 linklist head,s;
8 int i;
9 s=head=(linklist)malloc(sizeof(LNode));
10
11 for(i=1;i<n;i++)
12 {s->data=i;
13 printf("num%d: ",i);
14 scanf("%d",&(s->num));/*输入第i个人的密码*/
15 while(s->num<=0)
16 {/*如果输入的s->num小于等于0,要求重新输入*/
17 printf("请重新输入\nnum%d: ",i);
18 scanf("%d",&s->num);
19 }
20 s->next=(linklist)malloc(sizeof(LNode));
21 s=s->next;
22 }
23 s->data=i;
24 printf("num%d: ",i);
25 scanf("%d",&(s->num));
26 s->next=head;
27 return(s);
28 }
29 void main()
30 {/*解决约舍夫问题的主函数*/
31 int n,m;
32 printf("type in n :");
33 scanf("%d",&n);/*输入n*/
34 while(n<=0)
35 {/*如果输入的n小于等于0,要求重新输入*/
36 printf("please type n in again \ntype in n :");
37 scanf("%d",&n);
38 }
39 printf("type in m :");
40 scanf("%d",&m);/*输入m*/
41 while(m<0)
42 {/*如果输入的m小于0,要求重新输入*/
43 printf("please type m in again \ntype in m :");
44 scanf("%d",&m);
45 }
46 linklist s,p;
47 s=creat(n);/*创建无头节点的循环链表,返回指向最后一个元素的指针*/
48 printf("the sequence is ");
49 int i;
50 for(i=0;i<m-1;i++)/*找到第一个输出的元素,输出此元素*/
51 s=s->next;
52 printf("%d ",s->next->data);
53 m=s->next->num;/*将此元素从链表中删除,并释放此节点*/
54 p=s->next;
55 s->next=s->next->next;
56 free(p);
57 --n;
58 while(n)
59 {for(i=0;i<m-1;i++)/*找到第(i+1)个输出的元素,输出此元素*/
60 s=s->next;
61 printf("%d ",s->next->data);
62 m=s->next->num;/*将此元素从链表中删除,并释放此节点*/
63 p=s->next;
64 s->next=s->next->next;
65 free(p);
66 --n;
67 }
68 printf("\n");
69 }
1 // *
2 双向链表的建立
3 */
4 // * ======================================== */
5 #include <stdlib.h>
6 struct dlist
7 // * 双向串列结构宣告
8 */
9 {
10 int data;
11 // * 节点资料
12 */
13 struct dlist *front;
14 // * 指向下一节点的指标 */
15 struct dlist *back;
16 // * 指向前一节点的指标 */
17 };
18 typedef struct dlist dnode;
19 // * 双向串列新型态
20 */
21 typedef dnode *dlink;
22 // * 双向串列指标新型态 */
23 // * ---------------------------------------- */
24 // *
25 使用阵列值建立双向链结串列
26 */
27 // * ---------------------------------------- */
28 dlink createdlist(int *array,int len)
29 {
30 dlink head;
31 // * 双向串列的指标
32 */
33 dlink before;
34 // * 前一节点的指标
35 */
36 dlink new_node;
37 // * 新节点的指标
38 */
39 int i;
40 // * 建立第一个节点 */
41 // * 配置节点记忆体 */
42 head = ( dlink ) malloc(sizeof(dnode));
43 if ( !head )
44 // * 检查记忆体指标
45 */
46 return NULL;
47 head->data = array[0];
48 // * 建立节点内容
49 */
50 head->front = NULL;
51 // * 设定指标初值
52 */
53 head->back = NULL;
54 // * 设定指标初值
55 */
56 before = head;
57 // * 指向第一个节点
58 */
59 for ( i = 1; i < len; i++ )
60 // * 用回路建立其它节点 */
61 {
62 // * 配置节点记忆体 */
63 new_node = ( dlink ) malloc(sizeof(dnode));
64 if ( !new_node )
65 // * 检查记忆体指标
66 */
67 return NULL;
68 new_node->data = array[i];
69 new_node->front = NULL;
70 // * 设定指标初值
71 */
72 new_node->back = before;
73 // * 将新节点指向前节点 */
74 before->front = new_node;
75 // * 将前节点指向新节点 */
76 before = new_node;
77 // * 新节点成为前节点
78 */
79 }
80 return head;
81 // * 传回串列起始指标
82 */
83 }
84 // * ---------------------------------------- */
85 // *
86 双向链结串列的列印
87 */
88 // * ---------------------------------------- */
89 void printdlist(dlink head,dlink now)
90 {
91 while ( head != NULL )
92 // * 串列走访回路
93 */
94 {
95 if ( head == now )
96 // * 印出目前节点资料
97 */
98 printf("#%d#",head->data);
99 // * 列印节点资料
100 */
101 else
102 printf("[%d]",head->data);
103 // * 列印节点资料
104 */
105 head = head->front;
106 // * 指向下一个节点
107 */
108 }
109 printf("\n");
110 // * 换行
111 */
112 }
113 // * ---------------------------------------- */
114 // *
115 主程式: 模拟双向串列的移动
116 */
117 // *
118 使用选项来移动节点, 且将值和节点编号印
119 */
120 // *
121 出.
122 */
123 // * ---------------------------------------- */
124 void main()
125 {
126 dlink head;
127 // * 双向链结串列指标
128 */
129 dlink now = NULL;
130 // * 目前节点指标
131 */
132 int list[6] = { 1, 2, 3, 4, 5, 6 };
133 // * 阵列内容
134 */
135 int select;
136 // * 选择项1,2或3
137 */
138 head = createdlist(list,6);
139 // * 建立双向链结串列
140 */
141 if ( head == NULL )
142 {
143 printf("记忆体配置失败! \n");
144 // * 串列建立失败 */
145 exit(1);
146 // * 结束程式
147 */
148 }
149 now = head;
150 // * 目前指向第一节点
151 */
152 while ( 1 )
153 {
154 printf("链表内容是: ");
155 printdlist(head,now);
156 // * 列印出内容
157 */
158 printf("[1]往下移动 [2]往回移动 [3]离开 ==> ");
159 scanf("%d",&select);
160 // * 读入选项
161 */
162 switch ( select )
163 {
164 // * 往下移动 */
165 case 1: if ( now->front != NULL )
166 now = now->front;
167 // * 指向下一节点 */
168 break;
169 // * 往回移动 */
170 case 2: if ( now->back != NULL )
171 now = now->back;
172 // * 指向前一节点 */
173 break;
174 // * 离开 */
175 case 3: exit(1);
176 }
177 }
178 }