创建单链表,存储4个学生信息(年龄,分数,姓名)
1、建立学生结构体数组,存放4个学生信息,循环调用插入函数,建立整表
2、任意位置插入一个新学生。变量e是学生结构体变量。
3、任意位置删除一个学生。
4、单链表逆置后将学生信息输出
stu.h
#ifndef _STU_H_
#define _STU_H_
#include<myhead.h>
typedef struct{//学生信息结构体
int age;
char name[50];
float score;
}stu;
typedef struct node{
stu data;//数据域
int len;
struct node *next;//指针域
}Link,*Plink;
Plink get_head();
int set_stu(Plink L,int);
int output(Plink L);
int set_pos(Plink L);
int del_pos(Plink L);
int reverse(Plink L);
#endif
stu.c
#include"stu.h"
//获得头节点
Plink get_head(){
Plink p = malloc(sizeof(Link)) ;
if(p==NULL){
printf("申请空间失败!\n");
return NULL;
}
p->len = 0;
p->next = NULL;
return p;
}
//头插法插入学生
int set_stu(Plink L,int n){
if(L==NULL){
printf("链表为空!\n");
return -1;
}
for(int i=0;i<n;i++){
Plink p = malloc(sizeof(Link));
if(p==NULL){
printf("申请空间失败!\n");
return -1;
}
printf("请输入第%d个学生的姓名:\n",i+1);
scanf("%s",p->data.name);
printf("请输入第%d个学生的年龄:\n",i+1);
scanf("%d",&p->data.age);
printf("请输入第%d个学生的分数:\n",i+1);
scanf("%f",&p->data.score);
p->next = L->next;
L->next = p;
L->len++;
}
printf("设置完毕!\n");
return 0;
}
//输出信息函数
int output(Plink L){
if(L==NULL||L->len==0){
printf("链表为空!\n");
return -1;
}
Plink p=L->next;
for(int i=0;i<L->len;i++){
printf("姓名:%s ",p->data.name);
printf("年龄:%d ",p->data.age);
printf("成绩:%.2f ",p->data.score);
printf("\n");
p = p->next;
}
return 0;
}
//按位置插入
int set_pos(Plink L){
if(L==NULL||L->len==0){
printf("链表为空!\n");
return -1;
}
printf("请输入要插入的位置:\n");
int pos;
scanf("%d",&pos);
if(pos<1||pos>L->len){
printf("非法输入!\n");
return -1;
}
Plink p = malloc(sizeof(Link));
printf("请输入学生的姓名:\n");
scanf("%s",p->data.name);
printf("请输入学生的年龄:\n");
scanf("%d",&p->data.age);
printf("请输入学生的分数:\n");
scanf("%f",&p->data.score);
Plink t=L;
for(int i=0;i<pos-1;i++){
t=t->next;
}
p->next = t->next;
t->next = p;
L->len++;
printf("插入完毕!\n");
output(L);
return 0;
}
//按位置删除
int del_pos(Plink L){
if(L==NULL||L->len==0){
printf("链表为空!\n");
return -1;
}
printf("请输入要删除的位置:\n");
int pos;
scanf("%d",&pos);
if(pos<1||pos>L->len){
printf("非法输入!\n");
return -1;
}
Plink t=L;
for(int i=0;i<pos-1;i++){
t=t->next;
}
Plink p=t->next;
t->next=p->next;
free(p);
p=NULL;
L->len--;
output(L);
printf("删除成功!\n");
return 0;
}
//利用头插法逆置
int reverse(Plink L){
if(L==NULL||L->len==0){
printf("链表为空!\n");
return -1;
}
Plink p;
Plink t=L->next;
L->next = NULL;
while(t!=NULL){
p=t;
t=t->next;
p->next = L->next;
L->next = p;
}
output(L);
printf("逆置完成!\n");
return 0;
}
mymain.c
#include<myhead.h>
#include"stu.h"
int main (int argc, const char *argv[])
{
//申请头结点
Plink L = get_head();
//存放学生信息
set_stu(L,4);
//输出学生信息
output(L);
//任意位置插入学生
set_pos(L);
//任意位置删除学生
del_pos(L);
//逆置
reverse(L);
return 0;
}