zoukankan      html  css  js  c++  java
  • 数据结构实验一

    #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("请重新输入
    num%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 
    type in n :");
      scanf("%d",&n);
     }
     printf("type in m :");
     scanf("%d",&m);/*输入m*/
     while(m<0)
     {/*如果输入的m小于0,要求重新输入*/
      printf("please type m in again 
    type 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("
    ");
    }
     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("请重新输入
    num%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 
    type 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 
    type 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("
    ");
    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("
    "); 
    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("记忆体配置失败! 
    "); 
    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 }
  • 相关阅读:
    接口开发中的 RestTemplate 传参问题
    逆流成河:五年软件开发生涯
    .NET Web开发技术简单整理
    2011-05-29 21:48 VS.NET2010水晶报表安装部署[VS2010]
    WPF 基础到企业应用系列3——WPF开发漫谈
    C# WinForm开发系列
    接口和委托的区别
    通过jquery触发select自身的change事件
    php去掉字符串中的最后一个字符和汉字
    Go语言学习之数据类型
  • 原文地址:https://www.cnblogs.com/Zblogs/p/3361181.html
Copyright © 2011-2022 走看看