#include <stdio.h>
#include <stdlib.h>
typedef struct{
char number[20];
char name[20];
int grade;
}student;
typedef struct LinkNode{
student student;
struct LinkNode *next;
}LinkNode;
void input(student *p){
printf("请输入学号!\n");
scanf("%s",&p->number);
printf("请输入姓名!\n");
scanf("%s",&p->name);
printf("请输入成绩!\n");
scanf("%d",&p->grade);
}
void output(student p){
printf("学号为:%s\n",p.number);
printf("姓名为:%s\n",p.name);
printf("成绩为:%d\n",p.grade);
}
int length(LinkNode *first){
int count=0;
LinkNode* q = first->next;
while(q!=NULL){
q=q->next;
count++;
}
return count;
}
void create(LinkNode** first){
*first = (LinkNode*)malloc(sizeof(LinkNode));//创建首节点
}
int insert(LinkNode** first,student stu,int i){//向链表中的指定位置添加学生信息
LinkNode *per,*nxt;
nxt=(LinkNode*)malloc(sizeof(LinkNode));
per=*first;
int L=length(*first);
if(i<1||i>L+1){
printf("输入的范围有误!\n");
return 0;
}
int count=0;
while(count<i-1){
per=per->next;
count++;
}
nxt->next=per->next;
nxt->student=stu;
per->next=nxt;
}
void add(LinkNode** first,student stu) {
LinkNode *per,*nxt;
nxt=(LinkNode*)malloc(sizeof(LinkNode));
per=*first;
int L=length(*first);
int count=0;
while(count<L){
per=per->next;
count++;
}
per->next=nxt;
nxt->student=stu;
nxt->next=NULL;
}
void display(LinkNode *first){//输出链表中的所有元素
LinkNode *L;
L=first;
L=L->next;
while(L){
output(L->student);
L=L->next;
}
}
void del(LinkNode** first,int i){
LinkNode *per,*nxt;
int L=length(*first);
per=*first;
per=per->next;
if(i<=0||i>L){
printf("输入的范围错误!\n");
}
int count=1;
while(count<i-1){
per=per->next;
count++;
}
nxt=per->next;
per->next=nxt->next;
free(nxt);
}
int main(int argc, char *argv[]) {
LinkNode *L;
student s;
int i;
printf("1.创建头指针\n");
printf("2.添加学生信息\n");
printf("3.在指定位置插入学生信息\n");
printf("4.获得学生表的长度\n");
printf("5.删除指定位置的学生信息\n");
printf("6.显示学生表中所有的学生信息\n");
printf("******************请输入您要进行的操作编号********************\n");
while(1){
scanf("%d",&i);
switch(i){
case 1:
create(&L);
printf("初始化成功!\n");
break;
case 2:
input(&s);
add(&L,s);
printf("学生信息添加成功!\n");
break;
case 3:
input(&s);
int a;
printf("请输入您想插入学生的位置!\n");
scanf("%d",&a);
insert(&L,s,a);
printf("学生信息插入成功!\n");
break;
case 4:
printf("当前学生表的长度为%d\n",length(L));
break;
case 5:
printf("请输入您要删除的位置!\n");
;
int b;
scanf("%d",&b);
del(&L,b);
printf("学生信息删除成功!\n");
break;
case 6:
display(L);
break;
}
}
}
注意:
1.LinkNodeL 指针的指针 L存储着一个地址,L指向该地址,被指向的地址中又存储着一个地址,*L指向LinkNode。
2.在case 中定义变量时候,如果报错,可以在定义变量的语句前面添加一个空语句。