c++ 双向循环链表


教学内容:  
循环双链表
建立循环双链表
循环链表里插入结点
遍历循环链表

双向链表结构定义
     struct  stu_data
     {
         char name[256];//学生名字
         struct mytime stuTime;//签到时间
         struct  stu_data* front;  //指向前一个结点
         struct  stu_data* back;  //指向后一个结点

     }  ;
建立双向链表
头指针Head
尾部指针Tail
插入结点
 
 //建立头结点
    Head=tail=p= malloc(sizeof( struct stu_data)); //
     memset(stu,0,sizeof( struct stu_data)); //初始化内存区域

//尾部插入新结点 操作
       stu= malloc(sizeof( struct stu_data)); //分配结点内存空间
       memset(stu,0,sizeof( struct stu_data)); //初始化内存区域
   //结点数据填充。。。
         stu->front=p; //新结点指向前驱
         stu->back=NULL; //新结点尾指针置空
         p->back=stu; //前驱结点back指针指向新结点
         p=stu; //重要移动标志指针
         tail=stu;//可有可无的
  //循环链表
          Head->front=tail;
        tail->back=Head;
A= Head      front                 back
0    0    0    NULL    B
B
0    0    0    A    C
C
0    0    0    B    NULL
//

A= Head      front                 back
0    0    0    D    B
B
0    0    0    A    C
C
0    0    0    B    D
D
0    0    0    C    A

遍历链表

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdarg.h> 
#include <time.h>

 
 
 
 int main(int argn,char* argv[])// int a[1]//a[0]
 {       
    

     struct mytime
     {   
         //char name[256];
         int hour;//
         int min; //
         int sec; //
     };

     struct  stu_data
     {
         char name[256];//学生名字
         struct mytime stuTime;//签到时间
         struct  stu_data* front; //指向前一个结点
         struct  stu_data* back;  //指向后一个结点

     }  ;
     struct mytime t2;
     struct stu_data *stu,*p,*Head,*tail;
     
     time_t t;// long int
     struct tm * timfo;
     int i;
 
     //建立Head头结点
     Head=p=tail=malloc(sizeof( struct stu_data)); //256+12=268
     memset(p,0,sizeof( struct stu_data));
     strcpy(Head->name,"头结点");
    
     
     
     do
     {//插入新的结点
         stu= malloc(sizeof( struct stu_data)); //
         memset(stu,0,sizeof( struct stu_data)); //初始化内存区域

         //stu->back=NULL; //新结点尾指针置空
         //p->back=stu; //前驱结点back指针指向新结点
         //p=stu; //重要移动标志指针

         stu->front=p; //新结点指向前驱 2
         stu->back=NULL; //新结点尾指针置空
         p->back=stu; //前驱结点back指针指向新结点
         p=stu; //重要移动标志指针
         tail=stu;//可有可无的 2

         scanf("%s",&stu->name);
         time(&t);
         timfo= localtime(&t); //取当前系统时间
         stu->stuTime.hour=timfo->tm_hour;//
         stu->stuTime.min=timfo->tm_min;//
         stu->stuTime.sec=timfo->tm_sec;////构建循环链表
         Head->front=stu;
         tail->back=Head;

     } while(strcmpi(stu->name,"exit")!=0);
 
     //初始指针p 使他头结点Head
     stu=Head->back;
     do 
     {
          printf("%s,到校时间:%d时%d分%d秒
",stu->name, stu->stuTime.hour, stu->stuTime.min, stu->stuTime.sec);

         stu=stu->back;
     } while (strcmpi(stu->name,"exit"));


     //初始指针p 使他尾部结点tail
     stu=tail->front;
     do 
     {
         printf("%s,到校时间:%d时%d分%d秒
",stu->name, stu->stuTime.hour, stu->stuTime.min, stu->stuTime.sec);

         stu=stu->front;
     } while ( stu!=Head);
 
    getchar();
    getchar();
    
    return 0;
}

 
原文地址:https://www.cnblogs.com/whzym111/p/6140268.html