说明:c语言的一个收尾之作,对链表的处理包括插入,排序(冒泡排序),删除,编辑,本应该早就写的这个因种种原因拖到现在才写完
ps:这个收尾不包括文件处理二级指针以及行指针,学习c不会停;
#include<stdio.h>
#include<string.h>
#define NULLL 0
typedef struct lb
{
char name[20],number[20];
struct lb *next;
}LB;
void in(LB* head);
char begin();
void delete(LB* head);
void lookfor(LB* head);
void sort(LB* head);
void edit(LB* head);
LB* inend,lookforend;
main()
{
char judge;
printf("*******************************************\n");
printf("* *\n");
printf("* 这是一个链表处理程序 *\n");
printf("* *\n");
printf("*******************************************\n");
LB head={"name","number",NULL};
head.next=(LB *)malloc(sizeof(LB));
inend=head.next;
printf("******链表初始化请输入第一个数据元素*******\n");
printf("格式如number name\n");
scanf("%s %s",inend->number,inend->name);//初始化建立一个链表头,和链表指针方便插入
while(1)
{
judge=begin();
if(judge<'1'||judge>'5')
printf("********该功能数字无效请重新输入****\n\n");
switch (judge)
{
case '1':in(head.next);break;
case '2':delete(&head);break;
case '3':sort(&head);break;
case '4':lookfor(&head);break;
case '5':edit(head.next);break;
}
}
}
char begin()
{
printf("******************主菜单*******************\n");
printf("1.插入数据元素 2.删除数据元素 *\n");
printf("3.排序数据元素 4.查看已有全部元素 *\n");
printf("5.修改已存在的数据元素 *\n");
printf("******输入对应的功能数字进行相关操作*******\n");
char r;
fflush(stdin);
scanf("%c",&r);
return r;
}
void in(LB *head)
{//输入一个新的数据元素默认放在链表底端
char judge='y';
LB * temporary;
while(judge=='y'||judge=='Y')
{
temporary=(LB *)malloc(sizeof(LB));
inend->next=temporary;
inend=temporary;
printf("***********请输入想要添加的数据元素********\n");
scanf("%s %s",temporary->number,temporary->name);
printf("*******是否想要继续添加其他的数据元素******\n");
printf("*******是(y\\Y)\\否(任意键并退回主菜单)******\n");
fflush(stdin);
scanf("%c",&judge);
}
inend->next=NULL;
}
void delete(LB *head)
{//删除功能函数:选择查找的方式,找到要删除的结点并释放该结点的空间,以保证流畅
int judgedelete=0;
char wantdelete[20];
LB *p=0,*deletep=head;
char judge='0',judge1;
while(1)
{
judgedelete=1;
printf("**************进入删除操作菜单*************\n");
printf("1.通过number删除 2.通过name删除 *\n");
printf("3.退出删除返回主菜单 *\n");
printf("*******************************************\n");
fflush(stdin);
scanf("%c",&judge);//根据输入的名字还是编号进行删除
if(judge=='3') break;
rein:;
switch(judge)
{
case '1':
{
judgedelete=0;
p=head;
printf("*******请输入想要删除数据元素的number******\n");
char deletenumber[20];
fflush(stdin);
scanf("%s",deletenumber);
while(p)
{
if(strcmp(p->number,deletenumber)==0)
{
judgedelete++;
if(p->next==0)
{
free(p);
deletep->next=NULL;
inend=deletep;
}
else
{
deletep->next=p->next;
free(p);
p=deletep;
}
}
if(judgedelete==0)
deletep=p;
p=p->next;
}break;
}
case '2':
{
judgedelete=0;
p=head;
printf("*******请输入想要删除数据元素的name********\n");
char deletename[20];
fflush(stdin);
scanf("%s",deletename);
while(p)
{
if(strcmp(p->name,deletename)==0)
{
judgedelete++;
if(p->next==0)
{
free(p);
deletep->next=NULL;
inend=deletep;
}
else
{
deletep->next=p->next;
free(p);
p=deletep;
}
}
if(judgedelete==0)
deletep=p;
p=p->next;
}
}break;
default :
printf("*****输入的删除功能编号有误请重新输入******\n");break;
}
if(judgedelete==0)
{
printf("*******未找到输入的信息,是(y\\Y)否重新输入****\n");
fflush(stdin);
if((judge1=getchar())=='y'||judge1=='Y')
goto rein;
}
else if(judge=='1'||judge=='2')
printf("**********删除成功返回删除主菜单***********\n");
}
}
void sort(LB *head)
{//可以选择排序方式,采用冒泡排序的方法对链表进行排序
char sortjudge;
LB* p=head->next,*sort1=p;
LB temporary,* t1,* t2,* endsort,* endsortjudge=inend;
printf("* 1.通过number排序 2.通过name排序 *\n");
fflush(stdin);
scanf("%c",&sortjudge);
switch(sortjudge)
{
case '1':
{
for(p=head->next;p;p=p->next)
{
endsort=endsortjudge;
for(sort1=head->next;sort1!=endsort;sort1=sort1->next)
if(strcmp(sort1->number,sort1->next->number)>0)
{
t1=sort1->next;
t2=sort1->next->next;
temporary=*sort1;
*sort1=*(sort1->next);
sort1->next=t1;
*(sort1->next)=temporary;
sort1->next->next=t2;
}
endsortjudge=sort1;
}
printf("******************排序成功*****************\n");
}break;
case '2':
{
for(p=head->next;p;p=p->next)
{
endsort=endsortjudge;
for(sort1=head->next;sort1!=endsort;sort1=sort1->next)
if(strcmp(sort1->name,sort1->next->name)>0)
{
t1=sort1->next;
t2=sort1->next->next;
temporary=*sort1;
*sort1=*(sort1->next);
sort1->next=t1;
*(sort1->next)=temporary;
sort1->next->next=t2;
}
endsortjudge=sort1;
}
printf("******************排序成功*****************\n");
}break;
default:
printf("********输入的排序方式有误是否重新输入*****\n");
printf("******如果是请输入y/Y否的话请输入任意******\n");
fflush(stdin);
if((sortjudge=getchar())=='y'||sortjudge=='Y')
sort(head);
}
}
void edit(LB *head)
{
char nameedit[20],numberedit[20],judge1;
int judgegn=0;
LB * headp=head;
printf("1.通过number查找编辑 *\n2.通过name查找编辑 *\n");
fflush(stdin);
scanf("%d",&judgegn);
if(judgegn!=1&&judgegn!=2)
{
printf("***输入的查找方式有误是(Y)否(n)重新输入***\n");
fflush(stdin);
scanf("%d",&judgegn);
if(judgegn=='y'||judgegn=='Y')
edit(head);
}
else
{
switch(judgegn)
{
case 1:
{
printf("*********请输入想要查找的number************\n");
fflush(stdin);
scanf("%s",numberedit);
while(headp)
{
if(strcmp(numberedit,headp->number)==0)
{
printf("***********已找到相应的数据元素************\n");
printf("****是(y/Y)否(输入任意)更改对应的number****\n");
fflush(stdin);
scanf("%c",&judge1);
if(judge1=='Y'||judge1=='y')
{
printf("***********请输入更改后的number************\n");
fflush(stdin);
scanf("%s",numberedit);
strcpy(headp->number,numberedit);
}
printf("*****是(y/Y)否(输入任意)更改对应的name*****\n");
fflush(stdin);
scanf("%c",&judge1);
if(judge1=='Y'||judge1=='y')
{
printf("************请输入更改后的name*************\n");
fflush(stdin);
scanf("%s",nameedit);
strcpy(headp->name,nameedit);
}
}
headp=headp->next;
if(headp==0&&!judge1)
{
printf("没有找到想要删除的数据是(y/Y)否(任意)重新输入\n");
fflush(stdin);
judgegn=getchar();
if(judgegn=='y'||judgegn=='Y')
{
printf("********请重新输入想要修改的number*********\n");
fflush(stdin);
scanf("%s",numberedit);
headp=head;
}
}
}
}break;
case 2:
{
printf("**********请输入想要查找的name*************\n");
fflush(stdin);
scanf("%s",nameedit);
while(headp)
{
if(strcmp(nameedit,headp->name)==0)
{
printf("***********已找到相应的数据元素************\n");
printf("****是(y/Y)否(输入任意)更改对应的number****\n");
fflush(stdin);
scanf("%c",&judge1);
if(judge1=='Y'||judge1=='y')
{
printf("***********请输入更改后的number************\n");
fflush(stdin);
scanf("%s",numberedit);
strcpy(headp->number,numberedit);
}
printf("*****是(y/Y)否(输入任意)更改对应的name*****\n");
fflush(stdin);
scanf("%c",&judge1);
if(judge1=='Y'||judge1=='y')
{
printf("************请输入更改后的name*************\n");
fflush(stdin);
scanf("%s",nameedit);
strcpy(headp->name,nameedit);
}
}
headp=headp->next;
if(headp==0&&!judge1)
{
printf("没有找到想要删除的数据是(y/Y)否(任意)重新输入\n");
fflush(stdin);
judgegn=getchar();
if(judgegn=='y'||judgegn=='Y')
{
printf("*********请重新输入想要修改的name**********\n");
fflush(stdin);
scanf("%s",nameedit);
headp=head;
}
}
}
}break;
}
}
}
void lookfor(LB* head)
{
LB* check=head;
printf("******************************************\n");
while(check)
{
printf("%-20s %s\n",check->number,check->name);
check=check->next;
}
printf("******************************************\n");
}
写完这些之后发现注释不足容易让人无法理解,等待后期改正这段代码