• 单链表的线性操作--简单


    #include <stdio.h>
    #include <stdlib.h>

    //定义单链表的结构
    typedef struct node
    {
    int data;
    struct node *next;
    }linklist;

    //建立单链表
    linklist *creatlist()
    {
    linklist *head,*p,*q;
    head=(linklist *)malloc(sizeof(linklist));
    head->next=NULL; //至此,建立一个首结点,首结点不存储数据

    p=q=(linklist *)malloc(sizeof(linklist));

    head->next=p; //head结点的指针指向p结点
    p->next=NULL;

    scanf("%d",&(p->data)); //为p,也是q结点输入一个整数

    while(p->data!=-1)
    {
    q->next=p;
    q=p;
    p=(linklist *)malloc(sizeof(linklist));
    scanf("%d",&p->data);
    }
    q->next=NULL;

    return head;
    }

    //统计相同数值的个数
    int count(linklist *head,int num)
    {
    linklist *p;
    int n=0;
    p=head;
    while(p!=NULL)
    {
    if(p->data==num)
    n++;
    p=p->next;
    }
    return n;
    }

    //定位单链表中某个值的位置
    int locatelinklist(linklist *head,int x)
    {
    linklist *p;
    int loc=0;
    p=head;
    while(p!=NULL && p->data!=x)
    {
    loc++;
    p=p->next;
    }
    if(p!=NULL)
    return loc;
    else
    return 0;
    }

    //删除单链表中的一个结点
    void deletelinklist(linklist *head,int i)
    {
    linklist *p,*q;
    q=head;
    if(i==1)
    q=head;
    else
    {
    q=q->next;
    int c=1;
    while(c<i-1 && q!=NULL)
    {
    q=q->next;
    c++;
    } //找到要删除的结点
    }
    if(q!=NULL && q->next!=NULL)
    {
    p=q->next;
    q->next=p->next;
    free(p);
    }
    else
    printf(" 没有要删除的结点! ");
    }

    //单链表中向第i个位置插入一个新结点
    void insertlinklist(linklist *head,int x,int i)
    {
    linklist *p,*q=head;
    if(i==1)
    q=head;
    else
    {
    q=q->next;
    int c=1;
    while(c<i-1 && q!=NULL)
    {
    q=q->next;
    c++;
    }
    }
    if(q!=NULL && q->next!=NULL)
    {
    p=(linklist *)malloc(sizeof(linklist)); //(1)
    p->data=x; //(2)
    p->next=q->next; //(3)
    q->next=p; //(4)
    } //(3)(4)是插入结点的语句
    else
    printf(" 找不到要插入结点的位置! ");
    }

    //单链表中结点排序
    linklist *bubblesort(linklist *head)
    {
    linklist *p,*tail,*ne;
    int temp;
    if(head->next==NULL)
    return head;
    for(p=head->next;p->next!=NULL;p=p->next)
    ;
    tail=p->next; //确定尾结点的位置
    while(tail!=head->next->next)
    {
    for(p=head->next;p->next!=tail;p=p->next)
    {
    ne=p->next;
    if(p->data>ne->data)
    {
    temp=p->data;
    p->data=ne->data;
    ne->data=temp;
    }
    }
    tail=p;
    }
    return head;
    }

    //删除重复结点
    void purgelist(linklist *head)
    {
    linklist *p,*q,*r;
    q=head->next;
    while(q!=NULL)
    {
    p=q;
    while(p->next!=NULL)
    {
    if(p->next->data==q->data)
    {
    r=p->next; //指针r指向要删除的结点
    p->next=r->next;
    free(r);
    }
    else
    p=p->next;
    }
    q=q->next;
    }
    }

    //显示单链表
    void print(linklist *head)
    {
    linklist *p;
    p=head->next;
    if(p==NULL)
    {
    printf("空链表");
    }
    else
    {
    do
    {
    printf("%4d",p->data);
    p=p->next;
    }while(p!=NULL);
    printf(" ");
    }
    }

    //主菜单
    void menu()
    {
    printf(" *********************************** ");
    printf(" 1. 创建单链表(首先执行该项) ");
    printf(" 2. 单链表中插入一个结点 ");
    printf(" 3. 单链表中删除指定位置上结点 ");
    printf(" 4. 单链表中定位某个结点的位置 ");
    printf(" 5. 单链表中查找重复值 ");
    printf(" 6. 单链表结点排序 ");
    printf(" 7. 单链表删除重复值结点 ");
    printf(" 0. 退出 ");
    printf(" *********************************** ");
    }

    menu_bye()
    {
    printf(" *********************************** ");
    printf(" 欢迎再次使用 ");
    printf(" ");
    printf(" 再见! ");
    printf(" *********************************** ");
    }

    //主函数
    void main()
    {
    menu(); //程序首先执行菜单
    int n;
    linklist *h;
    while(1)
    {
    printf("请输入(1-7):");
    scanf("%d",&n);
    if(n<0 || n>7)
    printf("没有此值,请重输入! ");

    switch(n)
    {
    case 0:
    system("cls");
    menu_bye();
    exit(0);
    case 1:
    printf("请输入一串整数,以空格分隔,以“-1”结束 ");
    h=creatlist();
    print(h);
    break;
    case 2:
    int number,pos;
    printf(" 输入要插入结点的值和位置: ");
    scanf("%d%d",&number,&pos);
    insertlinklist(h,number,pos);
    print(h);
    break;
    case 3:
    int num;
    printf(" 输入要删除的结点序号: ");
    scanf("%d",&num);
    deletelinklist(h,num);
    print(h);
    break;
    case 4:
    int data,position;
    scanf("%d",&data);
    position=locatelinklist(h,data);
    printf("位置是:%d",position);
    break;
    case 5:
    int x,cnt;
    printf("请输入要查找的值:");
    scanf("%d",&x);
    cnt=count(h,x);
    printf("成绩为%d的学生人数是:%d",x,cnt);
    break;
    case 6:
    linklist *head;
    printf("排序结果如下: ");
    head=bubblesort(h);
    print(head);
    break;
    case 7:
    printf("删除重复结点,输入y或Y执行删除 ");
    int j;
    getchar();
    j=getchar();
    if(j=='y' || j=='Y')
    {
    purgelist(h);
    print(h);
    }
    else
    printf("没有重复结点! ");
    break;
    default:
    break;
    }
    }
    }

    运行结果:

     

  • 相关阅读:
    操作数组可以通过Array这个类来操作(不需要考虑数组的类型!!!)
    Servlet------>jsp自定义标签SimpleTag(jsp2.0以后的方法,1-5已经淘汰了)
    Servlet------>jsp自定义标签5(标签体内容改为大写)
    Servlet------>jsp自定义标签(JSPTAG接口)
    Servlet------>jsp自定义标签4(重复标签体)
    Servlet------>jsp自定义标签3(不显示余下jsp内容)
    模块学习
    正则表达式与re模块
    模块
    迭代器与生成器
  • 原文地址:https://www.cnblogs.com/duanqibo/p/11589049.html
Copyright © 2020-2023  润新知