
怎么做?????数据结构-单链表实践报告!!!!!! 20
姓名学号班级成绩实验名称带头结点的单链表的逆置实验目的(1)掌握单链表的基本操作(建立、插入、删除、逆序、输出);(2)加深对C/C++语言的使用。实验内容(1)建立含有...
姓名 学号
班级 成绩
实验名称 带头结点的单链表的逆置
实验目的 (1)掌握单链表的基本操作(建立、插入、删除、逆序、输出);
(2)加深对C/C++语言的使用。
实验内容 (1)建立含有n个数据元素的带头结点的单链表;
(2)依次输出该表中各元素的值;
(3)将单链表进行逆置运算;
(4)依次输出逆置后表中各元素的值。
概要设计 1、链表的抽象数据类型定义为:
ADT LINKLIST{
数据对象:D={ai| ai∈(0,1,…,9),i=0,1,2,…,n,n≥0}
数据关系:R={< ai-1, ai >| ai-1, ai∈D,i=1,2,…,n}
基本操作:
CreateList(&L)
操作结果:创建一个链表L。
PrintList(L)
初始条件:链表L已存在。
操作结果:在屏幕上输出链表的值。
InverseList(L)
初始条件:链表L已存在。
操作结果:将链表逆置。
} ADT LINKLIST
2、本程序包含五个模块:
(1)主程序模块:
main(){
定义变量;
接受命令;
处理命令;
}
(2)创建链表模块——产生一个链表;
(3)输出链表模块——把链表输出;
(4)链表逆置模块——将链表逆置;
各模块之间的调用关系如下:
主程序模块—〉创建链表模块—〉输出链表模块
—〉链表逆置模块—〉输出链表模块
详细设计 viod CreateList_L(Linklist &L,int n)
{
//逆位序输入n个元素的值(问题一:这句话是什么意思,哪里体现了逆位序输入?)
L=(Linklist)malloc(sizeof(Lnode));
L->next=NULL;//建立一个带表头的单链表
for(i=n;i>0;--i)
{
p=(Linklist)malloc(sizeof(LNode));//生成新节点
scanf(&p->data);
p->next=L->next;(问题二:这句是什么意思。有什么用?)
L->next=p;//插入到表头(问题三:这句什么意思,有什么用?)
}
}
viod CreateList_L(Linklist &L,int n)
{
//逆位序输入n个元素的值 这是写程序的人的注释 逆序体现在插入数据时,不是在尾部追加,而是从头部加入 每次输入的数据结点,都会成为当前的数据头 正向遍历数据(表头到表尾)时,所显示的数据与录入的顺序是相反的。
L=(Linklist)malloc(sizeof(Lnode));
L->next=NULL;//建立一个带表头的单链表 L是表头 L->next是数据头
for(i=n;i>0;--i)
{
p=(Linklist)malloc(sizeof(LNode));//生成新节点
scanf(&p->data);
p->next=L->next; //将原数据头结点(L->next) 加到 新增加的结点p之后
L->next=p;//插入到表头 将表头L的后继结点指向新结点p 新结点p成为新的数据头
}
调试分析
运行结果 展开
班级 成绩
实验名称 带头结点的单链表的逆置
实验目的 (1)掌握单链表的基本操作(建立、插入、删除、逆序、输出);
(2)加深对C/C++语言的使用。
实验内容 (1)建立含有n个数据元素的带头结点的单链表;
(2)依次输出该表中各元素的值;
(3)将单链表进行逆置运算;
(4)依次输出逆置后表中各元素的值。
概要设计 1、链表的抽象数据类型定义为:
ADT LINKLIST{
数据对象:D={ai| ai∈(0,1,…,9),i=0,1,2,…,n,n≥0}
数据关系:R={< ai-1, ai >| ai-1, ai∈D,i=1,2,…,n}
基本操作:
CreateList(&L)
操作结果:创建一个链表L。
PrintList(L)
初始条件:链表L已存在。
操作结果:在屏幕上输出链表的值。
InverseList(L)
初始条件:链表L已存在。
操作结果:将链表逆置。
} ADT LINKLIST
2、本程序包含五个模块:
(1)主程序模块:
main(){
定义变量;
接受命令;
处理命令;
}
(2)创建链表模块——产生一个链表;
(3)输出链表模块——把链表输出;
(4)链表逆置模块——将链表逆置;
各模块之间的调用关系如下:
主程序模块—〉创建链表模块—〉输出链表模块
—〉链表逆置模块—〉输出链表模块
详细设计 viod CreateList_L(Linklist &L,int n)
{
//逆位序输入n个元素的值(问题一:这句话是什么意思,哪里体现了逆位序输入?)
L=(Linklist)malloc(sizeof(Lnode));
L->next=NULL;//建立一个带表头的单链表
for(i=n;i>0;--i)
{
p=(Linklist)malloc(sizeof(LNode));//生成新节点
scanf(&p->data);
p->next=L->next;(问题二:这句是什么意思。有什么用?)
L->next=p;//插入到表头(问题三:这句什么意思,有什么用?)
}
}
viod CreateList_L(Linklist &L,int n)
{
//逆位序输入n个元素的值 这是写程序的人的注释 逆序体现在插入数据时,不是在尾部追加,而是从头部加入 每次输入的数据结点,都会成为当前的数据头 正向遍历数据(表头到表尾)时,所显示的数据与录入的顺序是相反的。
L=(Linklist)malloc(sizeof(Lnode));
L->next=NULL;//建立一个带表头的单链表 L是表头 L->next是数据头
for(i=n;i>0;--i)
{
p=(Linklist)malloc(sizeof(LNode));//生成新节点
scanf(&p->data);
p->next=L->next; //将原数据头结点(L->next) 加到 新增加的结点p之后
L->next=p;//插入到表头 将表头L的后继结点指向新结点p 新结点p成为新的数据头
}
调试分析
运行结果 展开
1个回答
展开全部
问题一:逆位序输入n个元素的值, 逆位 就是位置相逆的意思,比如现在的list节点为 1 2 3 4 5,让你输入的时候按 5 4 3 2 1的顺序,这就叫逆位输入。这个函数里面并没有体现逆位,只是想告诉使用这个方法的人,最终得到的LIST是与输入相反的。
问题二和问题三:他们是一起的,这两句话的意思是将新输入的节点插入到头结点的后面,每次都插入到头结点后面,与问题一相呼应,这样逆位输入就可以得到一个正序的LIST了。
p->next=L->next; 作用是:用 P 的next指针,指向头结点的next指针;
L->next=p;//插入到表头 作用是:用头结点的next指针,指向P
如:
原来的链表: L->N1->N2->N3-null
插入P结点: L N1->N2->N3-null
| /|\
|-> P----- |
问题二和问题三:他们是一起的,这两句话的意思是将新输入的节点插入到头结点的后面,每次都插入到头结点后面,与问题一相呼应,这样逆位输入就可以得到一个正序的LIST了。
p->next=L->next; 作用是:用 P 的next指针,指向头结点的next指针;
L->next=p;//插入到表头 作用是:用头结点的next指针,指向P
如:
原来的链表: L->N1->N2->N3-null
插入P结点: L N1->N2->N3-null
| /|\
|-> P----- |
追问
恩人,能把答案具体写上不????
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询