#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
typedef struct
{
char num[4];
char name[8];
int score[3];
}ElemType;
typedef struct Linknode
{
ElemType elem;
struct Linknode *next;
} Linknode,*LinkList;
LinkList InitLinkList(int n) //1建立n个节点的链表
{
LinkList L,S;
int i;
L=(LinkList)malloc(sizeof(Linknode));
L->next=NULL;
printf("请输入%d个学生数据",n);
for(i=0;i<n;i++)
{
S=(LinkList)malloc(sizeof(Linknode)); //生成存放数据的节点
printf("\n学号 姓名 成绩1 成绩2 成绩3\n");//读入新节点的数据域
scanf("%s %s %d %d %d",S->elem.num,S->elem.name,&S->elem.score[0],&S->elem.score[1],&S->elem.score[2]) ;
S->next=L->next; //将新节点的指针域存放头结点的指针域
L->next=S; //前插法插入新节点
}
printf("%d个节点加入完成!",n);
return L;
}
int LengthLinkList(LinkList head) //求链表长度函数
{
LinkList p=head ? head->next : NULL;
int j = 0;
while (p)
{
p= p->next;
j++;
}
return j;
}
int InsLinkList(LinkList head,int i) //2插入学生记录
{
int j=0;
LinkList p=head,S;
while(p->next&&j<i-1)//查找i的前驱节点指针p
{
p=p->next;
j++;
}
if (j==i-1)
{
S=(LinkList)malloc(sizeof(Linknode)); //生成新节点
printf("\n学号 姓名 成绩1 成绩2 成绩3\n");//读入新节点的数据域
scanf("%s %s %d %d %d",S->elem.num,S->elem.name,&S->elem.score[0],&S->elem.score[1],&S->elem.score[2]) ;
S->next=p->next; //将新节点的指针域存放头结点的指针域
p->next=S;
printf("插入元素成功!");
}
else
{
printf("位置出错,插入元素失败!");
return 0;
}
return 1;
}
LinkList LocateLinkList(LinkList head)//查找学生记录
{
LinkList p=head ? head->next : NULL;
char num[4], name[8];
int xz;
printf("\n\t 选择查找项 ");
printf("\n\t***************************\n");
printf("\t 1、按学号查询 \n");
printf("\t 2、按姓名查询 \n");
printf("\t***************************\n");
printf("\t请选择");
scanf("%d",&xz);
if(xz==1)
{
printf("请输入要查找的学生的学号:");
scanf("%s",num);
while(p && strcmp(p->elem.num,num)!=0)
p=p->next;
}
else if(xz==2)
{
printf("请输入要查找的学生的姓名:");
scanf("%s",name);
while(p && strcmp(p->elem.name,name))
p=p->next;
}
return p;
}
void DelLinkList(LinkList head)
{
LinkList p, q;
printf("请先查找你想删除的学生信息:\n");
p = LocateLinkList (head);
if(!p)
{
printf("没有查找到你想删除的学生信息");
return;
}
q =head;
while(q&& q -> next!=p) q=q->next;
q->next = p->next;
free (p);
printf("该学生信息已被删除!\n");
}
void OutputLinkList(LinkList head)//输出链表元素
{
LinkList p=head ? head->next : NULL;
printf("\n学号 姓名 成绩1 成绩2 成绩3\n");
printf("---------------------------------------------------\n");
while(p)
{
printf("%5s%10s%6d%6d%6d\n",p->elem.num,p->elem.name,p->elem.score[0],p->elem.score[1],p->elem.score[2]);
printf("---------------------------------------------------\n");
p=p->next;
}
}
DestroyLinkList(LinkList *head)
{
LinkList p;
while (*head)
{
p=*head;
(*head)=(*head)->next;
free(p);
}
}
int main(){
printf(" ******校园成绩查询管理系统******\n");
printf(" ******2011603041067 孔德露******\n");
LinkList head=NULL,p;
int choose=1,i,n,t=1,c;
while(choose){
printf("**********请输入您想进行的操作***********\n");
printf("key 1:建立学生链表 key 2:插入学生信息\n");
printf("key 3:查找学生信息 key 4:删除学生信息\n");
printf("key 5:打印学生信息 key 6:销毁学生信息\n");
printf("*****************************************\n");
scanf("%d",&choose);
switch(choose){
case 1:
printf("请输入要建立的线性表的长度:");
scanf("%d",&n);
head=InitLinkList(n);
printf("建立后的线性表为:\n");
OutputLinkList(head);
break;
case 2:
printf("请输入要插入的元素的位置:");
scanf("%d",&i);
//getchar();
if(InsLinkList(head, i) ){
printf("插入元素后的线性表为:\n");
OutputLinkList(head);
}
break;
case 3:
if(p=LocateLinkList(head)){
printf("\n查找记录如下:\n学号 姓名 成绩1 成绩2 成绩3 平均值\n");
printf("%5s%10s%6d%6d%6d\n",p->elem.num,p->elem.name,p->elem.score[0],p->elem.score[1],p->elem.score[2]);
}
else
printf("\n查找失败!\n");
break;
case 4:
DelLinkList(head);
printf("\n当前线性表为");
OutputLinkList(head);
break;
case 5:
printf("线性表的数据元素如下:");
OutputLinkList(head);
break;
case 6:
DestroyLinkList(&head);
break;
defult:
printf("输入有误,请重新输入!");
scanf("%d",&choose);
break;
}
}
}
数据结构(链表)
最新推荐文章于 2023-05-20 21:16:34 发布