单向链表的简单操作

/*


**本段程序用于单向链表的常规操作
其中包含的操作有:
随机创建中指定范围(由X和Y确定)的是个随机数、
对已经创建的单向链表排序、插入任意个数随机数、
删除链表中的一个数据、销毁整个链表、查找数据、
遍历数据;
本段代码仅用于初学者学习使用,如有不妥之处或
者其他意见、建议请联系作者:

*/


/*包含头文件*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

/*X,Y为生成随机数范围*/
#define X 0
#define Y 100

/*创建链表数据类型*/
typedef struct _Lnode
{
   int data;
   struct _Lnode *next;
}Lnode;

/*该函数用于生成菜单选项*/
void Choices(void)
{
    printf("Please choose options:\n");
    printf("Creat---1\n"); //创建
    printf("Order---2\n"); //从小到大排序
    printf("Visit---3\n"); //遍历链表
    printf("Insert--4\n"); //插入n随机数
    printf("Delete--5\n"); //删除单个数据
    printf("Destory-6\n"); //销毁链表
    printf("LookTab-7\n"); //查找数据
    printf("Exit----0\n"); //退出
}


/*创建链表子函数*/
Lnode *Creat_link(void)
{
   Lnode *head=NULL,*q=NULL,*s=NULL;
   int i,k;
   srand( (unsigned)time( NULL ) ); //修改rand()函数种子
   k=rand()%(Y-X+1)+X; //生成指定范围随机数
   s=(Lnode *)malloc(sizeof(Lnode)); //分配内存
   s->data=k;  //赋值
   s->next=NULL; //创建头节点
   head=s;
   q=s;
   for(i=0;i<9;i++)
   {
       k=rand()%(Y-X+1)+X;
       s=(Lnode *)malloc(sizeof(Lnode));  //分配内存
       s->data=k;
       q->next=s;
       s->next=NULL;
       q=s;
   }
   return head; //返回头结点
}


/*遍历子函数*/
void Vist_link(Lnode *h)
{
    Lnode *look=NULL;
    if(h==NULL)
        printf("\n\tEmpty Link!\t\n");
    else
    {
        look=h;
        while(look!=NULL)
        {
            printf("%d ",look->data);
            look=look->next;
        }
        printf("\n");
    }
    return;
}


/*排序
修改不等号可以改变升降序
*/
void Order_Link(Lnode *h)
{
    Lnode *p,*q;
    int swapdata;
    if(h==NULL)
        printf("Error! Empty Link.");
    else
    {
        p=h;
        q=h->next;
        while(q!=NULL)
        {
            if(p->data>q->data)
            {
                swapdata=p->data;
                p->data=q->data;
                q->data=swapdata;
                p=h;
                q=h->next;
            }
            else
            {
                p=q;
                q=q->next;
            }

        }
        printf("After Order:\n");
        Vist_link(h);
    }
}


/*插入数据
注意:插入之前需要先排序,
这是有序插入
*/
Lnode *Insert_Order(Lnode *h,int *n)
{
    printf("Please input the number of data(s) that you want to add:\n");
    scanf("%d",n);
    int i,k;
    Lnode *p,*q,*s,*f;
    for(i=0;i<*n;i++)
    {
        k=rand()%(Y-X+1)+X;
        p=h;
        f=h;
        q=h->next;
        if(k<p->data)
        {
           s=(Lnode *)malloc(sizeof(Lnode));
           s->data=k;
           s->next=p;
           f=s;
        }
        else
        {
            while(q!=NULL)
            {
               if(k>=p->data&&k<=q->data)
               {
                  s=(Lnode *)malloc(sizeof(Lnode));
                  s->data=k;
                  s->next=q;
                  p->next=s;
               }
                  p=q;
                  q=q->next;
            }
            if(k>p->data)
            {
                s=(Lnode *)malloc(sizeof(Lnode));
                s->data=k;
                s->next=NULL;
                p->next=s;
            }
        }
    }
    printf("Add complete!\n");
    Vist_link(f);
    return f;
}


/*查找*/
int LookTab(Lnode *h,int *f)
{
    if(h==NULL)
    {
        printf("\n\tEmpty! Fail to find!\t\n");
        return 0;
    }
    printf("please input the number you want to find:\n");
    scanf("%d",f);
    Lnode *p;
    p=h;
    while(p!=NULL)
    {
      if(p->data==*f)
      {
        printf("\tFind It!\t\n");
        return 1;
      }
      p=p->next;
    }
    printf("\n\tCan't find the data!\t\n");
    return 0;
}


/*删除*/
Lnode *Delete_data(Lnode *h)
{
   int dele;
   Lnode *p,*q;
   Vist_link(h);
   printf("Choose the number you want to delete:\n");
   scanf("%d",&dele);
   p=h;
   q=h->next;
   if(p->data==dele)
   {
       free(p);
       return q;
   }
   else
   {
       while(q!=NULL)
       {
           if(q->data==dele)
           {
               if(q->next==NULL)
               {
                   free(q);
                   p->next=NULL;
                   break;
               }
               else
               {
                   p->next=q->next;
                   free(q);
                   break;
               }
           }
           p=q;
           q=q->next;
       }
       return h;
   }
}


/*销毁*/
Lnode *Destory(Lnode *h)
{
    Lnode *p,*q;
    if(h==NULL)
    {
        printf("\tEMPTY LINK!\t\n");
        return NULL;
    }
    p=h;
    q=h->next;
    do
    {
        free(p);
        p=q;
        q=q->next;
    }while(q!=NULL);
    printf("\tDESTORY COMPLETE!\t\n");
    return NULL;
}

int main()
{
    Lnode *head=NULL;
    int choose=10;
    int add=1;
    while(choose)
    {
        Choices();
        scanf("%d",&choose);
        system("CLS");
        switch(choose)
        {
            case 1: head=Creat_link();
            case 3: Vist_link(head); system("pause");break;
            case 2: Order_Link(head); system("pause");break;
            case 4: head=Insert_Order(head,&add); system("pause");break;
            case 5: head=Delete_data(head); system("pause");break;
            case 6: head=Destory(head); system("pause");break;
            case 7: LookTab(head,&add); system("pause");break;
            case 0: printf("Thanks to use!\n");break;
            default: break;
        }
    }
    return 0;
}

发布了25 篇原创文章 · 获赞 9 · 访问量 6210

猜你喜欢

转载自blog.csdn.net/qq_42144047/article/details/85780587