单链表管理系统

#include
#include
#include
#include
#include
#define TRUE 1
#define FALSE 0
#define VOID void
#define NUL '\0'
typedef struct stu
{
char number[6];
char name[10];
struct stu *sz;
}S;
int d;

S * create(S *head);//新建链表函数
VOID screen(S * head) ;//显示链表函数
VOID num(S *p,S *head);//输入一个节点函数
S *del(S *head);//删除全链表函数
S *Delete(S* head);//删除链表结点函数
S * insert(S *head);//插入链表函数
VOID bq();//版权函数
VOID Esc();//Esc键退出
S *ended(S *head);//链表尾节点
S *px(S *head);//冒泡排序
S *get(S *head,char a[],int melody);//得到删除项函数
VOID said(S *m);//删除是输入学号项函数
VOID pf();//链表为空显示函数
VOID df();//链表删除显示函数
VOID tf();//添加链表显示函数

int main()
{
S *head=NULL;
S *p,*q;
int count=0;
FILE *fp; //写入文件
char a[2];
int ch;
if((fp=fopen("C:\\Users\\Administrator\\Desktop\\链表.txt","r++"))!=NULL) //如果桌面上有此文件,则打开读取它
{
while(!feof(fp))
{
p=(S*)calloc(1,sizeof(S));
count++;
if(1==count) head=p;
if(count>1) q->sz=p;
fscanf(fp,"%s%s",p->number,p->name);
q=p;
}
p->sz=NULL;
head=px(head);
system("cls");
}
else //如果桌面上没有此文件,则新建它
{
fp=fopen("C:\\Users\\Administrator\\Desktop\\链表.txt","w++");
}
while(1)
{
printf(" ~~~~~~~~~~~~~~~ 链表实现插入%c删除功能 ~~~~~~~~~~~~~~~\n\n",2);
printf(" 【1】.新建链表 【2】.链表插入 \n");
printf(" 【3】.链表删除 【4】.查看表成员 \n");
printf(" 【p】.出版人 【q】.exit\n\n");
printf(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("____选择序号____:");
gets(a);
fflush(stdin);
if(strcmp(a,"1")==0)
{
head=create(head);
}
else if(strcmp(a,"2")==0)
{
if(NULL==head) pf();
else head=insert(head);
Esc();
}
else if(strcmp(a,"3")==0)
{
if(NULL==head) pf();
printf("【a】.全部删除 【b】.查询删除 【q】.返回\n");
while((ch=getch())!=97&&ch!=98&&ch!=113);
if(97==ch) head=del(head);
else if(98==ch) head=Delete(head);
Esc();
}
else if(strcmp(a,"4")==0)
{
screen(head);
Esc();
}
else if(strcmp(a,"p")==0)
{
bq();
printf("\n\n\t ");
Esc();
}
else if(strcmp(a,"q")==0)
{
break;
}
else
{
printf("输入错误!请重新输入.....\n");
}
system("cls");
memset(a,0,sizeof(a));
d=FALSE;
}
fclose(fp);//先关闭它
fp=fopen("C:\\Users\\Administrator\\Desktop\\链表.txt","w++");//在重建它,
p=head;
while(p!=NULL)//程序最后修改后,写入文件中
{
fprintf(fp,"%s %s",p->number,p->name);
p=p->sz;
if(p!=NULL) fprintf(fp,"\n"); //防止

最后一次写入多了一个回车符
}
fclose(fp);
return 0;
}

S * create(S *head)
{
S *p,*end;
int ch;
int melody;
if(head!=NULL)
{
printf("已经存在链表!\n");
Sleep(1000);
printf("<<<<<<<<<<<>>>>>>>>>>\n");
while((ch=getch())!=27&&ch!=13);
if(27==ch)
{
melody=FALSE;
}
else if(13==ch)
{
head=del(head);
melody=TRUE;
Sleep(1000);
printf("删除完毕!\n");
}
}
if(TRUE==melody||head==NULL)
{
p=(S *)calloc(1,sizeof(S));
do
{
num(p,head);
printf("输入姓名:\n\t");
gets(p->name);
if(head==NULL) head=p;
else end->sz=p;
p->sz=NULL;
printf("<<<<<<<<<<<>>>>>>>>>>\n");
while((ch=getch())!=27&&ch!=13);
if(13==ch)
{
p=(S *)calloc(1,sizeof(S));
end=ended(head);
}
}while(ch!=27);
head=px(head);
Esc();
}
return head;
}

VOID screen(S * head) //输出链表函数
{
S *p;
int i=1;
p=head;
printf("~~~~~~~~~~~~~~~~~~~~~~~~ 成%c员 ~~~~~~~~~~~~~~~~~~~~~~~~~\n",3);
if(NULL==head) pf();
while(p!=NULL)
{
printf("\t序号%d 学号 %s ,姓名 %-10s ------------>\n",i++,p->number,p->name);
p=p->sz;
}
printf("~~~~~~~~~~~~~~~~~~~~~~~~ %c %c %c ~~~~~~~~~~~~~~~~~~~~~~~~~\n",2,3,2);
}

VOID bq()
{
system("cls");
Sleep(300);
printf("\n\n\n\n\t\t\t\t\t欢");
Sleep(3);
printf("\b\b\b\b欢 迎");
Sleep(300);
printf("\b\b\b\b\b\b欢 迎 光");
Sleep(300);
printf("\b\b\b\b\b\b\b\b欢 迎 光 临");
Sleep(300);
printf("\n\n\t\t\t\t\t 链\n");
Sleep(500);
printf("\n\n\t\t\t\t\t 表\n");
Sleep(500);
printf("\n\n\t\t\t\t\t 学\n");
Sleep(500);
printf("\n\n\t\t\t\t\t 习\n");
Sleep(300);
printf("\n\n\t\t\t M ");
Sleep(200);
printf("E ");
Sleep(200);
printf("L ");
Sleep(200);
printf("O ");
Sleep(200);
printf("Y ");
Sleep(200);
printf("社 ");
Sleep(200);
printf("区 :");
Sleep(200);
printf("QQ:");
Sleep(200);
printf("7");
Sleep(300);
printf("7");
Sleep(300);
printf("2");
Sleep(300);
printf("4");
Sleep(300);
printf("2");
Sleep(300);
printf("1");
Sleep(300);
printf("1");
Sleep(300);
printf("3");
Sleep(300);
printf("9");
Sleep(1000);
}

VOID Esc()
{
int ch;
printf("\t <<<<<<<<<<<<[Esc].返回>>>>>>>>>>>>\n");
while((ch=getch())!=27);
}

S *ended(S *head)
{
while(head->sz!=NULL)
{
head=head->sz;
}
return head;
}

VOID num(S *p,S *head)
{
char a[6],b[4];
S *q;
int i,x,y,melody;
while(1)
{
memset(a,0,sizeof(a));//必须用sizeof,不能用strlen
memset(b,0,sizeof(b));
melody=TRUE;
printf("输入学号:(马甲格式:NO.01/No.01/nO.01/no.01)\n");
printf("\t");
gets(a);
for(i=0;i<3;i++)
{
b[i]=a[i];
}
b[i]=NUL;
if(strcmp(b,"NO.")==0||strcmp(b,"No.")==0||strcmp(b,"nO.")==0||strcmp(b,"no.")==0); //实现马甲格式
else continue;
x=

a[3]-'0';
y=a[4]-'0';
if((x>=0&&x<=9)&&(y>=0&&y<=9)&&a[5]==NUL&&strcmp(a+3,"00")!=0) //实现学号的后两位必须为数字且不能出现”00“
{
a[0]='N';
a[1]='O';
a[2]='.';
}
else continue;
if(head!=NULL) //当链表不为空时
{
q=head;
for(;q!=NULL;q=q->sz)
{
if(strcmp(q->number,a)==0) //查看是否有重复的学号
{
printf("出现重复项( %s )!!!重新输入\n",a);
melody=FALSE;
break;
}
}
if(TRUE==melody) //如果不重复则执行
{
strcpy(p->number,a);
break;
}
}
else //链表为空时直接执行
{
strcpy(p->number,a);
break;
}
}
}

S *px(S *head)
{
S *p,*q,*m;
int i,j;
int count=0;
int k=1,n=1;
int melody;
p=head;
while(p!=NULL) //得到链表结点个数
{
p=p->sz;
count++;
}
for(i=0;i{
screen(head);
printf("第%d次 '外'循环\n",i+1);
p=head;
for(j=0;j{
printf("第%d次'内'循环\n",j+1);
if(TRUE==melody) p=p->sz; //没有进入条件语句且p!=head时执行此句
q=p->sz;
if(strcmp(p->number,q->number)>0) //按从小到大排序
{
printf("第%d次进入条件语句\n",k++);
printf("起初p->number=%s\n",p->number);
if(p!=head) //当p!=head时需要考虑前一项的结点
{
m->sz=q;
p->sz=q->sz;
q->sz=p;
printf("p!=head时:第%d次进入,p->number=%s\n",n++,p->number);
m=q; //每执行一次必须去确定前一项,因为链表排序后前一项是以前的下一项
}
else
{
p->sz=q->sz; //当p==head时执行此语句,因为不用考虑前一项
q->sz=p;
head=q;
printf("p=head时:进入,p->number=%s\n",p->number);
m=q;
}
melody=FALSE; //这是为了区别如果链表排序后,p就是下一项,所以不用再p=p->sz;
}
else
{
melody=TRUE; //如果没有进行排序则p=p->sz
m=p; //前一项为现在的p,因为下一次的p是下一项
}
}
}
return head;
}

S * insert(S *head)
{
S *p,*end;
screen(head);
p=(S *)malloc(sizeof(S));
num(p,head);
printf("输入姓名:\n");
printf("__->__:");
gets(p->name);
p->sz=NULL;
end=ended(head);
end->sz=p;
head=px(head);
tf();
return head;
}

S *Delete(S *head)
{
char x;
char name[10];
S *m;
int melody,fuck=FALSE;
screen(head);
printf(" [1].按学号查找 [2].按姓名查找\n");
while(1)
{
printf("__->__");
switch(scanf("%c",&x),x)
{
fflush(stdin);
case '1':
m=(S*)malloc(sizeof(S));
printf("输入要删除的学号------>\n");
printf("_____");
fflush(stdin);
said(m);
melody=FALSE;
head=get(head,m->number,melody);
free(m);
fuck=TRUE;
break;
case '2':
printf("输入姓名:\n");
prin

tf("_____");
fflush(stdin);
gets(name);
melody=TRUE;
head=get(head,name,melody);
fuck=TRUE;
break;
default :
fuck=FALSE;
printf("输入错误,请重新输入!\n");
break;
}
if(TRUE==fuck)
{
Sleep(200);
if(TRUE!=d) df();
break;
}
}
return head;
}

S *del(S *head)
{
S *q;
while(head!=NULL)
{
q=head;
head=head->sz;
free(q);
}
df();
return head;
}

S *get(S *head,char a[],int melody)
{
S *p=head,*q;
int fuck;
q=p;
if(p==NULL)
{
printf("链表为空.......\a\n");
return head;
}
while(p!=NULL)
{
fuck=FALSE;
if(strcmp(p->name,a)==0&&TRUE==melody)
{
fuck=TRUE;
break;
}
if(strcmp(p->number,a)==0&&FALSE==melody)
{
fuck=TRUE;
break;
}
q=p;
p=p->sz;
}
if(TRUE==fuck&&p==head)
{
head=head->sz;
free(p);
}
else if(TRUE==fuck&&p!=head)
{
q->sz=p->sz;
free(p);
}
else {
d=TRUE;
printf(" \a查无此项!\n");
}
return head;
}

VOID said(S *m)
{
char a[6],b[4];
int i,x,y,melody;
while(1)
{
memset(a,0,sizeof(a));//必须用sizeof,不能用strlen
memset(b,0,sizeof(b));
melody=TRUE;
printf("输入学号:(马甲格式:NO.01/No.01/nO.01/no.01)\n");
printf("\t");
gets(a);
for(i=0;i<3;i++)
{
b[i]=a[i];
}
b[i]=NUL;
if(strcmp(b,"NO.")==0||strcmp(b,"No.")==0||strcmp(b,"nO.")==0||strcmp(b,"no.")==0); //实现马甲格式
else continue;
x=a[3]-'0';
y=a[4]-'0';
if((x>=0&&x<=9)&&(y>=0&&y<=9)&&a[5]==NUL&&strcmp(a+3,"00")!=0) //实现学号的后两位必须为数字且不能出现”00“
{
a[0]='N';
a[1]='O';
a[2]='.';
}
else continue;
strcpy(m->number,a);
break;
}
}

VOID pf()
{
printf("\t\t\t链");
Sleep(200);
printf("表");
Sleep(200);
printf("为");
Sleep(200);
printf("空");
Sleep(200);
printf("!\n");
Sleep(200);
}

VOID df()
{
printf("\t\t\t删");
Sleep(200);
printf("除");
Sleep(200);
printf("成");
Sleep(200);
printf("功");
Sleep(200);
printf("!\n");
Sleep(200);
}

VOID tf()
{
printf("\t\t\t添");
Sleep(200);
printf("加");
Sleep(200);
printf("成");
Sleep(200);
printf("功");
Sleep(200);
printf("!\n");
Sleep(200);
}

相关文档
最新文档