第一篇:单链表实验报告
《数据结构》实验报告二
分校:
学号:
日期:
班级:
姓名:
程序名: L2311.CPP
一、上机实验的问题和要求:
单链表的查找、插入与删除。设计算法,实现线性结构上的单链表的产生以及元素的查找、插入与删除。具体实现要求:
1.从键盘输入20个整数,产生带表头的单链表,并输入结点值。
2.从键盘输入1个整数,在单链表中查找该结点。若找到,则显示“找到了”;否则,则显示“找不到”。
3.从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在对应位置上,输出单链表所有结点值,观察输出结果。4.从键盘输入1个整数,表示欲删除结点的位置,输出单链表所有结点值,观察输出结果。5.将单链表中值重复的结点删除,使所得的结果表中个结点值均不相同,输出单链表所有结点值,观察输出结果。
6.删除其中所有数据值为偶数的结点,输出单链表所有结点值,观察输出结果。
7.把单链表变成带表头结点的循环链表,输出循环单链表所有结点值,观察输出结果。8.(★)将单链表分解成两个单链表A和B,使A链表中含有原链表中序号为奇数的元素,而B链表中含有原链表中序号为偶数的元素,且保持原来的相对顺序,分别输出单链表A和单链表B的所有结点值,观察输出结果。
二、程序设计的基本思想,原理和算法描述:
(包括程序的结构,数据结构,输入/输出设计,符号名说明等)
三、源程序及注释:
四、运行输出结果:
五、调试和运行程序过程中产生的问题及采取的措施:
六、对算法的程序的讨论、分析,改进设想,其它经验教训:
七、对实验方式、组织、设备、题目的意见和建议:
第二篇:北邮数据结构实验报告 单链表
北京邮电大学 数据结构试验报告
实验名称: 实验一
线性表 学生姓名:
班
级:
班内序号:
学
号:
日
期: 2014年1月3日
实验目的
熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法 学习指针、模板类、异常处理的使用 掌握线性表的操作的实现方法 学习使用线性表解决实际问题的能力 实验内容
2.1题目1 根据线性表的抽象数据类型的定义,选择下面任一种链式结构实现线性表,并完成线性表的基本功能。
线性表存储结构(五选一):
1、带头结点的单链表
2、不带头结点的单链表
3、循环链表
4、双链表
5、静态链表
线性表的基本功能:
1、构造:使用头插法、尾插法两种方法
2、插入:要求建立的链表按照关键字从小到大有序
3、删除
4、查找
5、获取链表长度
6、销毁
7、其他:可自行定义
编写测试main()函数测试线性表的正确性。程序分析
3.1 存储结构 单链表的存储结构:
3.2 关键算法分析
一、关键算法 1.头插法
自然语言描述:a.在堆中建立新结点
b.将a[i]写入到新结点的数据域
c.修改新结点的指针域
d.修改头结点的指针域,将新结点加入链表中 代码描述: template
front = new Node
}
} s->next = front->next;front->next = s;时间复杂度:O(n)
2.尾插法
自然语言描述:a.在堆中建立新结点
b.将a[i]写入到新结点的数据域
c.将新结点加入到链表中
d.修改修改尾指针 代码描述: template
front = new Node
}
} s->data = a[i];s->next = r->next;r->next= s;r=s;时间复杂度:O(n)
3.析构函数
自然语言描述:a.新建立一个指针,指向头结点
b.移动a中建立的指针
c.逐个释放指针
代码描述: template
Node
} } delete front;4.按位查找函数
自然语言描述: a.初始化工作指针p和计数器j,p指向第一个结点,j=1
b.循环以下操作,直到p为空或者j等于1
b1:p指向下一个结点
b2:j加1
c.若p为空,说明第i个元素不存在,抛出异常
d.否则,说明p指向的元素就是所查找的元素,返回元素地址
代码描述: template
Node
if(j
} else break;p = p->next;j++;
} if(!p)throw“查找位置非法”;else
return p;} 时间复杂度:O(n)
5.按值查找函数
自然语言描述:a.初始化工作指针p和计数器j,p指向第一个结点,j=1
b.循环以下操作,找到这个元素或者p指向最后一个结点
b1.判断p指向的结点是不是要查找的值,如果是,返回j;
b2.否则p指向下一个结点,并且j的值加一
c.如果找到最后一个结点还没有找到要查找的元素,返回查找失败信息
代码描述: template
Node
} return-1;if(p->data == x)return j;else { p = p->next;
j++;} } 时间复杂度:O(n)6.插入函数
自然语言描述: a.在堆中建立新结点
b.将要插入的结点的数据写入到新结点的数据域
c.修改新结点的指针域
d.修改前一个指针的指针域,使其指向新插入的结点的位置
代码描述: template
Node
} else throw“插入位置非法”;Node
自然语言描述:a.从第一个结点开始,查找要删除的位数i前一个位置i-1的结点
b.设q指向第i个元素
c.将q元素从链表中删除
d.保存q元素的数据
e.释放q元素 代码描述: template
T x=q->data;
} p->next = q->next;delete q;return x;
8.遍历打印函数
自然语言描述: a.判断该链表是否为空链表,如果是,报错
b.如果不是空链表,新建立一个temp指针
c.将temp指针指向头结点
d.打印temp指针的data域
e.逐个往后移动temp指针,直到temp指针的指向的指针的next域为空
代码描述: template
} Node
} cout<
自然语言描述: a.判断该链表是否为空链表,如果是,输出长度0
b.如果不是空链表,新建立一个temp指针,初始化整形数n为0
c.将temp指针指向头结点
d.判断temp指针指向的结点的next域是否为空,如果不是,n加一,否则return n
e.使temp指针逐个后移,重复d操作,直到temp指针指向的结点的next域为0,返回n 代码描述: template
} Node
} return i-1;p = p->next;i++;4 程序运行结果
4.1主函数流程图
4.2程序运行框图
实验心得
1.调试时出现的问题及解决的方法
在编写按值查找函数时,由于没有处理好指针类型的原因,导致指针无法正常返回,屡屡报错。最后意识到c++没有指针强制类型的转换机制,经过细致检查后才改正错误使得程序正常运行。2.心得体会
了解了单链表的基本的操作函数实现,对链式存储结构有了较好的认识 3.下一步的改进
可以增加完善报错机制,增强程序的健壮性
完整源代码
#include
template
};
template
};
//template
Node
template
}
template
}
template
} front = p;p = p->next;delete front;front = new Node } Node } Node } Node } cout< template } template } Node } return-1;if(p->data == x)return j;else { } p = p->next; j++;Node } if(!p)throw“查找位置非法”;else return p;if(j } else break;p = p->next;j++; template } template } template } void main(){ Node } return i-1;p = p->next;i++;Node } else throw“插入位置非法”;Node T x=q->data; } int n;cout<<“将要输入的链表长度为:”;cin>>n;int *b=new int[n];cout<<“输入链表中的元素:”;for(int k=0;k 西华大学数计学院学生上机实践报告 西华数学与计算机学院上机实践报告 课程名称:数据结构 指导教师:唐剑梅 上机实践名称: 上机实践编号:1 年级: 2011 姓名:蒋俊 学 号 : *** 上机实践成绩: 上机实践日期:2012-11-6 上机实践时间:8:00-9:30 一、实验目的 1.了解线性表的逻辑结构特性,以及这种特性在计算机内的两种存储结构。 2.重点是线性表的基本操作在两种存储结构上的实现;其中以链表的操作为侧重点;并进一步学习程序设计方法。 3.掌握栈这种数据结构特性及其主要存储结构,并能在现实生活中灵活运用。 4.掌握队列这种数据结构特性及其主要存储结构,并能在现实生活中灵活运用。 5.了解和掌握递归程序设计的基本原理和方法。 6.掌握使用 C++面向对象的程序设计技术设计数据结构源程序的方法。 二、实验内容 1.熟悉前面的【程序示例2】,按照约瑟夫问题的方法2,试着不设头结点改写原来的程序,上机调试运行。 2.用链表建立通讯录。通讯录内容有:姓名、通讯地址、电话号码。 要求:(1)通讯录按姓名项的字母顺序排列; (2)能查找通讯录中某人的信息; [提示] 用链表来存放这个通讯录,一个人的信息作为一个结点。成链的过程可以这样考虑:先把头结点后面的 西华大学数计学院学生上机实践报告 char name[20]; // 姓名子域 NodeType *next; // 指针域 };class Jose //类声明 { private: NodeType *Head; public: Jose(){}; ~Jose(){ }; void creat(); void outs(); };void Jose::creat(){ int i=0, n; NodeType *newp, *pre; cout<<“n 输入总人数 n=”;cin>>n; pre=new NodeType; Head=new NodeType; pre->num=1; cout<<“n 编号”<<1<<“的人 姓名=”; cin>>pre->name; cout<<“n 密码”<<1<<“的人 密码=”; cin>>pre->psw; Head=pre; Head->next=Head; for(i=1;i { newp=new NodeType; newp->num=i+1; cout<<“n 编号”< 姓名=”;cin>>newp->name; cout<<“n 密码”< 密码=”; cin>>newp->psw; newp->next=Head; pre->next=newp; pre=newp; } } void Jose::outs() { int m,i; NodeType *q=Head, *p; cout<<“n 输入m值(m>=2)”;cin>>m; cout<<“n 根据m值,开始报数输出:”< while(q->next!=q) 西华大学数计学院学生上机实践报告 { for(i=1;i cout<<“编号为:”< cout<<“n 编号为:”< m=q->psw; p->next=q->next;delete q; q=p->next; } cout<<“编号为:”< cout<<“n 编号为:”< delete q;} int main() { Jose h; h.creat(); h.outs(); return 0;} 西华大学数计学院学生上机实践报告 { char Add[20]; char name[20]; char tel[20]; };struct NodeType { ElemType data; NodeType *next;};class Sqlist { private: NodeType *Head; public: Sqlist(); ~Sqlist(); void creat(); void Insert(ElemType x); void Delet(ElemType x); void PrintOut(); };Sqlist::Sqlist(){ Head=new NodeType;Head->next=NULL;strcpy(Head->data.name,“姓名”);strcpy(Head->data.Add,“地址”);strcpy(Head->data.tel,“电话号码”);} Sqlist::~Sqlist(){ NodeType *p=Head->next; while(p!=NULL) {Head->next=p->next; delete p; p=Head->next;} } void Sqlist::creat() //初步建立一个通讯录 { NodeType*p,*s,*q;ElemType x; 西华大学数计学院学生上机实践报告 int a;q=Head;cout<<“n 输入姓名:”;cin>>x.name;cout<<“n 输入通讯地址:”;cin>>x.Add;cout<<“n 输入电话号码:”;cin>>x.tel;p=new NodeType;p->data=x;Head->next=p;p->next=NULL;cout<<“输入一个数。若为-1,结束输入:”< while(a!=-1){ cout<<“n 输入姓名:”;cin>>x.name;cout<<“n 输入通讯地址:”;cin>>x.Add;cout<<“n 输入电话号码:=”;cin>>x.tel;s=new NodeType;s->data=x;if(strcmp(s->data.name,p->data.name)>0){ p->next=s;s->next=NULL; p=s;} else{ s->next=p;q->next=s;} q=q->next; cout<<“输入一个数。若为-1,结束输入:”< 西华大学数计学院学生上机实践报告 s->data=x;q=Head;p=q->next;while(p!=NULL&&strcmp(p->data.name,x.name)<0){q=p;p=p->next;} s->next=p;q->next=s;} void Sqlist::Delet(ElemType x)//删除 { NodeType *p,*q;q=Head;p=Head->next;while(p!=NULL&&strcmp(p->data.name,x.name)!=0){q=p;p=p->next;} if(p!=NULL){ q->next=p->next;delete p;cout<<“删除结点成功”< { NodeType *p;p=Head->next;while(p!=NULL){ cout< data.name<<“ ”;cout< data.tel<<“ ”;cout< data.Add<<“ ”;p=p->next;} cout< Sqlist as; cout<<“n 通讯录演示”; do{ cout<<“nn”; cout<<“nn 1.初步建立一个通讯录(单链表) ”; 西华大学数计学院学生上机实践报告 cout<<“nn 2.插入新的电话记录 ”; cout<<“nn 3.删除一个电话记录”; cout<<“nn 4.结束程序”; cout<<“n******************************** ”; cout<<“n 请输入你的选择(1,2,3,4)”;cin>>k;switch(k){ case 1:{ as.creat();as.PrintOut();}break; case 2:{ cout<<“n 插入的数据 姓名”;cin>>e.name; cout<<“n 插入的数据 电话号”;cin>>e.tel; cout<<“n 插入的数据 地址”;cin>>e.Add; as.Insert(e);as.PrintOut(); }break; case 3:{ cout<<“n 被删除的姓名= ”; cin>>e.name; as.Delet(e); as.PrintOut(); }break; default:break; } }while(k>=1&&k<4); cout<<“n 再见!”; return 0;} 西华大学数计学院学生上机实践报告 西华大学数计学院学生上机实践报告 西华大学数计学院学生上机实践报告 const int MAXSIZE=100; // 数组的容量 class SqStack { private: ElemType elem[MAXSIZE]; int top; public: SqStack(); ~SqStack(){}; void SqStack::push(ElemType e); ElemType SqStack::pop(); void SqStack::PrintOut(); int SqStack::IsEmpty(); void f(ElemType N,ElemType M);};void SqStack::f(ElemType N,ElemType M){ SqStack s; ElemType e;while(N){ s.push(N%M); N=N/M;} while(!s.IsEmpty()){ e=s.pop(); if(e>=10) { e=e%10; switch(e) { case 1:cout<<“b”< case 2:cout<<“c”< case 3:cout<<“d”< case 4:cout<<“e”< case 5:cout<<“f”< default:cout<<“a”< } } else cout< 西华大学数计学院学生上机实践报告 } cout< {cout<<“栈满溢出”< return; } else{top++; elem[top]=e;} } ElemType SqStack::pop(){ElemType x; if(top==0) { cout<< “ 栈为空,不能出栈操作”< else { x=elem[top]; top--; return x;} } void SqStack::PrintOut() {int k; cout<<“n PrintOut Data:n”; for(k=top;k>=1;k--)cout< cout< else return 0;} void main(){ ElemType a,m;cout<<“请输入一个正整数:”< 西华大学数计学院学生上机实践报告 五、总结 通过本次实验,我熟悉了链表的操作,了解了线性表在现实生活中的运用,认识了顺序存储和链式存储这两种结构。本次上机实践基本完成了实验内容,但完成的不是很好,以后需要更加努力地掌握基本的知识。实验内容对于队列的运用没有涉及,希望以后有所涉及。 西华大学数计学院学生上机实践报告 实验四 单链表的建立 一、实验目的 1.掌握线性表的链式存储结构——单链表的定义及C语言实现。2.掌握线性表在链式存储结构——单链表中的各种基本操作。 二、实验内容 1.建立一个带头结点的单链表,结点的值域为整型数据。要求将用户输入的数据分别按尾插入法和头插法来建立相应单链表。【知识要点】 为了便于实现各种运算,通常在单链表的第一个结点前增设一个附加结点,称为头结点,它的结构与表结点相同,其数据域可不存储信息,也可存储表长等附加信息,具体如下图。 【实验提示】 单链表的结点结构除数据域外,还含有一个指针域。用C语言描述结点结构如下: typedef int datatype; /* 线性表中存放整型元素 */ typedef struct LNode / * 结点类型定义 * / { datatype data; / * 数据域 * / struct node *next; / * 指针域 * / }Linklist; /* Linklist为单链表类型*/ 注意结点的建立方法及构造新结点时指针的变化。构造一个结点需用到C语言的标准函数malloc(),如给指针变量p分配一个结点的地址: p=(strcut LNode *)malloc(sizeof(Linklist));该语句的功能是申请分配一个类型为Linklist的结点的地址空间,并将首地址存入指针变量p中(或p=new(struct LNode);即生成新结点)。当结点不需要时可以用标准函数free(p)释放结点存储空间,这时p为空值(NULL)。【程序提示】 #include //补充实现表节点类型的定义; } Linklist; Linklist * creatlist(){ int x;Linklist *head, *p;// head为单链表的头指针,p指向新建的结点 //补充实现单链表的建立; return(head); // 函数返回链表头指针head } void output(Linklist *HeadL){ if(HeadL->next==NULL)printf(“空链表!n”);else { printf(“链表为:n”);Linklist *P;P=HeadL->next;while(P!=NULL){ printf(“%d->”,P->data);P=P->next;} printf(“n”);} } void main(void){ Linklist *List;List=creatlist();output(List);} 【参考程序】 1、尾插法 #include Linklist * creatlist(){ int x; Linklist *head, *p,*r;/* head为头指针 */ head=new(struct LNode); head->data=0; /* 表头结点数据域赋值 */ r=head; /* 尾指针的初值为头结点head */ printf(“请随机输入互不相同的正整数以0作为结束符:n”); scanf(“%d”, &x); /* 读入第一个结点的值 */ while(x!=0) /* 输入数据,以0为结束符 */ { p=new(struct LNode);/* 生成新结点 */ p->data=x; /* 给新结点的数据域赋值 */ r->next=p; /* 新结点插入到表尾*rear之后 */ r=p; /* 将尾指针rear指向新的尾结点 */ head->data++; /* 链表长度计数 */ scanf(“%d”, &x); /* 输入下一个结点的数据 */ } r->next=NULL; /* 将链表最后一个结点rear指针域置空 */ return(head);/* 函数返回链表头指针head */ } void output(Linklist *HeadL){ if(HeadL->next==NULL)printf(“空链表!n”);else { printf(“链表为:n”); Linklist *P; P=HeadL->next; while(P!=NULL) { printf(“%d->”,P->data); P=P->next; } printf(“n”);} } void main(void){ Linklist *List;List=creatlist();output(List);} 2、头插法 #include Linklist * creatlist(){ int x; Linklist *head, *p;/* head为头指针 */ head=new(struct LNode); head->data=0; /* 表头结点数据域赋值 */ head->next=NULL; printf(“n请随机输入一组正整数以0结束输入:n”); scanf(“%d”,&x); /* 输入第一个结点数据值 */ while(x!=0) /* 输入数据,以0为结束符 */ { p=new(struct LNode);/* 生成新结点 */ p->data=x;/* 给新结点的数据域赋值 */ p->next=head->next; /* 将新结点插入表头结点head之后 */ head->next=p; head->data++; /* 链表长度计数 */ scanf(“%d”,&x); /* 输入下一个结点的值 */ } return(head);/* 函数返回链表头指针head */ } void output(Linklist *HeadL){ } void main(void){ Linklist *List;List=creatlist();output(List);} 方法二 void main(void){ } 2.在第一题的基础上,增加单链表的查找,插入,删除子程序。#include typedef struct LNode{ int data;struct LNode *next;Linklist *head,*p;head=creatlist();printf(“output the list:n”);p=head->next;while(p){ } printf(“%d ”,p->data);p=p->next;} Linklist; Linklist * creatlist(){ int x; Linklist *head, *p; /* head为头指针 */ head=new(struct LNode); head->data=0; /* 表头结点数据域赋值 */ head->next=NULL; cout<<“n请随机输入一组正整数以0结束输入:n”; cin>>x;/* 输入第一个结点数据值 */ while(x!=0) /* 输入数据,以0为结束符 */ { p=new(struct LNode);/* 生成新结点 */ p->data=x;/* 给新结点的数据域赋值 */ p->next=head->next; /* 将新结点插入表头结点head之后 */ head->next=p; head->data++; /* 链表长度计数 */ cin>>x; } return(head);} void output(Linklist *HeadL){ if(HeadL->next==NULL)cout<<“空链表!n”;else { cout<<“链表为:n”; Linklist *P; P=HeadL->next; while(P!=NULL) { cout< data<<“->”;/* 函数返回链表头指针head */ /* 输入下一个结点的值 */ P=P->next; } cout<<“n”;} } Linklist *no_search(Linklist *head, int i){ Linklist *p;int j; p=head->next; j=1; /* 从首结点开始扫描 */ while((p!=NULL)&&(j { p=p->next; /* 扫描下一个结点 */ j++; } if(i==j)return(p); else return(NULL); /* 若找不到,则返回空指针 */ } Linklist *data_insert(Linklist *head, Linklist *p, int x){ Linklist *s; s =new(struct LNode);/* 建立新结点 */ s->data=x; /* 将x值赋给s→data */ /* 统计已扫描结点的个数 */ s->next=p->next;/* 新结点s后继指向原p结点后继 */ p->next=s; /* p结点的后继指向新结点s */ return(head); /* 返回带头结点的单链表头指针*/ } Linklist *key_delete(Linklist *head, int x){ Linklist *p, *q; /* p是被删除结点,q是p的前驱结点 */ p=head; while((p!=NULL)&&(p->data!=x)) { q=p; p=p->next; } if(p!=NULL) { q->next=p->next; /* 修改p前驱结点q指针域 */ /* 释放结点空间 */ /* 若该结点存在,则删除之 */ free(p); return(head); } /* 函数返回链表头指针*/ else { cout<<“要删的结点不存在,请重输数据!n”; return(NULL); } } void main(void){ Linklist *List,*chazhao;List=creatlist();output(List);chazhao=no_search(List,2);//查找第二个节点,并输出数据域信息 cout<<“n查找第二个节点,数据域信息为:n”;cout< output(List);List=key_delete(List,50);//删除数据为50的节点 cout<<“n删除数据为50的节点:n”; output(List);} 实验 四、ASP.NET编程 实验序号:4 实验名称:ASP.NET编程 适用专业:计算机科学与技术/软件工程 学时数: 8学时 一、实验目的 1、熟悉ASP.NET服务器控件的使用。 2、学会使用ASP.NET服务器控件设计Web页面。 3、学会使用ASP.NET对象。 二、实验设备 装有WEB程序设计相关软件。 1、使用ASP.NET控件,如TextBox、Label、Button等,并结合CSS、Javascript,实现登录页面的实现。要求点击登录按钮时,弹出提示:您输入的用户名是:**,密码是:**,*为显示输入的用户名和密码,同时将用户名和密码写入session,并跳转到下面第2题页面。 <%@ Page Language=“C#” AutoEventWireup=“true” CodeBehind=“login.aspx.cs” Inherits=“WebApplication2.login” %> style=“margin-bottom: 0px” Text=“用®?户¡ì名?”> style=“margin-left: 9px”> style=“margin-left: 39px”> 三、实验步骤 文档为doc格式 #include #include #include int saveflag=0; /* 单链表内容有无发生改变,是否需要存盘的标志变量 */ struct employee { }; typedef struct Node { void InitList(LinkLi...... //C语言课程设计 职工信息管理系统—单链表实现 #include "stdio.h" #include "stdlib.h" #include "string.h" int saveflag=0; /*是否需要存盘的标志变量*/ struct empl...... #include #include #include typedef struct student { int num; char name[10]; char passwd[6]; int age; int class; int math; int clan; int chinese; int m...... 实 验 报 告 实验名称 课程名称 一.实验目的 1、进一步理解路由器配置的基本原理; 2、熟练掌握PacketTracer软件的安装和配置方法; 3、掌握vlan间路由单臂路由的配置。 4、掌...... 实班级:机电-156 姓名:李学东 验报 告 单管共射放大电路 实验目的 (1) 掌握单管放大电路的静态工作点和电压放大倍数的测量方法。 (2) 了解电路中元件的参数改变对静态工作点...... 第一次实验实验报告 班级:2009211307 姓名:吕博文 学号:09211297 分工情况:个人一组 完成日期:11月5日 斐波那契数列递归和迭代算法 一、问题描述 分别写出下列函数的递归算法和...... C语言链表的概念
在*中采用了动态分配的办法为一个结构分配内存空间。每一次分配一块空间可用来存放一个学生的数据,我们可称之为一个结点。有多少个学生就应该申请分配多少...... #include #include #define OVERFLOW -2 #define ERROR 0 #define OK 1 typedef int status; //双向循环链表的存储结构 typedef struct DuLNode { int data; int Length; s......第三篇:2012《数据结构》上机实验报告 链表
第四篇:实验四 单链表及其应用(参考程序)
第五篇:WEB程序设计实验报告-15单
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。 职工信息管理系统 单链表实现 C语言源程序(范文)
C语言课程设计 职工信息管理系统 单链表实现程序源代码
学生管理系统学生链表
单臂路由实验报告[小编整理]
单管共射放大电路仿真--实验报告
斐波那契数列递归和迭代&循环链表队列初始化实验报告
C语言链表的概念
双向循环链表的创建