#include<stdio.h>
#include<stdlib.h>
#define OK 1
typedef int Status;
typedef struct LNode
{ int grade;
char name[20];
char sno[20];
struct LNode *next;
} LNode;
/*void InitList( LNode *L) //未初始成功
{
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;
}*/
/*LNode* InitList()//初始化 //方便理解
{
LNode *L;
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;
return L;
} */
void InitList(LNode **L)//初始化 //二级指针的使用
{
*L=(LNode *)malloc(sizeof(LNode));
(*L)->next=NULL;
}
void GreateListH(LNode *L,int n) //后插法
/*这里的L只是一个节点,而在这//个程序里并没有对L
进行改变所以,不需要把他传出来。*/
{
struct LNode *r;
r=L;
struct LNode *xin;
while(n>0)
{
xin=(LNode *)malloc(sizeof(LNode));//生成新节点
printf("请输入学生姓名\n");
scanf("%s",xin->name);//name本身是一个地址(是a[]的地址),所以不需要&
printf("请输入学生学号\n");
scanf("%s",xin->sno);
printf("请输入学生成绩\n");
scanf("%d",&xin->grade);
xin->next=NULL;
r->next=xin;
r=xin;
n--;}
printf("输入完成。\n");
}
void qianGreateListH(LNode *L,int n) //前插法
{
LNode *r;
r=L;
int i;
for(i=0;i<n;i++)
{
r=(LNode *)malloc(sizeof(LNode));
printf("请输入学生姓名\n");
scanf("%s",r->name);//name本身是一个地址(是a[]的地址),所以不需要&
printf("请输入学生学号\n");
scanf("%s",r->sno);
printf("请输入学生成绩\n");
scanf("%d",&r->grade);
r->next=L->next;
L->next=r;
}
printf("输入完成。\n");
}
int listLength(LNode *L) //获得链表长度
{
int n = 0;
LNode *p = L->next;
while (p)
{
p = p->next;
n++;
}
return n;
}
void output(LNode *L) //输出链表内所有的信息
{
LNode *xin;
xin=L;
while(xin->next)
{
xin=xin->next;
printf("姓名为%s\n",xin->name);
printf("学号为%s\n",xin->sno);
printf("成绩为%d\n",xin->grade);
}
}
int ListInsert(LNode *L,int i) //插入新节点
{
int j=0;
LNode *xin;
LNode *r;
r=L;
while(r&&(j<=i-1))
{r=r->next;
++j;
printf("%s",r->sno);
}
xin=(LNode *)malloc(sizeof(LNode));//生成新节点
printf("请输入学生姓名\n");
scanf("%s",xin->name);//name本身是一个地址(是a[]的地址),所以不需要&
printf("请输入学生学号\n");
scanf("%s",xin->sno);
printf("请输入学生成绩\n");
scanf("%d",&xin->grade);
printf("输入完成。\n");
xin->next=r->next;
r->next=xin;
return OK;
}
void LocateElem(LNode *L,char *a)//传入一个数组 根据学号查找学生信息
{LNode *p;
p=L->next;
while(strcmp(p->sno,a)!=0)
{p=p->next;
}
printf("姓名为%s\n",p->name);
printf("学号为%s\n",p->sno);
printf("成绩为%d\n",p->grade);
}
int ListDelete(LNode *L,int i)//删除学生的信息
{
LNode *p;
p=L;
LNode *q;
int j=0;
while(j<i-1)
{p=p->next;
++j;
}
if(i<0&&i>listLength(L))
return 0;
q=p->next;
p->next=q->next;
free(q);
return 1;
}
int main() {
LNode LK;
LNode *L;
char a[20];
L=&LK;
int na,n,h;
printf("请输入你要进行的操作。\n");
printf("1.初始化。\n");
printf("2.前插法创建单链表。\n");
printf("3.输出单链表里的信息。\n");
printf("4.输出链表长度。\n");
printf("5.插入学生信息。\n");
printf("6.根据学生的学号查找学生的信息。\n");
printf("7.删除学生个人信息。\n") ;
printf("8.后插法创建单链表。\n");
while(1)
{
scanf("%d",&na);
switch(na)
{
case 1:
//L=InitList();
InitList(&L);
if(L->next==NULL)
{
printf("初始化成功\n");
}
else
{
printf("初始化失败\n");
}
break;
case 2:
printf("请输入你要添加学生的个数\n");
scanf("%d",&h);
GreateListH(L,h);
break;
case 3:
output(L);
break;
case 4:
printf("总长度为%d\n",listLength(L));
break;
case 5:
printf("请输入要将信息添加到第几个的学生之后\n");
scanf("%d",&n);
if(n<=listLength(L)||n>0)
{
int f=ListInsert(L,n);
if(f==0)
{printf("插入失败。\n");}
else
printf("插入成功。\n");
}
else
printf("您选择的位置超出范围。\n");
break;
case 6:
printf("请输入您要查找学生的学号\n");
scanf("%s",a);
LocateElem(L,a);
case 7:
printf("请输入要删除第几个学生的信息。\n");
scanf("%d",&n);
if(ListDelete(L,n)==1)
{
printf("删除成功\n");
}
else
{printf("删除失败\n");
}
break;
case 8:
printf("请输入你要添加学生的个数\n");
scanf("%d",&h);
qianGreateListH(L,h);
break;
}
}}
/*void InitList( LNode *L) //未初始成功
{
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;
}*/
/*LNode* InitList()//初始化 //方便理解
{
LNode *L;
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;
return L;
} */
void InitList(LNode **L)//初始化 //二级指针的使用
{
*L=(LNode *)malloc(sizeof(LNode));
(*L)->next=NULL;
}
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。