#include<stdio.h>
#include<stdlib.h>
#define PT "学号:%ld 姓名:%-10s 性别:%c\n",p->num,p->name,p->sex
#define N sizeof(struct student)
struct student
{
long num;
char name[11];
char sex;
struct student *next;
};
struct student *creat(struct student *head);
int listlength(struct student *head);
struct student *listinsert(struct student *head);
struct student *listdelete(struct student *head);
void listget(struct student *head);
void print(struct student *p);
int main()
{
int n,number=0;
struct student *head=NULL;
struct student *p=NULL;
printf("创建链表\n");
head=creat(head);
printf("全班同学的名单为:\n");
print(head);
printf("*********学生表*********\n");
printf("------链表的管理--------\n");
printf("1--求当前学生数量\n");
printf("2--插入一个学生信息\n");
printf("3--删除一个学生信息\n");
printf("4--查询一个学生信息\n");
printf("0--结束运行\n");
printf("========================\n");
printf("请输入编号(0-4)\n");
scanf("%d",&n);
while(!(n==0||n==1||n==2||n==3||n==4))
{
printf("输入的编号错误,请重新输入(0-4)\n");
scanf("%d",&n);
}
if(n==0)
printf("感谢使用!\n");
else
{
switch(n)
{
case 1://1--求当前学生数量
number=listlength(head);
printf("学生个数为%d\n",number);
break;
case 2://2--插入一个学生信息
head=listinsert(head);
print(head);
break;
case 3://3--删除一个学生信息
head=listdelete(head);
print(head);
break;
case 4://4--查询一个学生信息
listget(head);
break;
}
}
return 0;
}
struct student * creat(struct student *head)
{
struct student *p1,*p2;
int i=0;
printf("请输入学号 姓名 性别(男生输入M,女生输入W)\n");
printf("(若输入学号为-1则停止输入)\n");
while(1)
{
if((p1=(struct student *)malloc(N))==NULL)
printf("申请内存失败!\n");
p1->next=NULL;
scanf("%ld %s %c",&p1->num,p1->name,&p1->sex);
i++;
if(p1->num==-1)
break;
if(i==1)
head=p2=p1;
else
p2->next=p1;
p2=p1;
}
return head;
}
void print(struct student *head)
{
struct student *p=head;
while(p!=NULL)
{
printf("学号:%ld 姓名:%-10s 性别:%c\n",p->num,p->name,p->sex);
p=p->next;
}
}
int listlength(struct student* head)
{
int size=1;
struct student* p=head;
while(p->next!=NULL)
{
p=p->next;
size++;
}
return size;
}
struct student *listinsert(struct student *head)
{
int i,j=1;
struct student *q,*p=head;
printf("请输入一个插入位置\n");
scanf("%d",&i);
q=(struct student *)malloc(N);
if((q=(struct student *)malloc(N))==NULL)
printf("申请内存失败!\n");
printf("请输入要插入的学生信息:学号,姓名,性别\n");
scanf("%ld %s %c",&q->num,q->name,&q->sex);
while( p->next!=NULL && j<i-1 )
{
p=p->next;
j++;
}
if(j!=i-1)
{
printf("插入位置参数错!\n");
exit(0);
}
q->next=p->next;
p->next=q;
return head;
}
struct student *listdelete(struct student *head)
{
struct student *s,*p=head;
int j=1,i;
printf("请输入需要删除的结点位置:\n");
scanf("%d",&i);
while(p->next!=NULL && p->next->next!=NULL && j<i-i)
{
p=p->next;
j++;
}
if(j!=i-1)
printf("删除位置出错!");
s=p->next;
p->next=p->next->next;
free(s);
return head;
}
void listget(struct student *head)
{
int j=1,i;
struct student *p=head,*s;
printf("请输入要查询的数据元素的标号:\n");
scanf("%d",&i);
while(p->next!=NULL && j<i-1)
{
p=p->next;
j++;
}
if(j!=i-1)
{
printf("取元素的位置参数错!");
exit(0);
}
s=p->next;
s->next=NULL;
printf("学号:%ld 姓名:%-10s 性别:%c\n",s->num,s->name,s->sex);
}


