📄 list.c
字号:
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct node{
int data;
struct node *next;
}node;
typedef node *linklist;
node *create1(void) /*尾插法创建单链表*/
{node *head,*q,*p;
int x;
head=(node *)malloc(sizeof(node));
head->next=NULL;
q=head;
scanf("%d",&x);
while(x)
{p=(node *)malloc(sizeof(node));
p->data=x;
q->next=p;
q=p;
scanf("%d",&x);
}
q->next=NULL;
return head;
}
node *create2(void) /*头插法创建单链表*/
{node *head,*r,*s;
int x;
head=(node *)malloc(sizeof(node));
head->next=NULL;
r=head;
scanf("%d",&x);
while(x)
{s=(node *)malloc(sizeof(node));
s->data=x;
s->next=r->next;
r->next=s;
scanf("%d",&x);
}
return head;
}
void enter(void)
{char *p="cls";
system(p);
printf("\n\n\n\t\t\t 欢迎进入本系统\n\n");
printf("\n\t\t 本系统用于单链表的综合操作\n\n");
}
void homepage(void)
{int i;
char *p="cls";
system(p);
printf(" ");
for(i=0;i<60;i++)
printf("=");
printf("\n");
printf(" ------------------欢迎使用本软件--------------------\n");
printf(" --------------------版本:NEW:1.0--------------------\n");
printf(" ");
for(i=0;i<60;i++)
printf("=");
printf("\n\n\n");
printf(" 本软件的功能包括:\n\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(" 9.用循环单链表实现约瑟夫环;\n");
printf(" 10.退出系统;\n");
printf(" 11.返回主界面;\n\n");
printf(" 请选择:\n");
}
/*建立循环单链表*/
node *create3(int num)
{node *head,*p,*r;
int i;
head=(node *)malloc(sizeof(node));
head->next=NULL;
r=head;
for(i=1;i<=num;i++)
{p=(node *)malloc(sizeof(node));
p->data=i;
r->next=p;
r=p;
}
r->next=head->next;
return head;
}
void print(node *head) /*输出一般链表的结点*/
{node *p;
p=head->next;
while(p)
{printf("%6d",p->data);
p=p->next;
}
printf("\n");
}
void print_node(node *head) /*输出循环单链表的结点*/
{node *p;
p=head->next;
do
{printf("%5d",p->data);
p=p->next;
}
while(p!=head->next);
printf("\n");
}
node *sort(void) /*直接插入排序*/
{node *pre,*q,*p,*head;
int x;
head=(node *)malloc(sizeof(node));
head->next=NULL;
scanf("%d",&x);
while(x)
{pre=head;
q=head->next;
p=(node *)malloc(sizeof(node));
p->data=x;
while(q&&x>q->data)
{pre=q;q=q->next;}
p->next=q;
pre->next=p;
scanf("%d",&x);
}
return head;
}
node *combine(node *head1,node *head2) /*链表合并*/
{node *head,*r,*q,*p;
head=(node *)malloc(sizeof(node));
r=head;
p=head1->next;
q=head2->next;
while(p&&q)
{if(p->data<q->data)
{r->next=p;r=p;p=p->next;}
else
{r->next=q;r=q;q=q->next;}
}
if(p==NULL)
r->next=q;
if(q==NULL)
r->next=p;
return head;
}
node *change(node *head) /*链表倒置*/
{node *p,*q;
p=head->next;
q=p;
head->next=NULL;
while(p)
{q=p->next;
p->next=head->next;
head->next=p;
p=q;
}
return head;
}
node *divide(node **head) /*拆分为两个链:偶数链和奇数链*/
{node *head1,*pre,*p;
head1=(node *)malloc(sizeof(node));
head1->next=NULL;
pre=*head;
p=pre->next;
while(p)
{if(p->data%2==1||p->data%2==-1)
{pre->next=p->next;
p->next=head1->next;
head1->next=p;
p=pre->next;
}
else
{pre=p;p=p->next;}
}
return head1;
}
node *delete(node *head) /*删除重复结点*/
{node *p,*pre,*q;
p=head->next;
while(p)
{q=p->next;
pre=p;
while(q)
{if(q->data==p->data)
{pre->next=q->next;
free(q);
q=pre->next;}
else
{pre=q;q=q->next;}
}
p=p->next;}
return head;
}
/*---------------------------------------------------------------*/
/* 函数:quicksort() */
/* 功能: 基于单链表的递归快带排序算法 */
/*---------------------------------------------------------------*/
int quicksort(node *Head,node *head,node *end) /*链表快速排序*/
{int temp;
node *p,*pre,*middle;
if(head->next==end||head->next->next==end) return 0;
pre=head->next;
p=pre->next;
temp=pre->data;
middle=pre;
while(p!=end)
{if(p->data<=temp)
{pre->next=p->next;
p->next=head->next;
head->next=p;
p=pre->next;
printf("具体过程是:\n");
print(Head);}
else
{pre=p;
p=p->next;}
}
quicksort(Head,middle,end);
quicksort(Head,head,middle);
}
/*用循环链表处理约瑟夫环*/
void josephe(node *head,int position,int interval,int num)
{node *p;
int i,count=0;
p=head->next;
for(i=1;i<position;i++)
p=p->next;
while(count<num)
{for(i=1;i<=interval-1;i++)
{p=p->next;
while(p->data==0)
p=p->next;}
count++;
printf("%8d",p->data);
p->data=0;
p=p->next;
while(count<num&&p->data==0)
p=p->next;
}
}
main()
{node *head1,*head2,*head,*Head;
char d;
int flag,num,position,interval; /*position是报数起始位置,interval是报数间隔*/
int i=0;
char c='y';
char b[20];
char a[20];
char *p="cls";
FILE *fp;
fp=fopen("password.c","r+");
fscanf(fp,"%s",a);
fclose(fp);
enter();
printf("\n\n\n\n\n\n\n\t\t请您输入密码:");
gets(b);
while(strcmp(a,b)!=0)
{printf("\n\n\n 您输入的密码有误,请重新输入:");
gets(b);
enter();
};
loop:homepage();
scanf("%d",&flag);
while(c=='y'||c=='Y')
{
switch(flag)
{case 0:printf("请您输入新密码:");scanf("%s",a);
printf("请您确认密码:");scanf("%s",b);
if(strcmp(a,b)!=0)
printf("\n\n对不起,密码修改不成功\n");
else {printf("\n\n密码修改成功\n");
fp=fopen("password.c","w");
fprintf(fp,"%s",a);
fclose(fp);}
break;
case 1:printf("尾插法创建单链表\n");
printf("请输入数据并且以0 结束:\n");
head=create1();
printf("尾插法创建的单链表是:\n");
print(head);
break;
case 2:printf("头插法创建单链表\n");
printf("请输入数据并且以0 结束:\n");
head=create2();
printf("头插法创建的单链表是:\n");
print(head);
break;
case 3:printf("直接插入排序创建单链表\n");
printf("请输入数据并且以0结束:\n");
head=sort();
printf("直接插入排序创建的单链表是:\n");
print(head);
break;
case 4:printf("递归快排单链表\n");
printf("请输入数据并且以0 结束:\n");
head=create1();
printf("未排序前的单链表:\n");
print(head);
Head=head;
quicksort(Head,head,NULL);
printf("快排后的单链表是:\n");
print(head);
break;
case 5:printf("两个链表合二为一\n");
printf("请输入第一个单链表的数据并以0 结束:\n");
head1=sort();
printf("请输入第二个单链表的数据并以0 结束:\n");
head2=sort();
head=combine(head1,head2);
printf("合并后的单链表是:\n");
print(head);
break;
case 6:printf("单链表倒置\n");
printf("请输入单链表的数据并以0 结束:\n");
head=create1();
head=change(head);
printf("倒置后的单链表是:\n");
print(head);
break;
case 7:printf("将一个单链表拆分成一个偶数链表和一个奇数链表\n");
printf("请输入单链表的数据并以0 结束:\n");
head=sort();
head1=divide(&head);
printf("偶数链是:\n");
print(head);
printf("奇数链是:\n");
print(head1);
break;
case 8:printf("删除单链表中重复的结点\n");
printf("请输入单链表的数据并以0 结束:\n");
head=sort();
head=delete(head);
printf("删除重复结点后的单链表是:\n");
print(head);
break;
case 9:printf("用循环单链表实现约瑟夫环\n");
printf("输入总人数:\n");
scanf("%d",&num);
printf("输入报数起点和报数间隔:\n");
scanf("%d%d",&position,&interval);
head=create3(num);
printf("人员顺序编号:\n");
print_node(head);
printf("出列序列:\n");
josephe(head,position,interval,num);
break;
case 10:system(p);printf("\n\n\n\n\n\n\t\t 感谢您对本软件的大力支持!\n\n\n\n\n\t\t 我的邮箱是:zhongchengfan@126.com\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
exit(1);getch();
break;
case 11:goto loop;
break;
}
printf("\n继续吗:Y/N__\n");
c=getch();
putchar(c);
if(c=='n'||c=='N') {system(p);printf("\n\n\n\n\n\n\t\t 感谢您对本软件的大力支持!\n\n\n\t\t 我的邮箱是:zhongchengfan@126.com\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");exit(1);}
while(c!='n'&&c!='N'&&c!='y'&&c!='Y') {printf("\n对不起,你输入的是无效字符,请重新输入:Y/N:\n");
c=getch();
putchar(c);
putchar('\n');
}
if(c=='y'||c=='Y')
{printf("\n请选择(0-11):\n");
scanf("%d",&flag);}}
if(c=='n'||c=='N') {system(p);printf("\n\n\n\n\n\n\t\t 感谢您对本软件的大力支持!\n\n\n\t\t 我的邮箱是:zhongchengfan@126.com\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");exit(1);}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -