先是函数的各个申明
#ifndef __DOUBLELINK_H__
#define __DOUBLELINK_H__
typedef struct student //学生信息结构体
{
char name[20];
int id;
int score;
};
typedef int datatype;
typedef struct Node
{
union
{
datatype data;
int len;
struct student stu;
};
struct Node *next; //指向后继
struct Node *prio; //指向前驱
}Doublelink;
/*
//创建
Doublelink *list_create();
//判空
int list_empty();
//申请节点函数
Doublelink *node_buy(char *name,int id,int score);
//头插
int list_insert_head(Doublelink *D,char *name,int id,int score);
//遍历
void list_show(Doublelink *D);
//按照位置返回节点
Doublelink *list_search_pos(Doublelink *D,int pos);
//尾插
int list_insert_tail(Doublelink *D,datatype e);
//任意插入
int list_insert_pos(Doublelink *D,int pos,char *name,int id,int score);
//头删
int list_delete_head(Doublelink *D);
//尾删
int list_delete_tail(Doublelink *D);
//任意删
int list_delete_pos(Doublelink *D,int pos);
//释放
void list_free(Doublelink *D);
*/
//创建
Doublelink *list_create();
//判空
int list_empty()
//头插
int list_insert_head(Doublelink *D,char *name,int id,int score);
//任意插入
int list_insert_pos(Doublelink *D,int pos,char *name,int id,int score);
//任意删
int list_delete_pos(Doublelink *D,int pos);
//遍历
void list_show(Doublelink *D);
//查找学生信息
int list_search_value(Doublelink *D,int id);
//修改学生信息
int list_updata_value(Doublelink *D,int old,char *name,int id,int score);
#endif
然后是各个函数的代码块
#include
#include
#include"./doublelink.h"
#include
//创建
Doublelink *list_create()
{
Doublelink *D=(Doublelink*)malloc(sizeof(Doublelink));
if(NULL==D)
{
printf("创建失败\n");
return NULL;
}
//初始化
D->len=0;
D->prio=NULL;
D->next=NULL;
printf("创建成功\n");
return D;
}
//判空
int list_empty(Doublelink *D)
{
if(NULL == D)
{
printf("所给链表不合法\n");
return -1;
}
return D->next ==NULL ? 1:0; //1表示空 0表示非空
}
//申请节点函数
Doublelink *node_buy(char *name ,int id ,int score)
{
Doublelink *p=(Doublelink*)malloc(sizeof(Doublelink));
if(NULL == p)
{
printf("节点申请失败\n");
return NULL;
}
//将数据存入借点
strcpy(p->stu.name,name);
p->stu.id=id;
p->stu.score=score;
p->prio =NULL;
p->next =NULL;
return p;
}
//头插
int list_insert_head(Doublelink *D,char *name ,int id, int score)
{
Doublelink *p=node_buy(name,id,score);
//判断链表
if(NULL ==D)
{
printf("表不合法\n");
return -1;
}
if(list_empty(D)) //空链表头插
{
p->prio=D;
D->next=p;
}else //非空链表头插
{
p->next=D->next;
p->prio =D;
D->next->prio=p;
D->next=p;
}
D->len++; //表的变化
printf("插入成功\n");
}
//遍历
void list_show(Doublelink *D)
{
//判断逻辑
if(NULL == D || list_empty(D))
{
printf("遍历失败\n");
return ;
}
//遍历
printf("链表元素分别是\n");
printf("姓名\t学号\t成绩\n");
Doublelink *q=D->next;
while(q != NULL)
{
printf("%s\t",q->stu.name);
printf("%d\t",q->stu.id);
printf("%d\t",q->stu.score);
q=q->next;
printf("\n");
}
printf("\n");
}
//按照位置返回节点
/*Doublelink *list_search_pos(Doublelink *D,int pos)
{
//判断逻辑
if(NULL == D || list_empty(D))
{
printf("定位失败\n");
return NULL;
}
//查找
Doublelink *q = D->next;
for(int i=1;inext;
}
return q;
}*/
//尾插
/*int list_insert_tail(Doublelink *D,e)
{
Doublelink *p=node_buy(e);
//判断逻辑
if(NULL==p)
{
printf("链表不合法\n");
return -1;
}
//判断链表
if(NULL ==D)
{
printf("表不合法\n");
return -1;
}
if(list_empty(D)) //空链表头插
{
p->prio=D;
D->next=p;
}else //非空链表头插
{
p->next=D->next;
p->prio =D;
D->next->prio=p;
D->next=p;
}
D->len++; //表的变化
printf("插入成功\n");
}*/
//任意插入
int list_insert_pos(Doublelink *D,int pos,char *name,int id,int score)
{
//判断逻辑
if(NULL==D || list_empty(D) || pos<=0 || pos>D->len)
{
printf("插入失败\n");
return -1;
}
//插入
Doublelink *q=list_search_pos(D,pos);
Doublelink *p=node_buy(name,id,score);
p->next=q;
p->prio=q->prio;
q->prio->next=p;
q->prio=p;
//表的变化
D->len++;
printf("插入成功\n");
return 0;
}
//头删
/*int list_delete_head(Doublelink *D)
{
//判断逻辑
if(NULL== D || list_empty(D))
{
printf("链表不合法\n");
return -1;
}
//头删逻辑
Doublelink *p=D->next;
D->next=p->next;
p->next=D;
D->len--;
printf("头删成功\n");
}*/
//尾删
/*int list_delete_tail(Doublelink *D)
{
//判断逻辑
if(NULL == D || list_empty(D))
{
printf("链表错误\n");
return -1;
}
Doublelink *p=D->next;
while(p->next->next != NULL)
{
p=p->next;
}
Doublelink *q=p->next;
p->next=NULL;
free(q);
q=NULL;
printf("尾删成功\n");
D->len--;
}*/
//任意删
int list_delete_pos(Doublelink *D,int pos)
{
//判断逻辑
//任意插入
Doublelink *q=list_search_pos(D,pos);
if(NULL==q->next)
{
q->prio->next=NULL;
free(q);
q=NULL;
}else
{
q->prio->next=q->next;
q->next->prio=q->prio;
free(q);
q=NULL;
}
D->len--;
printf("删除成功\n");
}
//释放
/*void list_free(Doublelink *D)
{
}*/
//修改学生信息
int list_updata_value(Doublelink *D,int old,char *name,int id,int score)
{
Doublelink *p=D;
for(int i=0;ilen;i++)
{
if(p->stu.id==old)
{
strcpy(p->stu.name,name);
p->stu.id=id;
p->stu.score=score;
}
p=p->next;
}
printf("修改成功\n");
}
//查找学生信息
int list_search_value(Doublelink *D,int id)
{
int flag=0;
//判断逻辑
if(NULL==D || list_empty(D))
{
printf("查找失败\n");
return -1;
}
//查找逻辑
Doublelink *q = D->next;
for(int i=1;i<=D->len;i++)
{
if(q->stu.id== id)
{
printf("该学生是这个班的,叫%s,对应的成绩为%d\n",q->stu.name,q->stu.score);
flag=1;
}
q=q->next;
}
if(flag == 0)
{
printf("无查找结果\n");
}
return 0;
}
最后是主函数调用部分
#include
#include
#include"./doublelink.h"
int main(int argc, const char *argv[])
{
int num;
Doublelink *D = list_create();
if(NULL==D)
{
return -1;
}
//list_insert_head(D,"dss",2,99);
//list_insert_head(D,"ds",3,99);
//list_insert_head(D,"d",7,99);
while(1)
{
printf(" 学生成绩管理系统\n");
printf(" 1.学生信息输入\n");
printf(" 2.学生信息遍历\n");
printf(" 3.添加学生信息\n");
printf(" 4.删除学生信息\n");
printf(" 5.修改学生信息\n");
printf(" 6.查找学生信息\n");
printf(" 0.退出学生信息管理系统\n");
printf("请输入你需要的功能\n");
scanf("%d",&num);
switch(num)
{
case 1:
{
int n;
char name[20];
int id;
int score;
printf("请输入存放的学生个数:>>");
scanf("%d",&n);
for(int i=0;i>\n");
scanf("%s",name);
printf("请输入学号:>>\n");
scanf("%d",&id);
printf("请输入成绩:>>\n");
scanf("%d",&score);
list_insert_head(D,name,id,score);
}
break;
}
case 2:
{
list_show(D);
break;
}
case 3:
{
int n;
char name[20];
int id;
int score;
printf("请输入你想添加的位置:>>\n");
scanf("%d",&n);
printf("请输入姓名:>>\n");
scanf("%s",name);
printf("请输入学号:>>\n");
scanf("%d",&id);
printf("请输入成绩:>>\n");
scanf("%d",&score);
list_insert_pos(D,n,name,id,score);
list_show(D);
break;
}
case 4:
{
int n;
printf("请输入你要删除的学生的位置:>>\n");
scanf("%d",&n);
list_delete_pos(D,n);
break;
}
case 5:
{
int n;
char name[20];
int id;
int score;
printf("请输入要修改的学生的学号:>>");
scanf("%d",&n);
printf("请输入姓名:>>\n");
scanf("%s",name);
printf("请输入学号:>>\n");
scanf("%d",&id);
printf("请输入成绩:>>\n");
scanf("%d",&score);
list_updata_value(D,n,name,id,score);
break;
}
case 6:
{
int n;
printf("请输入要查找的学生学号:>>");
scanf("%d",&n);
list_search_value(D,n);
break;
}
case 0:
{
exit(0);
}
}
}
//调用头插函数
/* list_insert_head(D,"hfy",1,90);
list_insert_head(D,"lll",2,66);
list_insert_head(D,"dsa",3,80);
list_show(D);
//调用尾插
// list_insert_tail(D,777);
// list_show(D);
//调用任意插
list_insert_pos(D,1,"lk",5,95);
list_show(D);
//调用头删
list_delete_head(D);
list_show(D);
//调用尾删
// list_delete_tail(D);
// list_show(D);
//调用任意删
list_delete_pos(D,3);
list_show(D);
*/
return 0;
}
u