1. 学生信息表
利用链表存储和维护学生信息,包括学号(10 位数字)、姓名(不超过 50 个字符)、性别
和成绩
设计并完成以下链表操作子函数
统计并返回链表的节点数目(不包括头节点)
查找并输出第 k 个节点的信息;如果节点数小于 k,则提示“节点不存在”
在第 k 个节点后,插入一个新节点;如果节点数小于 k,则插在链表最后
删除第 k 个节点;如果节点数小于 k,则删除最后一个节点;如果链表为空,则提示
“空链表无法删除”
#include<iostream>
using namespace std;
struct node
{
long long int ID;
char name[50];
char geder;
float score;
node *next;
};//定义含有指针的结构体
void link_sum(node *p)
{
int a=0;
while(p->next!=NULL)
{
a++;
p=p->next;
}
cout<<a<<endl;
}//统计节点数
int link_insert_tail(node *p,int k)
{
while(k>0&&p->next!=NULL)
{
k--;
p=p->next;
}
node *ptr=new node;
cout<<"学生身份";
cin>>ptr->ID;
cout<<"学生名字(仅支持英文或拼音)";
cin>>ptr->name;
cout<<"学生性别";
cin>>ptr->geder;
cout<<"学生成绩";
cin>>ptr->score;
ptr->next=p->next;
p->next=ptr;
return 1;
}//输入或插入结构体
void link_cout(node *p)
{
while(p->next!=NULL)
{
cout<<(p->next)->ID<<""<<(p->next)->name<<""<<(p->next)->geder<<""<<(p->next)->score<<endl;
p=p->next;
}
}//输出结构体内容
void link_find_tail(node *p,int k)
{
while (k)
{
p=p->next;
k--;
if (p->next==NULL)
{
cout<<"节点不存在";
break;
}
}
cout<<(p->next)->ID<<""<<(p->next)->name<<""<<(p->next)->geder<<""<<(p->next)->score<<endl;
}//寻找第K个值
int link_delete_tail(node *p,int k)
{
if(p->next==NULL)
{
cout<<"链表无法删除";
return 0;
}
while(k-1>0)
{
p=p->next;
k--;
if(p->next->next==NULL)
{
break;
}
}
node *prt;
prt=(p->next)->next;
delete p->next;
p->next=prt;
return 1;
}//回收内存
int main()
{
node head;
head.next=NULL;
cout<<"请输入n值:";
int n,i=0,k,m;
cin>>n;
cout<<"请输入学生相关信息:"<<endl;
while(i<n)
{
link_insert_tail(&head,100);
i++;
}
cout<<"节点总数为:";
link_sum(&head);
cout<<"请输入要插入的位置k:";
cin>>k;
cout<<"输入要插的值:"<<endl;
link_insert_tail(&head,k);
cout<<"各学生信息为:"<<endl;
link_cout(&head);
cout<<"输入要删除的学生:";
int h;
cin>>h;
link_delete_tail(&head,h);
link_cout(&head);
cout<<"请输入要查看的位置:" ;
cin>>m;
m=m-1;
link_find_tail(&head,m);
return 0;
}
链表插入排序
学生信息包括学号(10 位数字)、姓名(不超过 50 个字符)、性别和成绩;输入多个学生
的信息,存储到链表中
基于“ 插入排序” ”算法,将所有学生信息按照成绩由高到低输出
#include<iostream>
using namespace std;
struct node
{
long long int ID;
char name[50];
char geder;
float score;
node *next;
};
void link_cout(node *p)
{
while(p->next!=NULL)
{
cout<<(p->next)->ID<<""<<(p->next)->name<<""<<(p->next)->geder<<""<<(p->next)->score<<endl;
p=p->next;
}
}//输出函数
int main()
{
node *head=new node;
head->next=NULL;
node*ptr=head;//建立空链
cout<<"请输入学生个数:";
int n;
cin>>n;
cout<<"请输入学生相关信息:";
for(int i=0;i<n;i++)
{
node *p=head;
while(p->next!=NULL)
{
p=p->next;
}
node *ptr=new node;
cin>>ptr->ID;
cin>>ptr->name;
cin>>ptr->geder;
cin>>ptr->score;
ptr->next=NULL;
p->next=ptr;
}//输入学生信息
cout<<"各学生初始信息为:"<<endl;
cout<<"学号"<<" "<<"姓名"<<" "<<"性别"<<" "<<"成绩"<<endl;
link_cout(head);//输出
cout<<"排序后的结果为"<<endl;
cout<<"学号"<<" "<<"姓名"<<" "<<"性别"<<" "<<"成绩"<<endl;
node* p = head->next->next, * q = p, * r = head;
head->next->next = NULL;
r = head;//断裂链表并把断裂后的表赋予q
while (p != NULL)
{
q = q->next;
p->next = NULL;
while (r->next != NULL)
{
if (r->next->score<= p->score)
{
p->next = r->next;
r->next = p;
break;
}//进行成绩比较
else
{
r = r->next;
}
}
if (r->next == NULL)
{
r->next = p;
}
r = head;
p = q;
}
r = r->next;
link_cout(head);
return 0;
}//排序并输出