zoukankan      html  css  js  c++  java
  • 单向循环链表【数据结构-朱战立】

      1 /*这个程序是循环链表*/
      2 #include <stdio.h>
      3 #include <stdlib.h>
      4 #include <malloc.h>
      5 typedef int bool;
      6 #define true 1
      7 #define false 0
      8 
      9 typedef int DataType;
     10 typedef struct node{
     11     DataType data;
     12     struct node *next;
     13 }CurrNode;
     14 
     15 //链表初始化
     16 void CurrInit(CurrNode **head)
     17 {
     18     if ((*head = (CurrNode*)malloc(sizeof(CurrNode))) == NULL)
     19     {
     20         exit(1);
     21     }
     22     (*head)->next = *head;//构造循环链表
     23 }
     24 
     25 //链表长度返回
     26 int Currlength(CurrNode *head)
     27 {
     28     CurrNode *per = head->next;
     29     int num = 0;
     30 
     31     while (per!= head)//出现中断错误?    //2018年8月15日 18:40:31 返回长度per!=head
     32     {
     33         per = per->next;
     34         num++;
     35     }
     36     return num;
     37 }
     38 
     39 //链表插入
     40 int CurrInsert(CurrNode *head, int i, DataType x)
     41 {
     42     CurrNode *per, *fin;
     43     int j = 0;
     44 
     45     if ((fin=(CurrNode*)malloc(sizeof(CurrNode)))==NULL)
     46     {
     47         exit(1);
     48     }
     49     per = head;                                       //2018年8月15日 18:48:36  如果per=head->next 那么链表将倒序
     50     while(per->next!=head&&/*per->next!=head&&*/j<i)  //2018年8月15日 18:41:38  判断条件不需要那么多
     51 
     52     {
     53         per = per->next;
     54         j++;
     55     }
     56     if (j!=i)
     57     {
     58         printf("插入位置错误!
    ");
     59         return 0;
     60     }
     61     fin->data = x;
     62 
     63     fin->next = per->next;
     64     per->next = fin;
     65     return 1;
     66 }
     67 
     68 //链表删除
     69 int CurrDelete(CurrNode *head, int i, DataType *x)
     70 {
     71     CurrNode *per, *tmp;
     72     int j = 0;
     73 
     74     if ((tmp = (CurrNode*)malloc(sizeof(CurrNode))) == NULL)
     75     {
     76         exit(1);
     77     }
     78     per = head;
     79     while (per->next != head&&j<i)//删除不需要判断下一个节点是否存在
     80     {
     81         per = per->next;
     82         j++;
     83     }
     84     if (j != i)
     85     {
     86         printf("删除位置错误!
    ");
     87         return 0;
     88     }
     89     *x = per->data;
     90 
     91     tmp = per->next;
     92     per->next = tmp->next;
     93     free(tmp);
     94     return 1;
     95 }
     96 
     97 //链表取出
     98 int CurrGet(CurrNode *head, int i, DataType *x)
     99 {
    100     CurrNode *per=head->next;
    101     int j = 0;
    102 
    103     while (per!=head&&j<i)
    104     {
    105         per = per->next;
    106         j++;//失误
    107     }
    108     if (j!=i)
    109     {
    110         printf("取出位置错误!
    ");
    111         return 0;
    112     }
    113     *x = per->data;
    114     return 1;
    115 }
    116 //链表销毁
    117 void CurrDestroy(CurrNode **head)
    118 {
    119     CurrNode *per = *head, *tmp;
    120     if ((tmp = (CurrNode*)malloc(sizeof(CurrNode))) == NULL)
    121     {
    122         exit(1);
    123     }
    124     while (per->next!= *head)
    125     {
    126         tmp = per;
    127         per = per->next;
    128         free(tmp);
    129     }
    130     *head = NULL;
    131 }
    132 
    133 //判断是否构成循环链表
    134 bool Currcheck(CurrNode* head)
    135 {
    136     int nNumber = Currlength(head);
    137 
    138     CurrNode* pTemp = head;
    139     int i = 0;
    140     while (i < nNumber)
    141     {
    142         pTemp = pTemp->next;
    143         i++;
    144     }
    145 
    146     return (pTemp->next == head) ? true : false;
    147 }
    148 
    149 //主函数
    150 int main()
    151 {
    152     CurrNode *mylist;
    153     int i, x;
    154 
    155     CurrInit(&mylist);
    156     for ( i = 0; i < 10; i++)
    157     {
    158         if ((CurrInsert(mylist, i, i + 1)) == 0)
    159         {
    160             printf("插入位置错误!
    ");
    161             return ;
    162         }
    163     }
    164     if ((CurrDelete(mylist, 5, &x)) == 0)
    165     {
    166         printf("删除位置错误!
    ");
    167         return;
    168     }
    169     else
    170     {
    171         printf("删除数字:%d
    ", x);
    172     }
    173     for ( i = 0; i < Currlength(mylist); i++)
    174     {
    175         if ((CurrGet(mylist, i, &x)) == 0)
    176         {
    177             printf("取出位置错误!
    ");
    178             return;
    179         }
    180         else
    181         {
    182             printf("%d    ",x);
    183         }
    184     }
    185     printf("
    %s", (Currcheck(mylist) == 1 )? "是循环链表": "不是循环链表");
    186     CurrDestroy(&mylist);
    187     getchar();
    188     return 0;
    189 }
  • 相关阅读:
    什么是蓝绿部署和滚动部署
    北漂--我的2018
    辛苦俩月总结的面试题,掌握它怼翻面试官不是梦~
    记一次项目谈判的失败经历,要拒绝免费开发!
    程序员技术入股的那些坑
    记一次程序员在办公室里的“撕逼”经历
    公司来了个“奇葩”的程序员
    苦逼程序员如何在公司生存的经验分享
    (第二部)程序员逆天改命之胜天半子
    别闹了,颠覆世界不是为了让它变得更糟
  • 原文地址:https://www.cnblogs.com/leime/p/9483301.html
Copyright © 2011-2022 走看看