数据结构 --线性表

一直觉得数据结构是很好的东西,早就说要看,直到现在才静下心来。

下面就从简单的线性表开始,慢慢学习吧。

线性表综合运用:

约瑟夫循环:设有n个人围坐在一个圆桌周围,现在从第s个人开始报数,数到第m的人出列,然后从出列的人下一个人重新开始报数,数到第m的人出列......如此反复直到所有的人全部出列为止。约瑟夫循环问题是:对于任意给定的n,s和m,求出按出列次序得到的n个人员的序列。

1.顺表表实现(数组)

  1 // Josephus-seqList.cpp : 定义控制台应用程序的入口点。
  2 //
  3 
  4 #include "stdafx.h"
  5 #include <stdlib.h>
  6 #include <malloc.h>
  7 #define MAXNUM 100
  8 #define FALSE 0
  9 #define TRUE 1
 10 #define SPECIAL 2147483647
 11 typedef int DataType;
 12 
 13 struct SeqList
 14 {
 15     DataType element[MAXNUM];
 16     int n;
 17 };
 18 
 19 typedef struct SeqList* PSeqList;
 20 
 21 PSeqList createNullList_seq(void)
 22 {
 23     PSeqList palist;
 24     palist = (PSeqList)malloc(sizeof(struct SeqList));
 25     if(palist != NULL)
 26     {
 27         palist->= 0;
 28     }
 29     else
 30     {
 31         printf("Out of space!!\n");
 32     }
 33     return(palist);
 34 }
 35 
 36 int insert_seq(PSeqList palist, int p, DataType x)
 37 {
 38     int q;
 39     if(palist->== MAXNUM)
 40     {
 41         printf("Overflow!\n");
 42         return(FALSE);
 43     }
 44     if(p < 0 || p > palist->n)
 45     {
 46         printf("Not exist!\n");
 47         return(FALSE);
 48     }
 49     for(q = palist->- 1; q >= p; q--)
 50     {
 51         palist->element[q + 1= palist->element[q];
 52     }
 53         palist->element[p] = x;
 54         palist->+= 1;
 55         return(TRUE);
 56 }
 57 
 58 int delete_seq(PSeqList palist, int p)
 59 {
 60     int q;
 61     if(p < 0 || p > palist->- 1)
 62     {
 63         printf("Not exist!\n");
 64         return(FALSE);
 65     }
 66     for(q = p; q < palist->- 1; q++)
 67     {
 68         palist->element[q] = palist->element[q + 1];
 69     }
 70     palist->= palist->- 1;
 71     return(TRUE);
 72 }
 73 
 74 int locate_seq(PSeqList palist, DataType x)
 75 {
 76     int q;
 77     for(q = 0; q < palist->n; q++)
 78     {
 79         if(palist->element[q] == x)
 80             return(q);
 81     }
 82     return (-1);
 83 }
 84 
 85 DataType retrieve_seq(PSeqList palist, int p)
 86 {
 87     if(p >= 0 && p < palist->n)
 88     {
 89         return(palist->element[p]);
 90     }
 91     printf("Not exist.\n");
 92     return(SPECIAL);
 93 }
 94 
 95 int isNullList_seq(PSeqList palist)
 96 {
 97     return(palist->== 0);
 98 }
 99 
100 void josephus_seq(PSeqList palist, int s, int m)
101 {
102     int s1,i,w;
103     s1 = s - 1;
104     for(i = palist->n; i > 0; i--)
105     {
106         s1 = (s1 + m - 1% i;
107         w = retrieve_seq(palist,s1);
108         printf("Out element %d\n", w);
109         delete_seq(palist,s1);
110     }
111 }
112 int _tmain(int argc, _TCHAR* argv[])
113 {
114     PSeqList jos_alist;
115     int i, k;
116     int n,s,m;
117     printf("\nplease input the values(<100) of n = ");
118     scanf_s("%d"&n);
119     printf("please input the value of s = ");
120     scanf_s("%d"&s);
121     printf("please input the value of m = ");
122     scanf_s("%d"&m);
123     jos_alist = createNullList_seq();
124     for(i = 0; i < n; i++)
125     {
126         k = insert_seq(jos_alist, i, i + 1);
127         if(k == FALSE)
128             exit(1);
129     }
130     josephus_seq(jos_alist,s,m);
131     free(jos_alist);
132     return 0;
133 }
134 

135

2.链表实现

  1 // Josephus_link.cpp : 定义控制台应用程序的入口点。
  2 //
  3 
  4 #include "stdafx.h"
  5 #include <stdlib.h>
  6 #include <malloc.h>
  7 #define FALSE 0
  8 #define TRUE 1
  9 struct Node;
 10 typedef struct Node * PNode;
 11 typedef int DataType;
 12 struct Node
 13 {
 14     DataType info;
 15     PNode link;
 16 };
 17 
 18 typedef struct Node * LinkList;
 19 typedef LinkList * PLinkList;
 20 
 21 LinkList createNullList_link(void)
 22 {
 23     LinkList llist;
 24     llist = (LinkList)malloc(sizeof(struct Node));
 25     if(llist != NULL)
 26         llist->link = NULL;
 27     return(llist);
 28 }
 29 
 30 int insert_link(LinkList llist, int i, DataType x)
 31 {
 32     PNode p,q;
 33     int j = 0;
 34     p = llist;
 35     while(p != NULL && j < i)
 36     {
 37         p = p->link;
 38         j++;
 39     }
 40     if(j != i)
 41     {
 42         printf("The value of i = %d is not reasonable.\n", i);
 43         return(0);
 44     }
 45     q = (PNode)malloc(sizeof(struct Node));
 46     if(q == NULL)
 47     {
 48         printf("Out of space!!!\n");
 49         return(0);
 50     }
 51     else
 52     {
 53         q->info = x;
 54         q->link = p->link;
 55         p->link = q;
 56         return(1);
 57     }
 58 }
 59 
 60 int delete_link(LinkList llist, DataType x)
 61 {
 62     PNode p, q;
 63     p = llist;
 64     while(p->link != NULL && p->link->info != x)
 65         p = p->link;
 66     if(p->link == NULL)
 67     {
 68         printf("Not exist!\n");
 69         return(0);
 70     }
 71     else
 72     {
 73         q = p->link;
 74         p->link = p->link->link;
 75         free(q);
 76         return(1);
 77     }
 78 }
 79 
 80 PNode locate_link(LinkList llist, DataType x)
 81 {
 82     PNode p;
 83     if(llist == NULL)
 84         return(NULL);
 85     p =llist->link;
 86     while(p != NULL && p->info != x)
 87         p = p->link;
 88     return(p);
 89 }
 90 
 91 PNode find_link(LinkList llist, int i)
 92 {
 93     PNode p;
 94     int j;    
 95     if(i < 0)
 96     {
 97         printf("The value of i = %d is not reasonable.\n",i);
 98         return(NULL);
 99     }
100     p = llist;
101     for(j = 0; j <= i; j++)
102     {
103         p = p->link;
104         if(p == NULL)
105             return(NULL);
106     }
107     return(p);
108 }
109 
110 int isNullList_link(LinkList llist)
111 {
112     if(llist == NULL)
113         return(1);
114     else
115         return(llist->link == NULL);
116 }
117 
118 int init_clink(PLinkList pclist, int n)
119 {
120     PNode p, q;
121     int i;
122     q =(PNode)malloc(sizeof(struct Node));
123     if(q == NULL)
124         return(FALSE);
125     *pclist = q;
126     q->info = 1;
127     q->link = q;
128     if(n == 1)
129         return(TRUE);
130     for(i = 2; i < n + 1; i++)
131     {
132         p = (PNode)malloc(sizeof(struct Node));
133         if(p == NULL)
134             return(FALSE);
135         p->info = i;
136         p->link = q->link;
137         q->link = p;
138         q = p;
139     }
140     return(TRUE);
141 }
142 
143 void josephus_clink(PLinkList pclist, int s, int m)
144 {
145     PNode p, pre;
146     int i;
147     p = *pclist;
148     //如果s是第一个节点,特殊处理,通过循环将pre指向最后一个节点
149     if(s==1)
150     {
151         pre = p;
152         p = p->link;
153         while(p != *pclist)
154         {
155             pre = p;
156             p = p->link;
157         }
158     }
159     else
160     {
161         for(i = 1; i < s; i++)
162         {
163             pre = p;
164             p = p->link;
165         }
166     }
167     while(p != p->link)
168     {
169         for(i = 1; i < m; i++)
170         {
171             pre = p;
172             p = p->link;    
173         }
174         printf("Out element: %d \n", p->info);
175         //删除第一个节点时特殊处理一下
176         if(*pclist == p)
177             *pclist = p->link;
178         pre->link = p->link;
179         free(p);
180         p = pre->link;
181     }
182     printf("Out element: %d \n", p->info);
183     *pclist = NULL;
184     free(p);
185 
186 
187 }
188 int _tmain(int argc, _TCHAR* argv[])
189 {
190     LinkList jos_clist;
191     int n,s,m;
192     printf("\nplease input the value of n = ");
193     scanf_s("%d"&n);
194     printf("please input the value of s = ");
195     scanf_s("%d",&s);
196     printf("please input the value of m = ");
197     scanf_s("%d",&m);
198     if(init_clink(&jos_clist,n))
199         josephus_clink(&jos_clist, s,m);
200     else
201         printf("Out of space!\n");
202 
203     return 0;
204 }
205 

206   

 运行结果:


please input the value of n =8

please input the value of s =1 

please input the value of m =4

Out element: 4 

Out element: 8 

Out element: 5 

Out element: 2 

Out element: 1 

Out element: 3 

Out element: 7 

Out element: 6 

 

 

 

posted @ 2009-05-21 16:01  Ypeng  阅读(426)  评论(0编辑  收藏  举报