1. 阅读程序,对主要语句进行注释,理解程序算法思路并用图形或语言描述。
编写一个程序,首先创建一个按学号排序的学生信息链表,然后向此链表插入学生信息。
参考代码:
#include <iostream.h>
struct stu
{
int number;
char name[20];
stu *next; //指针next指向下一个结构体,以此形成一个链表
};
int main()
{
stu s[3]={{1,"Jiang Tao",&s[1]},
{10,"Li Ming",&s[2]},
{20,"Yu Wei",NULL}};
stu *head=s; //头指针head
stu *p;
stu in={2,"Zhang San",NULL};
if(head->number>in.number)
in.next=head,head=∈
else
{
p=head;
while(p->next!=NULL)
{
if(p->next->number>in.number)
{
in.next=p->next;
p->next=∈
break;
}
else p=p->next;
}
p->next=∈
}
for(p=head;p!=NULL;p=p->next)
{
cout<<"number="<<p->number<<" name="<<p->name<<endl;
}
return 0;
}
注:此为单链表的创建和插入算法程序
分析:
struct stu
{
int number;
char name[20];
stu *next; //指针next指向下一个结构体,以此形成一个链表
};
结点:
链表:
请用语言或图示法对上述链表的插入算法进行描述。
定义结构体变量名为stu
然后初始化链表并按number 排序赋值
stu *head=s;建立stu链表的头指针,初始化一个结点为:stu in={2,"Zhang San",NULL};
做判断:如果头指针指向结点的Number大于给出结点的Number值时,把结点stu in插入到链表中,且做头指针 把next指向原来的地址。如果头指针指向结点的Number不大于给出结点的Number值时,把原链表中的头指针赋给一个结点指针让它向后移,移到下一个结点,再与stu in这个结点的Number值进行比较,如果满足了Number值大于stu in这个结点的Number值,那么就把这个stu in结点插入到这个结点之前,不然继续移动结点指针;直到遍历完原链表中所有的结点为止。实现在一个有序的链表中按次序插结点。
首先定义一个结构体stu
在main函数中定义s[3]这个对象,再定义head储存s的头指针,定义p作为遍历链表的指针,接着定义了需要插入的结构体对象in
如果链表的头的number比in的number,就把头作为in的下一个,再把头换成in
否则就用p储存头的地址,在p的下一个不为空(没有遍历到链表末尾)的情况下,如果p的下一个的number大于in的number,就把in插入到p的后面,否则就将p后移一位,如果遍历到末尾仍无法插入,就把in直接放在末尾的后面
然后就是用p遍历链表对链表中的元素进行显示的过程
我是按照你的程序的步骤写的,应该可以对应上吧
#include <iostream.h>
struct stu //定义结构体名为学生
{
int number;
char name[20];
stu *next; //指针next指向下一个结构体,以此形成一个链表
};
int main()
{
stu s[3]={{1,"Jiang Tao",&s[1]},
{10,"Li Ming",&s[2]},
{20,"Yu Wei",NULL}}; //初始化赋值
stu *head=s; //头指针head
stu *p;
stu in={2,"Zhang San",NULL};
if(head->number>in.number) //头指针指向的结点的Number较大
in.next=head,head=∈ //插入name为Zhang San的结点并修改头指针
else
{
p=head;
while(p->next!=NULL)
{
if(p->next->number>in.number) //判断下一个结点的Number是否大于需要插入的结点对应的Number值
{
in.next=p->next;
p->next=∈ //将name为Zhang San的结点插入在P结点之后并修改p->next指针
break;
}
else p=p->next; //移动指针到下一位,并继续判断
}
p->next=∈
}
for(p=head;p!=NULL;p=p->next)
{
cout<<"number="<<p->number<<" name="<<p->name<<endl; //输出链表
}
return 0;
}