A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. #include "stdio.h"

  2. #define OK 1
  3. #define ERROR 0
  4. #define TRUE 1
  5. #define FALSE 0

  6. typedef int Status;   /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
  7. typedef int ElemType; /* ElemType类型根据实际情况而定,这里假设为int */

  8. typedef struct Node
  9. {
  10.     ElemType data;
  11.     struct Node *next;
  12. }Node;

  13. typedef struct Node *LinkList; /* 定义LinkList */

  14. Status visit(ElemType c)
  15. {
  16.     printf("%d ",c);
  17.     return OK;
  18. }

  19. /* 初始化顺序线性表 */
  20. Status InitList(LinkList *L)
  21. {
  22.     *L=(LinkList)malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */

  23.     if(!(*L)) /* 存储分配失败 */
  24.     {
  25.         return ERROR;
  26.     }

  27.     (*L)->next=NULL; /* 指针域为空 */

  28.     return OK;
  29. }

  30. /* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */
  31. int ListLength(LinkList L)
  32. {
  33.     int i=0;
  34.     LinkList p=L->next; /* p指向第一个结点 */

  35.     while(p)
  36.     {
  37.         i++;
  38.         p=p->next;
  39.     }

  40.     return i;
  41. }

  42. /* 初始条件:顺序线性表L已存在 */
  43. /* 操作结果:依次对L的每个数据元素输出 */
  44. Status ListTraverse(LinkList L)
  45. {
  46.     LinkList p=L->next;

  47.     while(p)
  48.     {
  49.         visit(p->data);
  50.         p = p->next;
  51.     }

  52.     printf("\n");

  53.     return OK;
  54. }

  55. /*  随机产生n个元素的值,建立带表头结点的单链线性表L(尾插法) */
  56. void CreateListTail(LinkList *L, int n)
  57. {
  58.         LinkList p,r;
  59.         int i;

  60.         srand(time(0));                      /* 初始化随机数种子 */
  61.         *L = (LinkList)malloc(sizeof(Node)); /* L为整个线性表 */
  62.         r=*L;                                /* r为指向尾部的结点 */

  63.         for (i=0; i < n; i++)
  64.         {
  65.                 p = (Node *)malloc(sizeof(Node)); /*  生成新结点 */
  66.                 p->data = rand()%100+1;           /*  随机生成100以内的数字 */
  67.                 r->next=p;                        /* 将表尾终端结点的指针指向新结点 */
  68.                 r = p;                            /* 将当前的新结点定义为表尾终端结点 */
  69.         }

  70.         r->next = NULL;                       /* 表示当前链表结束 */
  71.         // 创建有环链表
  72.     //r->next = p;
  73. }

  74. Status GetMidNode(LinkList L, ElemType *e)
  75. {
  76.     LinkList search, mid;
  77.     mid = search = L;

  78.     while (search->next != NULL)
  79.     {
  80.         //search移动的速度是 mid 的2倍
  81.         if (search->next->next != NULL)
  82.         {
  83.             search = search->next->next;
  84.             mid = mid->next;
  85.         }
  86.         else
  87.         {
  88.             search = search->next;
  89.         }
  90.     }

  91.     *e = mid->data;

  92.     return OK;
  93. }

  94. int main()
  95. {
  96.     LinkList L;
  97.     Status i;
  98.     char opp;
  99.     ElemType e;
  100.     int find;
  101.     int tmp;

  102.     i=InitList(&L);
  103.     printf("初始化L后:ListLength(L)=%d\n",ListLength(L));

  104.     printf("\n1.查看链表 \n2.创建链表(尾插法) \n3.链表长度 \n4.中间结点值 \n0.退出 \n请选择你的操作:\n");
  105.     while(opp != '0')
  106.     {
  107.         scanf("%c",&opp);
  108.         switch(opp)
  109.         {
  110.             case '1':
  111.                 ListTraverse(L);
  112.                 printf("\n");
  113.                 break;

  114.             case '2':
  115.                 CreateListTail(&L,20);
  116.                 printf("整体创建L的元素(尾插法):\n");
  117.                 ListTraverse(L);
  118.                 printf("\n");
  119.                 break;

  120.             case '3':
  121.                 //clearList(pHead);   //清空链表
  122.                 printf("ListLength(L)=%d \n",ListLength(L));
  123.                 printf("\n");
  124.                 break;

  125.             case '4':
  126.                 //GetNthNodeFromBack(L,find,&e);
  127.                 GetMidNode(L, &e);
  128.                 printf("链表中间结点的值为:%d\n", e);
  129.                 //ListTraverse(L);
  130.                 printf("\n");
  131.                 break;

  132.             case '0':
  133.                 exit(0);
  134.         }
  135.     }
  136. }
复制代码

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马