⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 list.c

📁 确切的说它是一个运行程序
💻 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 + -