c语言实现链表
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxsize 10
typedef struct {
char no[20];
char name[20];
int price;
}Student;
typedef struct node{
Student Data;
struct node *Next;
int length=0;
}LNode,*LinkList;
int tableflag=0;
LinkList initList()
{
LinkList L,p;
int size,i;
printf("请输入学生个数,不能超过%d个:\n",maxsize);
scanf("%d",&size);
p=L= (LinkList)malloc(sizeof(node));
if(size>maxsize||size<=0)
{
printf("超出限制大小,请重新建表");
exit(0);
}
else
{
for(i=1;i<=size;i++)
{
LinkList Lnext= (LinkList )malloc(sizeof(node));
printf("请输入第%d名学生学号",i);
scanf("%s",&Lnext->Data.no);
printf("请输入第%d名学生姓名",i);
scanf("%s",&Lnext->Data.name);
printf("请输入第%d名学生成绩",i);
scanf("%d",&Lnext->Data.price);
p->Next=Lnext;
p=Lnext;
}
L->length=size;
p->Next=NULL;
tableflag=1;
return L;
}
}
void search_name(LinkList L,char *Name)
{
LinkList p=L;
int i;
int flag=0;
p=p->Next;
for(i=0;i<L->length;i++)
{
if(strcmp(p->Data.name,Name)==0)
{
printf("该学生学号为%s ",p->Data.no);
printf("该学生成绩为%d\n",p->Data.price);
flag=1;
}
p=p->Next;
}
if(flag==0) printf("查无此人\n") ;
}
void search_num(LinkList L,int num)
{
LinkList p=L;
int i;
int flag=0;
p=p->Next;
for(i=0;i<L->length;i++)
{
if(num==i+1)
{
printf("该学生学号为%s ",p->Data.no);
printf("该学生姓名为%s ",p->Data.name);
printf("该学生成绩为%d\n",p->Data.price);
flag=1;
}
p=p->Next;
}
if(flag==0) printf("查无此人\n") ;
}
LinkList insert(LinkList L,int loc)
{
LinkList p=L;
if(L->length>maxsize)
{
printf("超出限制大小,请重新建表");
exit(0);
}
for(int j=1;j<loc;j++)
{
p=p->Next;
}
LinkList Lnext= (LinkList )malloc(sizeof(node));
printf("请输入第插入学生学号");
scanf("%s",&Lnext->Data.no);
printf("请输入第插入学生姓名");
scanf("%s",&Lnext->Data.name);
printf("请输入第插入学生成绩");
scanf("%d",& Lnext->Data.price);
if(loc==L->length+1)
{
p->Next=Lnext;
}
else
{
Lnext->Next=p->Next;
p->Next=Lnext;
}
L->length++;
printf("插入成功\n");
return L;
}
LinkList del(LinkList L,int loc)
{
LinkList p=L;
LinkList q=L;
for(int j=1;j<loc;j++)
{
p=p->Next;
}
q=p->Next;
printf("删除学生的学号为%s",q->Data.no);
printf("删除学生的姓名为%s",q->Data.name);
printf("删除学生的成绩为%d\n",q->Data.price);
p->Next=p->Next->Next;
free(q);
L->length--;
printf("删除成功\n");
return L;
}
void Traver(LinkList L)
{
int i=0;
LinkList p=L;
p=p->Next;
printf("学生信息陈列如下,请检查核对\n");
while(p!=NULL)
{
printf("%d:",i+1);
printf("%s ",p->Data.no);
printf("%s ",p->Data.name);
printf("%d\n",p->Data.price);
p=p->Next;
i++;
}
printf("共有%d个学生\n",L->length);
}
int main()
{
LinkList L;
int e=9;
int loc=-1;
int num;
int i;
char Name[20];
while(e!=0)
{
printf("***************************************************************************\n");
printf("请输入要进行的操作,0表示结束退出操作:\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");
printf("***************************************************************************\n");
scanf("%d",&e);
switch(e)
{
case 0: printf("退出操作:\n");break;
case 1:
{
if ( tableflag==1)
{
printf("你已经建了一个表了,请将数据导入文件后重启程序建新表\n");
break;
}
L=initList();
break;
}
case 2:
{
if ( tableflag==0)
{
printf("你还没有建表\n");
break;
}
printf("请输入学生名字:");
while(getchar()!='\n');
gets(Name);
search_name( L,Name);
break;
}
case 3:
{
if ( tableflag==0)
{
printf("你还没有建表\n");
break;
}
printf("请输入学生位置:");
scanf("%d",&num);
search_num( L, num);
break;
}
case 4:
{
if ( tableflag==0)
{
printf("你还没有建表\n");
break;
}
printf("请输入插入位置:");
scanf("%d",&loc);
if(loc<=0&&loc>L->length) printf("输入位置错误\n");
else
{
L=insert(L, loc);
}
break;
}
case 5:
{
if ( tableflag==0)
{
printf("你还没有建表\n");
break;
}
printf("请输入删除位置:");
scanf("%d",&loc);
if(loc<=0&&loc>L->length) printf("输入位置错误\n");
else
{
L=del(L, loc);
}
break;
}
case 6:
{
if ( tableflag==0)
{
printf("你还没有建表\n");
break;
}
Traver(L);
break;
}
case 7:
{
LinkList p=L->Next;
if (tableflag==0)
{
printf("你还没有建表\n");
break;
}
char acc[20];
FILE *fp;
printf("请输入存储路径\n");
scanf("%s",&acc);
if((fp=fopen(acc,"w"))==NULL)
{
printf("打开文件失败\n");
break;
}
printf("打开文件成功\n");
fprintf(fp,"%d\n",L->length);
for(i=0;i<L->length;i++)
{
fprintf(fp,"%s\n",p->Data.no);
fprintf(fp,"%s\n",p->Data.name);
fprintf(fp,"%d\n",p->Data.price);
p=p->Next;
}
rewind(fp);
fclose(fp);
break;
}
case 8:
{
char ne[1];
char acc[20];
if ( tableflag==1)
{
printf("你已经建了一个表了,请将数据导入文件后重启程序建新表\n");
break;
}
FILE *fp;
printf("请输入打开路径\n");
scanf("%s",&acc);
LinkList p=(LinkList )malloc(sizeof(node));
if((fp=fopen(acc,"r"))==NULL)
{
printf("打开文件失败\n");
break;
}
printf("打开文件成功");
fscanf(fp,"%d",&p->length);
fgets(ne,0,fp);
L=p;
for(i=0;i<p->length;i++)
{
LinkList Lnext=(LinkList )malloc(sizeof(node));
fscanf(fp,"%s",&Lnext->Data.no);
fgets(ne,0,fp);
fscanf(fp,"%s",&Lnext->Data.name);
fgets(ne,0,fp);
fscanf(fp,"%d",&Lnext->Data.price);
L->Next=Lnext;
L=Lnext;
Lnext->Next=NULL;
}
L=p;
rewind(fp);
fclose(fp);
tableflag=1;
p=p->Next;
printf("学生信息陈列如下,请检查核对\n");
while(p!=NULL)
{
printf("%d:",i+1);
printf("%s ",p->Data.no);
printf("%s ",p->Data.name);
printf("%d\n",p->Data.price);
p=p->Next;
i++;
}
printf("共有%d个学生\n",L->length);
break;
}
default:printf("输入出错,请重新尝试\n");
}
}
}