数据结构 --线性表

时间:2022-04-18 07:41:58

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

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

线性表综合运用:

约瑟夫循环:设有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