//也许稚嫩,但也很高兴完成了,这是一次课程设计
#include<stdio.h>
#include<stdlib.h>#include<string.h>
typedef struct student
{
char num[15],name[15],addr[15],tel[15];
struct student*next;
}ss;//节点
int n;//长度
ss*creat()
{
ss*head,*p,*s;
n=0;
if((s=(ss*)malloc(sizeof(ss)))==NULL)
{
printf("不能分配空间!");
exit(0);
}
scanf("%s%s%s%s",s->num,s->name,s->addr,s->tel);
while(s->num[0]!='#')
{
n++;
if(n==1)
head=s;
else p->next=s;
p=s;
if((s=(ss*)malloc(sizeof(ss)))==NULL)
{
printf("不能分配空间!");
exit(0);
}
scanf("%s",s->num);
if(s->num[0]=='#')
break;
scanf("%s%s%s",s->name,s->addr,s->tel);
}
p->next=NULL;
printf("***创建成功!***\n");
return (head);
}//创建
void print(ss*head)
{
ss*p;
p=head;
if(head!=NULL)
{
printf("学号 姓名 地址 电话\n");
while(p!=NULL)
{
printf("%-15s%-15s%-15s%-15s\n",p->num,p->name,p->addr,p->tel);
p=p->next;
}
}
else printf("***链表为空!请您先创建!***\n");
}//显示
void search(ss*head)
{
ss*p;
int i=0;
char m[15];
p=head;
if(head!=NULL)
{
printf("请输入要检索的学生学号或姓名或地址或电话:\n");
scanf("%s",m);
while(p!=NULL)
{
if(strcmp(p->num,m)==0||strcmp(p->name,m)==0||strcmp(p->addr,m)==0||strcmp(p->tel,m)==0)
{
printf("学号 姓名 地址 电话\n");
printf("%-15s%-15s%-15s%-15s\n",p->num,p->name,p->addr,p->tel);
i++;
}
p=p->next;
}
if(i==0)
printf("***查无此人!***\n");
}
else printf("***链表为空!请您先创建!***\n");
}//检索
ss*omit(ss*head)
{
int i=0;
ss*p,*s;
char m[15];
s=p=head;
if(head!=NULL)
{
printf("请输入要删除的学生学号:\n");
scanf("%s",m);
while(strcmp(p->num,m)!=0&&p->next!=NULL)
{
s=p;
p=p->next;
}
if(strcmp(p->num,m)==0)
{
if(p==head)
head=p->next;
else
s->next=p->next;
free(p);
i++;
n--;
}
if(i>0)
printf("***删除成功!***\n");
if(i==0)
printf("***查无此人!***\n");
}
else printf("***链表为空!请您先创建!***\n");
return(head);
}//删除
ss*insert(ss*head)
{
ss*p,*s,*t;
int i=1,c;
p=head;
printf("请输入要插入的学生位置:\n");
scanf("%d",&c);
printf("请输入要插入的学生信息:\n");
if((t=(ss*)malloc(sizeof(ss)))==NULL)
{
printf("不能分配空间!");
exit(0);
}
scanf("%s%s%s%s",t->num,t->name,t->addr,t->tel);
if(head==NULL)
{
head=t;
t->next=NULL;
}
else
{
while((i!=c)&&(p!=NULL))
{
s=p;
p=p->next;
i++;
}
if(p==head)
{
head=t;
head->next=p;
}
else if((i==c)||(p==NULL))
{
s->next=t;
t->next=p;
}
}
n++;
printf("***插入成功!***\n");
return(head);
}//插入
void save(ss*head)
{
FILE*fp;
ss*p;
p=head;
if((fp=fopen("F:\\单链表.txt","w"))==NULL)
{
printf("error");
exit(0);
}
if(p!=NULL)
{
fputs("学号 姓名 地址 电话\n",fp);
while(p!=NULL)
{
fprintf(fp,"%-20s%-20s%-20s%-20s\n",p->num,p->name,p->addr,p->tel);
p=p->next;
}
printf("保存成功!在“F:单链表”中! \n");
}
else printf("***链表为空!请您先创建!***\n");
fclose(fp);
}//保存
ss*sort(ss*head)
{
ss*p,*t,*s,*q;
if((s=(ss*)malloc(sizeof(ss)))==NULL)
{
printf("不能分配空间!");
exit(0);
}
if((t=(ss*)malloc(sizeof(ss)))==NULL)
{
printf("不能分配空间!");
exit(0);
}
if((q=(ss*)malloc(sizeof(ss)))==NULL)
{
printf("不能分配空间!");
exit(0);
}
s=p=head;
if(p!=NULL)
{
if(p->next==NULL)
{
printf("***按学号递增排序成功!***\n");
}
else
{
for(q=head;q->next!=NULL;q=q->next)
for(p=head;p->next!=NULL;p=p->next)
{
if(strcmp(p->num,p->next->num)>0)
{
strcpy(t->num,p->num);strcpy(t->name,p->name);strcpy(t->addr,p->addr);strcpy(t->tel,p->tel);
strcpy(p->num,p->next->num);strcpy(p->name,p->next->name);strcpy(p->addr,p->next->addr);strcpy(p->tel,p->next->tel);
strcpy(p->next->num,t->num);strcpy(p->next->name,t->name);strcpy(p->next->addr,t->addr);strcpy(p->next->tel,t->tel);
}
}
printf("***递增排序成功!***\n");
}
}
else printf("***链表为空!请您先创建!***\n");
return(head);
}//递增排序
void edit(ss*head)
{
ss*p;
char m[15];
p=head;
if(p!=NULL)
{
printf("请输入要编辑的学生学号:\n");
scanf("%s",m);
for(;p!=NULL;p=p->next)
{
if(strcmp(p->num,m)==0)
{
printf("请输入要编辑的学生信息:\n");
scanf("%s%s%s%s",p->num,p->name,p->addr,p->tel);
printf("***编辑成功!***\n");
break;
}
}
}
if(p==NULL)
printf("***查无此人!***\n");
else
printf("***链表为空!请您先创建!***\n");
return(head);
}//编辑
main()
{
ss*head;
int a;
head=NULL;
printf("菜单:\n****1:创建 2:显示 3:检索 4:删除 5:插入 6:人数 7:保存 8:排序 9:编辑 0:退出****\n");
printf("请输入您的选择:\n");
while(1)
{
scanf("%d",&a);
switch(a)
{
case 1:
printf("输入格式:学号 姓名 地址 电话 (按#键结束输入!)\n");
head=creat();break;
case 2:
print(head);break;
case 0:
return;break;
case 3:
search(head);break;
case 4:
head=omit(head);break;
case 5:
head=insert(head);break;
case 6:
printf("********目前共有%d人********\n",n);break;
case 7:
save(head);break;
case 8:
head=sort(head);break;
case 9:
edit(head);break;
default:
printf("输入错误!重新输入!\n");
}
}
}