#ifndef __STU_H__
#define __STU_H__
typedef struct Node
{
int len;
int num;
char name[20];
int score;
struct Node *prio;
struct Node *next;
}Node,*Class;
//创建
Class list_create();
//判空
int list_empty(Class C);
//封装数据
Class list_package();
//头插
int list_insert_head(Class L);
//遍历
void list_show(Class L);
//尾插
int list_insert_tail(Class L);
//任意位置插入
int list_insert_pos(Class L,int pos);
//任意位置删除
int list_delete_pos(Class L,int pos);
//任意位置修改
int list_revise_pos(Class L,int pos);
//头删
int list_delete_heda(Class L);
//释放
void list_free(Class L);
#endif
#include<stdio.h>
#include<stdlib.h>
#include"stu.h"
#include<string.h>
//创建
Class list_create()
{
Class C = (Class)malloc(sizeof(Node));
if(NULL == C)
{
printf("创建失败\n");
return NULL;
}
C->len=0;
C->prio=NULL;
C->next=NULL;
printf("创建成功\n");
return C;
}
//判空
int list_empty(Class C)
{
return C->next==NULL;//1空,0非空
}
//封装数据
Class list_package()
{
Class s = list_create();//申请结点
printf("请输入学生学号\n");
scanf("%d",&s->num);
printf("请输入学生姓名\n");
scanf("%s",s->name);
printf("请输入学生成绩\n");
scanf("%d",&s->score);
// printf("%d %s %d\n",s->num,s->name,s->score);
return s;
}
//头插
int list_insert_head(Class L)
{
if(NULL==L)
{
printf("插入失败\n");
return -1;
}
Class s = list_package();
if(L->next==NULL)
{
s->prio=L;
L->next=s;
}
else
{
s->prio=L;
s->next=L->next;
s->next->prio=s;
s->prio->next=s;
}
L->len++;
printf("插入成功\n");
return 0;
}
//遍历
void list_show(Class L)
{
if(L==NULL)
{
printf("遍历失败\n");
return ;
}
Class q = L->next;
printf("学号\t姓名\t成绩\n");
while(q)
{
printf("%d\t%s\t%d\n",q->num,q->name,q->score);
q=q->next;
}
}
//尾插
int list_insert_tail(Class L)
{
if(NULL==L)
{
printf("插入失败\n");
return -1;
}
Class s1 = L;
for(int i =1;i<=s1->len-1;i++)
{
s1=s1->next;
}
list_insert_head(s1);
L->len++;
printf("尾插成功\n");
return 0;
}
//任意位置插入
int list_insert_pos(Class L,int pos)
{
if(NULL==L)
{
printf("插入失败\n");
return -1;
}
if(pos<=0||pos>L->len)
{
printf("任意位置插入失败\n");
return -1;
}
Class s1 = L;
for(int i=1;i<pos;i++)
{
s1=s1->next;
}
list_insert_head(s1);
printf("任意位置插入成功\n");
}
//任意位置删除
int list_delete_pos(Class L,int pos)
{
if(NULL==L||list_empty(L))
{
printf("删除失败\n");
return -1;
}
Class s1=L;
for(int i=1;i<=pos;i++)
{
s1=s1->next;
}
if(s1->next==NULL)
{
s1->prio->next=NULL;
free(s1);
s1=NULL;
}
else
{
s1->next->prio=s1->prio;
s1->prio->next=s1->next;
free(s1);
s1=NULL;
}
L->len--;
printf("任意位置删除成功\n");
}
//任意位置修改
int list_revise_pos(Class L,int pos)
{
if(NULL==L||list_empty(L))
{
printf("修改失败\n");
return -1;
}
Class s1 = L;
for(int i =1;i<=pos;i++)
{
s1=s1->next;
}
char a;
printf("是否修改学号,Y/N\n");
scanf(" %c",&a);
if(a=='Y'||a=='y')
{
int e;
printf("请输入要修改后的学号\n");
scanf(" %d",&e);
s1->num=e;
printf("修改成功\n");
}
printf("是否修改姓名,Y/N\n");
scanf(" %c",&a);
if(a=='Y'||a=='y')
{
char name1[20];
printf("请输入要修改后的姓名\n");
scanf(" %s",name1);
strcpy(s1->name,name1);
printf("修改成功\n");
}
printf("是否修改成绩,Y/N\n");
scanf(" %c",&a);
if(a=='Y'||a=='y')
{
int score1;
printf("请输入要修改后的成绩\n");
scanf(" %d",&score1);
s1->score=score1;
printf("修改成功\n");
}
}
//头删
int list_delete_heda(Class L)
{
if(NULL==L)
{
printf("不合法\n");
return -1;
}
Class s1 = L->next;
Class s2 = L->next;
if(s2->next==NULL)
{
s2->prio->next=NULL;
free(s2);
L=NULL;
}
else
{
s1->next->prio=s1->prio;
s1->prio->next=s1->next;
free(s1);
printf("2");
s1=NULL;
}
printf("删除成功\n");
return 1;
}
//释放
void list_free(Class L)
{
while(L->next!=NULL)
{
list_delete_heda(L);
}
free(L);
L=NULL;
printf("释放成功\n");
}
#include<stdio.h>
#include<stdlib.h>
#include"stu.h"
int main(int argc, const char *argv[])
{
//创建
Class C = list_create();
int id;
while(1)
{
printf("\t\t====学生管理系统====\n");
printf("\t\t功能一:从头添加学生信息\n");
printf("\t\t功能二:从尾添加学生信息\n");
printf("\t\t功能三:任意位置添加学生信息\n");
printf("\t\t功能四:展示学生信息\n");
printf("\t\t功能五:删除学生信息\n");
printf("\t\t功能六:修改学生信息\n");
printf("\t\t功能七:销毁表格\n");
printf("\t\t功能零:退出系统\n");
printf("请输入功能编号\n");
scanf("%d",&id);
switch(id)
{
case 1:
{
//头插
list_insert_head(C);
}
break;
case 2:
{
//尾插
list_insert_tail(C);
}
break;
case 3:
{
//任意位置插入
int a;
printf("您要从哪个位置开始插入学生信息\n");
scanf("%d",&a);
list_insert_pos(C,a);
}
break;
case 4:
{
//展示
list_show(C);
}
break;
case 5:
{
//任意位置删除
int b;
printf("您要删除哪个位置的学生信息\n");
scanf("%d",&b);
list_delete_pos(C,b);
}
break;
case 6:
{
//任意位置修改
int e;
printf("您要修改哪个位置的学生信息\n");
scanf("%d",&e);
list_revise_pos(C,e);
}
break;
case 7:
{
//释放
list_free(C);
free(C);
C=NULL;
}
break;
case 0:
exit(0);
default:printf("您输入的功能有误,请重新输入\n");
}
}
return 0;
}