单链表的基本操作
实验环境:Visual C++
实验目的:
1、掌握单链表的定义;
2、掌握单链表的基本操作,如建立、查找、插入和删除等。
实验内容:
定义一个包含学生信息(学号,姓名,成绩)的单链表,使其具有如下功能:
- 根据指定学生个数,逐个输入学生信息;
- 逐个显示学生表中所有学生的相关信息;
- 根据姓名进行查找,返回此学生的学号和成绩;
- 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);
- 给定一个学生信息,插入到表中指定的位置;
- 删除指定位置的学生记录;
- 统计表中学生个数。
实验提示:
学生信息的定义:
typedef struct {
char no[8]; //8位学号
char name[20]; //姓名
int price; //成绩
}Student;
单链表的定义:
typedef struct Lnode {
Student data; //存储学生信息的数据域
struct Lnode *next; //存储下一位学生信息的地址
}Lnode, *LinkList;
完整代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct{
char no[10];
char name[20];
int score;
}Stu;
typedef struct Lnode{
Stu data;
struct Lnode *next;
}Lnode,*Linklist;
void menu(){
printf("----------------------------------------\n");
printf("请选择如下操作:\n");
printf("1、根据指定学生个数,输入学生信息;\n");
printf("2、逐个显示学生表中所有学生的信息;\n");
printf("3、根据姓名查找,返回此学生的信息;\n");
printf("4、根据指定位置返回学生信息;\n");
printf("5、给定一个学生信息,插入到指定位置;\n");
printf("6、删除指定位置记录的学生信息;\n");
printf("7、统计表中学生个数;\n");
printf("0、退出!\n");
printf("----------------------------------------\n");
}
//逐一输入建立单链表(尾插法)
Linklist create(){
Linklist h,r,p;
int n,i;
h = (Linklist)malloc(sizeof(Lnode));
h->next = NULL;
r = h;
printf("请输入学生的人数:");
scanf("%d",&n);
for(i=1;i<=n;i++){
//建立新结点并链入链表尾
printf("请输入第%d个学生的信息:",i);
p = (Linklist)malloc(sizeof(Lnode));
scanf("%s",&p->data.no);
scanf("%s",&p->data.name);
scanf("%d",&p->data.score);
r->next = p;
r = p;
}
r->next = NULL;
return h;
}
//输出
void prin(Linklist h){
Linklist p;
int i = 1;
p = h->next;
while(p->next!=NULL){
p = p->next;
printf("第%d位学生信息:",i);
printf("%s,%s,%d\n",p->data.no,p->data.name,p->data.score);
i++;
}
}
//按姓名查找
void find(Linklist h){
Linklist p;
char name[20];
scanf("%s",&name);
while(p->next!=NULL){
if(strcmp(p->data.name,name)==0){
printf("已找到姓名为%s的学生,他的学号是%s,成绩为%d。\n",name,p->data.no,p->data.score);
break;
}
}
}
//按位置查找
void search(Linklist h){
Linklist p;
int pos,i;
p = h->next;
printf("请输入查找学生的序号:");
scanf("%d",&pos);
if(pos<1){
printf("位置不合法!\n");
return;
}
while(p->next&&i!=pos){
p=p->next;
i++;
}
if(i==pos){
printf("查找的学生信息为:");
printf("%s,%s,%d\n",p->data.no,p->data.name,p->data.score);
}
else printf("查找失败!");
}
//给定学生信息插入指定位置
void insert(Linklist h){
Linklist p,r,l;
int pos,i;
p = h->next;
r = (Linklist)malloc(sizeof(Lnode));
printf("输入要插入的学生信息:");
scanf("%s %s %d",&r->data.no,&r->data.name,&r->data.score);
printf("请输入要插入的位置:");
scanf("%d",&pos);
if(pos<1){
printf("位置不合法!\n");
return;
}
while(p->next&&i<pos-1){//执行到pos的前一个结点结束循环
p = p->next;
i++;
}
l = p->next;//l为pos位置的结点
p->next=r;//新结点链在pos前1个结点后
r->next=l;//原pos位置的结点链在新结点r后
printf("插入成功!\n");
}
//删除
void remov(Linklist h){
Linklist p,r,l;
int pos,i;
p=h->next;
printf("请输入要删除的位置:");
scanf("%d",&pos);
if(pos<1){
printf("位置不合法!\n");
return;
}
while(p->next&&i<pos-1){//执行到pos的前一个结点结束循环
p = p->next;
i++;
}
r = p->next;//l为pos位置的结点
p->next=r->next;//pos后一个结点链在pos一个结点后
free(r);
printf("删除成功!\n");
}
//统计学生个数
void count(Linklist h){
Linklist p;
int sum;
p = h->next;
while(p->next!=NULL){
sum++;
}
printf("学生个数为:%d",sum);
}
void main()
{
int choice = 100;
Linklist h; //链表的头指针,指向头结点
while(choice){
menu();
scanf("%d",&choice);
switch(choice){
case 1:h=create();break;
case 2:prin(h);break;
case 3:find(h);break;
case 4:search(h);break;
case 5:insert(h);break;
case 6:remov(h);break;
case 7:count(h);break;
case 0:exit(0);
}
}
}
如有纰漏,欢迎大家提出交流!