#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct node
{
int id;//学号
char name[20];
int score;//成绩
struct node *next;
}Lnode,*LinkList;//学生成绩的结构体
LinkList Create_List()//创建成绩单链表
{
LinkList head=NULL;//第一个结点
Lnode *p,*last=NULL;//last尾结点
int id,score;
char name[20];
printf("请输入学号,姓名,成绩(用,隔开,0结束):\n");
scanf("%ld,%s,%d",&id,&name,&score);
while(id!=0)//学号为0时循环结束
{
p=(Lnode *)malloc(sizeof(Lnode));//新建立数据结点
p->id=id;
p->name[20]=name[20];
p->score=score;
if(head==NULL) head=p;//第一个结点的处理
else last->next=p;//其他结点的处理
last=p;//指向新的尾结点
scanf("%ld,%s,%d",&id,&name,&score);
}
if(last!=NULL)
last->next=NULL;//对于非空表,最后结点的指针域放空指针
return head;
}
void Disp_List(LinkList head)//显示成绩
{
LinkList p=head;
//p=head->next;//读取第一个元素的地址存储位置,就是直接读取下一个位置的元素
while(p!=NULL)
{
printf("学号%ld,%s,%d分→",p->id,p->name,p->score);
p=p->next;
}
printf("NULL\n");
}
void Ins_List(LinkList head,int i,int id,char name[20],int score)//插入操作
{
int j=0;
Lnode *h,*p;
h=(Lnode *)malloc(sizeof(Lnode));//新开辟要插入结点
h->id=id;
h->name[20]=name[20];
h->score=score;
h->next=NULL;
p=head;
while((j<i-1)&&(p->next!=NULL))//寻找前一个位置
{
p=p->next;j=j+1;
}
if(j==i-1){h->next=p->next;p->next=h;}
else printf("插入失败!\n");
}
void Del_List(LinkList head,int i)//删除操作
{
int j=0;
LinkList p,q;
p=head;
while((j<i-1)&&(p->next!=NULL))
{
p=p->next;
j=j+1;
}
if((p->next!=NULL)&&(j==i-1))
{
q=p->next;
p->next=q->next;
free(q);
}
else printf("删除失败!");
}
main()
{
LinkList head;
int id,i,score;
char name[20];
head=Create_List();//创建学生成绩链表
Disp_List(head);
printf("------------------------------\n");
printf("输入要插入的位置,学号,成绩(用,隔开):");
scanf("%d,%ld,%s,%d",&i,&id,&name,&score);
Ins_List(head,i,id,name[20],score);//插入操作
Disp_List(head);
printf("------------------------------\n");
printf("请输入要删除信息的位置:");
scanf("%d",&i);
Del_List(head,i);//删除操作
Disp_List(head);
}