Board logo

标题: C语言经典算法之单链表处理全集 [打印本页]

作者: 苹果也疯狂    时间: 2014-5-22 09:16     标题: C语言经典算法之单链表处理全集

/*谁有兴趣一起来丰富这个程序的的功能??*/
#include<stdio.h>
#include<stdlib.h>
#define MAX 20
#define ELEMTP int
#define v (*p)
struct node
{
         ELEMTPdata;
         structnode *next;
};
struct node *p,*q,*s,*head;
int j=0,i,k;
main()
{
         intx,y,cord;
         voidoutlin(struct node *h);
         voidcreate();
         voidinsert(struct node *h,int x,int y);
         voiddeletes(struct node *h,int x);
         structnode *MaxCompare(struct node *h);
         structnode *MinCompare(struct node *h);
         intdelIterance(struct node *h);
         voidbatchInsert(struct node *h,int x);
         voidbatchDelete(struct node *h,int x,int y);
         voidCz(struct node*  h);
         voidXg(struct node * h);
         printf("建立链表,输入-999完成链表:\n");
         create();
         i=j;
         outlin(head);
         do{
                   printf("\n        主菜单        \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("     0   结束程序运行   \n");
                   printf("-----------------------------------------\n");
                   printf("请输入您的选择(1, 2, 3, 4, 5, 6, 7, 8, 9, 0) ");
                   scanf("%d",&cord);
                   switch(cord)
                   {
                            case1:
                            {
                                     printf("请输入插入的位置 i:");
                                     scanf("%d",&x);
                                     printf("请输入插入的数据 y:");
                                     scanf("%d",&y);
                                     insert(head,x,y);
                                     i=j;
                                     outlin(head);
                            }break;
                            case2:
                            {
                                     printf("x=?");
                                     scanf("%d",&x);
                                     deletes(head,x);
                                     i=j;
                                     outlin(head);
                            }break;
                            case3:
                            {
                                     printf("链表由大到小是");
                                     s=MaxCompare(head);
                                     j=i;
                                     outlin(s);
                                     //outlin(head);
                            }break;
                            case4:
                            {
                                     printf("链表由大到小是");
                                     s=MinCompare(head);
                                     j=i;
                                     outlin(s);
                            }break;
                            case5:
                            {
                                     Cz(head);
                                     outlin(head);
                            }break;
                            case6:
                            {
                                     Xg(head);
                                     outlin(head);
                            }break;
                            case7:
                            {
                                     k=delIterance(head);
                                     i=i-k;
                                     j=i;
                                     outlin(head);
                            }break;
                            case8:
                            {
                                     printf("请输入插入的位置 i:");
                                     scanf("%d",&x);
                                     batchInsert(head,x);
                                     i=j;
                                     outlin(head);
                            }break;
                            case9:
                            {
                                     printf("请输入删除的起始位置 i:");
                                     scanf("%d",&x);
                                     printf("请输入删除的结束位置 y:");
                                     scanf("%d",&y);
                                     batchDelete(head,x,y);
                                     i=j;
                                     outlin(head);
                            }break;
                            case0:
                            {
                                     exit(0);
                            }break;
                   }
         }while(cord<=9&&cord>=0);
}
void outlin(struct node *h)
{
         p=h->next;
         while(p!=NULL)
         {
                   printf("data=%4d ",p->data);
                   p=p->next;
         }
         printf("\n输出结束\n\n");
}
void deletes(struct node *h,int x)//删除节点
{
         p=h;
         while(p->next!=NULL&&p->next->data!=x)             p=p->next;
         if(p->next==NULL)
                   printf("x不存在 !");
         else
         {
                   q=p->next;
                   p->next=q->next;
                   free(q);
                   --j;
         }
}
void insert(struct node *h,int x,int y)
{
         s=(structnode*)malloc(sizeof(struct node));
         s->data=y;
         q=h;p=h->next;
         while(p!=NULL&&p->data!=x)
         {
                   q=p;
                   p=p->next;
         }
         q->next=s;
         s->next=p;
         ++j;
}
void create()//建立链表
{
         intx;
         head=(structnode*)malloc(sizeof(struct node));
         head->next=NULL;
         p=head;
         printf("x=?");
         scanf("%d",&x);
         while(x!=-999)
         {
                   s=(structnode*)malloc(sizeof(struct node));
                   s->data=x;
                   s->next=NULL;
                   p->next=s;
                   p=s;
                   printf("x=?");++j;
                   scanf("%d",&x);
         }
}
/////////////以下函数由七绝玩家编写/////////////
struct node *MaxCompare(struct node *h)//由大到小排序
{      
         structnode *t;
         intx;
         t=h;s=NULL;
         while(j!=0)
         {
         x=t->next->data;
         q=t->next;
         while(q!=NULL)
         {
                   if(q->data<=x)
                            x=q->data;
                   else
                            x=x;
                   q=q->next;        
         }
         p=t;
         while(p->next!=NULL&&p->next->data!=x)
                   p=p->next;
         q=p->next;
         p->next=q->next;
         t=p;t=h;
         p=q;p->next=s;
         s=p;
         j--;
         }
         t->next=s;
         head=t;
         return(t);
}
struct node *MinCompare(struct node *h)//由小到大排序
{
         structnode *t;
         intx;
         t=h;s=NULL;
         while(j!=0)
         {
         x=t->next->data;
         q=t->next;
         while(q!=NULL)
         {
                   if(q->data>=x)
                            x=q->data;
                   else
                            x=x;
                   q=q->next;        
         }
         p=t;
         while(p->next!=NULL&&p->next->data!=x)
                   p=p->next;
         q=p->next;
         p->next=q->next;
         t=p;t=h;
         p=q;p->next=s;
         s=p;
         j--;
         }
         t->next=s;
         head=t;
         return(t);
}
int delIterance(struct node *h)//删除重复元素
{
         intx,y=0;
         --j;
         s=h->next;
         while(j>0)
         {        
                   x=s->data;
                   p=s;
                   while(p->next!=NULL)
                   {
                            if(p->next==NULL)
                            {
                                     x=x;
                            }
                            elseif(p->next->data==x)
                            {
                                     q=p->next;
                                     p->next=q->next;
                                     free(q);
                                     --j;
                                     ++y;
                            }
                            else
                            {
                                     p=p->next;
                            }
                   }
                   s=s->next;
                   --j;
         }
         returny;
}
void batchInsert(struct node *h,int x)//批量加入
{
         inty=0;
         q=h;p=h->next;
         while(p!=NULL&&p->data!=x)
         {
                   q=p;
                   p=p->next;
         }
         printf("y=?");
         scanf("%d",&y);
         while(y!=-999)
         {
         s=(structnode*)malloc(sizeof(struct node));
         s->data=y;
         q->next=s;
         s->next=p;
         q=s;
         printf("y=?");
         scanf("%d",&y);
         ++j;
         }
}
void batchDelete(struct node *h,int x,inty)//批量删除
{
         intk=0,w=0;
         structnode *t;
         p=h;q=h;
         while(p->next!=NULL&&p->next->data!=x)
         {
                   ++k;
                   p=p->next;
         }
         while(q->next!=NULL&&q->next->data!=y)
         {
                   ++w;
                   q=q->next;
         }
         if(p->next==NULL||q->next==NULL)
                   printf("输入的位置不正确,请重新开始!");
         elseif(k<w)
         {
                   s=q->next;
                   while(p->next!=s)
                   {
                            t=p->next;
                            p->next=t->next;
                            free(t);
                            --j;
                   }


         }
         elseif(w=k)
         {
                   printf("没有删除元素");
         }
         else
         {
                   s=p->next;
                   while(q->next!=s)
                   {
                            t=q->next;
                            q->next=t->next;
                            free(t);
                            --j;
                   }
         }
}
//////////////七绝玩家编写结束//////////////
//////////////以下函数由lihk编写////////////
void Cz(struct node*  h)           //查找//
{
         structnode * num;int i;
         num=head;
         printf("输入您要查找的号码:");
         scanf("%d",&i);
         while(i!=num->data&& num->next!=NULL)
         {   
                   num=num->next;
         }
         if(i==num->data)
                 printf("号码:%d",num->data);
         else
                 printf("该号码不在链表里.");
}
void Xg(struct node * h) //修改//
{
         structnode * num; int i;
         num=head;
         printf("查找您要修改的号码:");
         scanf("%d",&i);
         while(i!=num->data&&num->next!=NULL){
                   num=num->next;}
         if(i==num->data)
         {
               printf(":%d\n",num->data);
               printf("输入您要修改的新信息:");
                   printf("号码:");
               scanf("%d",&num->data);
               printf("\n修改成功!");
     }
         else         
               printf("该号码不在链表里!");  
}
//////////////lihk编写结束/////////////////




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0