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秒\n",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秒\n",stu->name, stu->stuTime.hour, stu->stuTime.min, stu->stuTime.sec); stu=stu->front; } while ( stu!=Head); getchar(); getchar(); return 0; }