数据结构实验一

#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 }

 

posted @ 2013-10-10 14:09  herizai007  阅读(186)  评论(0编辑  收藏  举报