
2、#include<stdioh>
#include<stdlibh>
#include<conioh>
/定义结构体/
struct student
{
int num;
float score;
struct student next;
};
struct student create_head()
{
struct student head;
head=(struct student)malloc(sizeof (struct student) );
if(head==NULL) //小心别漏这个
{
printf("申请头结点失败!\n");
return NULL;
}
head->next=NULL;
return head;
}
/将s指向的结点插入链表,使链表保持升序,并返回头结点/
struct student insert(struct student head,struct student s)
{
struct student p=head;
while(p->next!=NULL&&s->score>p->next->score)//特别注意&&左右不能写反,若s最大,最后p->next=NULL,p->next->score运行出错
p=p->next;
if(p->next==NULL) //s->score最大的情况 //其实两种情况可以并在一块写
{
p->next=s; //连接结点
s->next=NULL; //p->next就等于NULL
}
else
{
p->next=s; //连接结点
s->next=p->next;
}
return head ;
}
/查找符合条件的结点,并返回指向该结点的指针/
struct student search(struct student head)
{
struct student p=head->next;
int num;
printf("请输入要查找学生的学号:\n");
scanf("%d",&num);
while(p!=NULL&&p->num!=num) //特别注意两条件不能写反,若写反最后p指向NULL时p->num找不到 运行出错
p=p->next;
if(p==NULL) //特别注意两个if不能调换,若调换最后p指向NULL时p->num运行出错
{
printf("找不到符合条件的结点!!!");
return NULL; //查找不到返回空指针
}
if(p->num==num)
{
printf("找到符合条件的结点\n该结点为%d\t%f",p->num,p->score);
return p; //返回查找到的指针
}
}
/输出链表各结点的值,也称对链表的遍历/
void print(struct student head)
{
struct student p;
printf(" 链表如下: \n");
p=head->next;
while(p!=NULL)
{
printf("%d\t%1f\n",p->num,p->score);
p=p->next;
}
}
/释放链表/
void free_list(struct student head)
{
struct student p=head ;
printf("释放链表:\n");
while(p!=NULL)
{
head=head->next;
free(p);
p=head;
}
printf("释放链表成功!\n");
}
/删除链表中值为num的结点,并返回链表的首指针/
struct student delete_note(struct student head,int num_x)
{
struct student p1=head->next , p2=head ;
while(p1!=NULL&&p1->num!=num_x) //特别注意&&左右条件不能调换,若调换如果p1指向NULL时p1->num运行出错
{
p2=p1;
p1=p1->next;
}
if(p1==NULL) //特别注意两个if不能调换,若调换如果p1指向NULL时,p1->num运行出错
printf("找不到符合删除要求的结点!!!\n");
if(p1->num==num_x)
{
p2->next=p1->next;
free(p1);
printf("结点删除成功!\n");
}
return head;
}
/完整的有头结点链表 *** 作程序/
void main()
{
struct student p , head ;
char c;
int num ;
float score ;
printf("有头结点链表 *** 作程序:\n");
head=create_head();
while(1)
{
printf("I:插入结点(自动升序) P:输出链表 S:查找结点 D:删除结点 E:释放链表并退出程序! ");
c=getch();
switch(c)
{
case'I':
printf("请分别输入要插入学生的学号和分数:\n");
scanf("%d%f",&num,&score);
p=(struct student)malloc( sizeof(struct student) );
if(p==NULL)
{
printf("申请该结点失败!!!\n");
exit (0) ;
}
p->num=num; p->score=score; //给p赋值
insert(head,p);
printf("插入成功!\n");
break;
case'P':
print(head);
break;
case'S':
search(head);
break;
case'D':
printf("请输入要删除的学生的学号:\n");
scanf("%d",&num);
delete_note(head,num);
break;
case'E':
free_list(head);
exit (0);
}
}
}
#include<iostream>
using namespace std;
struct LINK
{
int num;
char a[20];
char b[20];
char c[20];
struct LINK next;
};
void menu()
{
cout<<""<<endl;
cout<<" 1创建链表 "<<endl;
cout<<" 2添加成员 "<<endl;
cout<<" 3删除成员 "<<endl;
cout<<" 4查找成员 "<<endl;
cout<<" 0退出程序 "<<endl;
cout<<""<<endl;
}
void create(LINK head)
{
LINK p,q;
int i;
p=head;
q=p;
while(1)
{
p=new LINK();
cout<<"学号:";
cin>>p->num;
cout<<"姓名:";
cin>>p->a;
cout<<"班级:";
cin>>p->b;
cout<<"学院:";
cin>>p->c;
cout<<"是否继续(1/0)"<<endl;
cin>>i;
q->next=p;
q=p;
if(i==0)
{
p->next=NULL;
cout<<"链表创建完毕!"<<endl;
break;
}
}
}
void deleted(LINK head)
{
LINK p,q;
int i;
p=head->next;
q=head;
cout<<"请输入你要删除成员的学号:";
cin>>i;
cout<<endl;
while(p!=NULL)
{
if(p->num==i)
{
q->next=p->next;
break;
}
q=p;
p=p->next;
}
if(p==NULL)
{
cout<<"没有该学生!"<<endl;
}
else
cout<<"成功删除!"<<endl;
}
void find(LINK head)
{
LINK p,q;
int i;
p=head->next;
q=head;
cout<<"请输入你要查找成员的学号:";
cin>>i;
while(p!=NULL)
{
if(p->num==i)
{
cout<<"学生学号:"<<p->num<<" 姓名:"<<p->a<<endl;
break;
}
p=p->next;
}
if(p==NULL)
{
cout<<"没有该学生!"<<endl;
}
}
void add(LINK head)
{
LINK p,q;
p=head->next;
q=new LINK();
cout<<"请输入学号:";
cin>>q->num;
cout<<"请输入姓名:";
cin>>q->a;
cout<<"班级:";
cin>>q->b;
cout<<"学院:";
cin>>q->c;
head->next=q;
q->next=p;
cout<<"插入成功!"<<endl;
}
void main()
{
LINK head;
head=new LINK();
int i;
menu();
while(1)
{
cout<<"请输入你的选择:";
cin>>i;
switch(i)
{
case 1:create(head);break;
case 2:add(head);break;
case 3:deleted(head);break;
case 4:find(head);break;
case 0:exit(0);
}
}
}
希望你能用上,能看明白,能帮助你理解
首先,main中:
Lnode
L;
//L未被初始化,应该置为NULL
void
GreatList_L(
Lnode
&L,int
n)
下第3行:
L->next=NuLL;
//此时L未初始化,哪来的next
下面的修改将逆序输出,因为保存的时候为首链接,将每次输入的值插入到表头,如果要插到表尾,最好再定义个Lnode去保存表尾,再插入
如下:
#include<iostreamh>
#include<malloch>
#define
NuLL
0
//#define
Len
sizeof(struct
Lnode)
//既然typedef了,就别用struct
#define
Len
sizeof(Lnode)
typedef
struct
node
{
float
data;
struct
node
next;
}Lnode;
void
GreatList_L(
Lnode
&L,int
n)
{
Lnode
p,
p1;//添加p1
int
i;
//L->next=NuLL;
//此句删除之
for(i=0;i<n;i++)
{
p=(Lnode
)malloc(Len);
cin>>p->data;
//p->next=L->next;
//L->next=p;
p->next=L;
L=p;
}
}
//原来的显示看起来很繁琐,修改了下:
void
display(
Lnode
L)
{
while
(L
!=
0)
{
cout
<<
L->data
<<
"
";
L
=
L->next;
}
}
void
main()
{
int
n;
Lnode
L
=
0;//初始化为0,永久保存表头
cout<<"please
input
the
number
n=";
cin>>n;
GreatList_L(L,n);
cout<<"the
Lnode
are:";
display(L);
}
以上就是关于建立一个动态链表,链表中每一结点包括:学号、姓名、性别、年龄、成绩。( 很急的谁帮帮我)全部的内容,包括:建立一个动态链表,链表中每一结点包括:学号、姓名、性别、年龄、成绩。( 很急的谁帮帮我)、写一个函数create,用了建立一个动态链表、数据结构中有关建立动态链表的问题 C++程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)