zoukankan      html  css  js  c++  java
  • 循环链表的运用示例

    循环链表区别于单链表的地点就是:未节点的next是头节点地址,所以在节点操作中,涉及到plink->next判断是否为NULL的地方改为判断是否等于plink_header即可。
    链表遍历函数中:
    while(plink_view->next !=plink_header)
    {
      printf("%s,%s ",plink_view->num,plink->name);
      plink_view=plink_view->next; //指针后移
    }
    链表数据长度函数中:
    while(plink_length->next !=plink_header)
    {
      length++;
      plink_length=plink_length->next; //指针后移
    }
     
      1#include <stdio.h>
      2 #include <malloc.h>
      3 #include <stdlib.h>
      4 #include <memory.h>
      5 
      6 //定义学生信息节点 
      7 typedef struct student_info_node_def
      8 {
      9     char num[32];//学号
     10     char name[32]; //姓名
     11     struct student_info_node_def *last; //前指针 
     12     struct student_info_node_def *next;  //后指针 
     13 }student;
     14 
     15 void list_view(student *plink_header)
     16 {
     17     student *plink_view=plink_header;
     18     //剔除头节点,没有数据
     19     plink_view=plink_view->next; 
     20     while(plink_view->next !=plink_header)
     21     {
     22         printf("%s,%s
    ",plink_view->num,plink_view->name);
     23         plink_view=plink_view->next; //指针后移    
     24     }
     25 } 
     26 
     27 int list_length(student* plink_header)
     28 {
     29     int length=0;
     30      student *plink_length=plink_header;
     31     while(plink_length->next !=plink_header)
     32     {
     33         length++;
     34         plink_length=plink_length->next; //指针后移        
     35     }
     36     printf("length=%d
    ",length);
     37     return length;
     38 }
     39 
     40 void list_clear(student* plink_header)
     41 {
     42     printf("是否清空?(1/0):");
     43     int order=2;
     44     scanf("%d",&order); 
     45     if(order==1)
     46     {
     47         plink_header=NULL;
     48         printf("完成清空");    
     49     }
     50     else
     51         printf("未进行清空操作
    ");
     52 }
     53 
     54 void list_rm(student *plink_header)
     55 {
     56     printf("是否销毁链表?(1/0):");
     57     int ask=2;
     58     scanf("%d",&ask);
     59     if(ask==1)
     60     {
     61         free(plink_header);    
     62         printf("完成销毁");
     63     }
     64     else
     65         printf("未进行销毁操作
    ");
     66 } 
     67 
     68 void list_insert(student* plink_header)
     69 {
     70     //获取链表长度
     71     int length=list_length(plink_header); 
     72     //在第n个节点后插入新节点
     73     //1.在哪个节点后插入? 
     74     int i,n=0;
     75     printf("输入插入的位置:");
     76     scanf("%d",&n); 
     77     //2.新节点内容: 
     78     student *plink_new=(student*)malloc(sizeof(student));
     79     sprintf(plink_new->num,"学号%03d",n+11);
     80     sprintf(plink_new->name,"姓名%03d",n+11);    
     81     plink_new->next=NULL; 
     82     //3.移动链表指针到第n个位置处
     83     if((n>0)&&(plink_header !=NULL)) //只有当插入位置合理并且链表存在时,插入操作才合理 
     84     {
     85         student *plink_opt=plink_header;
     86         if(n<length) //情况1.插入位置在length之内 
     87         {
     88             for(i=0;i<n-1;i++)
     89             {
     90                 plink_opt=plink_opt->next;    
     91             }
     92             plink_new->next=plink_opt->next;
     93             plink_opt->next=plink_new;
     94         }    
     95         if(n>=length)  //情况2.插入位置在length之外 
     96         {
     97             for(i=0;i<length;i++)
     98             {
     99                 plink_opt=plink_opt->next;    
    100             }
    101             plink_opt->next=plink_new;    
    102         }
    103     }
    104 }
    105 
    106 
    107 void list_watch(student* plink_header)
    108 {
    109     int length=list_length(plink_header);
    110     int i=0;
    111     student *plink_point=plink_header; 
    112     printf("给出一个查看的节点号(小于%d的值):",length);
    113     int point=0;
    114     scanf("%d",&point);
    115     if((point>0)&&(point<length))
    116     {
    117         for(i=0;i<point;i++)
    118         {
    119             plink_point=plink_point->next;    
    120         }    
    121         printf("%s,%s
    ",plink_point->num,plink_point->name);
    122     }
    123 }
    124 
    125 void list_cancel(student *plink_header)
    126 {
    127     int length=list_length(plink_header);
    128     printf("给出删除节点号:");
    129     int i,n=0;
    130     scanf("%d",&n);
    131     if((n>0)&&(n<=length))
    132     {
    133         student *plink_cnl=plink_header;
    134         for(i=0;i<n-1;i++)
    135         {
    136             plink_cnl=plink_cnl->next;    
    137         }    
    138         plink_cnl->next=plink_cnl->next->next;
    139         
    140     } 
    141 }
    142  
    143 int main()
    144 {
    145     /***********************************/ 
    146     //创建头节点
    147     int i=0;
    148     student *plink_header;  
    149     plink_header=(student*)malloc(sizeof(student)); //为节点分配空间 
    150     plink_header->next=NULL;  //初始化节点指针 
    151     /*********************************/ 
    152     //创建新节点 
    153     student *plink=plink_header;
    154     for(;i<8;i++)
    155     {
    156         student *pnew=NULL;
    157         pnew=(student*)malloc(sizeof(student));
    158         memset(pnew,0,sizeof(student));
    159         sprintf(pnew->num,"学号%03d",i+1);
    160         sprintf(pnew->name,"姓名%03d",i+1);    
    161         pnew->next=NULL;
    162         //新节点连接前一个节点 
    163         plink->next=pnew;
    164         plink=pnew;
    165     }
    166     //链表尾节点指向头节点,从而构成循环链表 
    167     plink->next=plink_header;
    168     /************************************/ 
    169     
    170     //链表遍历 
    171     list_view(plink_header);
    172     
    173     /************************************/ 
    174 
    175     //求链表长度
    176     int length=list_length(plink_header);
    177     
    178     /************************************/ 
    179     
    180     //获取第n个节点上的数据
    181     list_watch(plink_header); 
    182     
    183     //清空链表
    184     list_clear(plink_header);
    185      
    186     //销毁链表
    187     list_rm(plink_header);
    188     
    189     //插入节点    
    190     list_insert(plink_header); 
    191     
    192     //遍历链表 
    193     list_view(plink_header); 
    194     
    195     //加入节点之后链表的长度 
    196     length=list_length(plink_header);
    197         
    198     //删除第n个节点
    199     list_cancel(plink_header);
    200     
    201     //遍历链表 
    202     list_view(plink_header); 
    203     
    204     //求链表长度 
    205     list_length(plink_header); 
    206     return 0;
    207 }
    内在的趣味,表面的繁琐
  • 相关阅读:
    tcp/ip 卷一 读书笔记(1)tcp/ip 概述
    python项目使用jsonschema进行参数校验
    设置TCP_USER_TIMEOUT参数来判断tcp连接是否断开
    OpenStack中memcached的使用和实现
    Ironic中pxe driver和agent driver的区别
    tcp/ip 卷一 读书笔记(2)物理层和链路层网络
    C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
    软件测试Ron Patton
    实例: 创建一个欢迎cookie
    C/C++中Static的作用详述
  • 原文地址:https://www.cnblogs.com/data1213/p/4887695.html
Copyright © 2011-2022 走看看