建立一个动态链表,链表中每一结点包括:学号、姓名、性别、年龄、成绩。( 很急的谁帮帮我)

建立一个动态链表,链表中每一结点包括:学号、姓名、性别、年龄、成绩。( 很急的谁帮帮我),第1张

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++程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10630017.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-10
下一篇2023-05-10

发表评论

登录后才能评论

评论列表(0条)

    保存