zoukankan      html  css  js  c++  java
  • 《单链表练习》

    #include<stdio.h>
    #include<stdlib.h>
    #include<malloc.h>
    #define TRUE 1
    #define FALSE 0
    #define OK 1
    #define ERROR 0
    #define INFEASIBLE -1 //infeasible-->不可行的
    #define NULL 0

    typedef int Status;
    typedef int ElemType;

    //定义结构体
    typedef struct LNode
    {
    ElemType data;
    struct LNode *next;
    }LNode,*LinkList;


    //逆序输入n个元素的值,创建一个带表头节点的单链表
    void CreatList_L(LinkList &L,int n)
    {
    int i;
    LNode *p;

    L=(LinkList)malloc(sizeof(LNode));
    L->data=0; //令表头中的数据域内的值为0(其值为表中元素的个数)
    L->next=NULL; //建立带表头节点的单链表
    printf("Please input data:(输入8个整数) ");
    for(i=n;i>0;--i)
    {
    p=(LinkList)malloc(sizeof(LNode));
    scanf("%d",&p->data);
    p->next = L->next;
    L->next=p;
    L->data++; //递增表中元素的个数
    }
    // printf("%d",L->data); //此处L->data的功能是输出表中元素的个数
    }


    //查找单链表中第i个元素,若存在,其值赋给e并返回OK,否则返回ERROR
    Status GetElem_L(LinkList L,int i,ElemType &e)
    {
    //L为带头结点的单链表的头指针
    LNode *p1;
    p1=L->next;
    int j=1; //初始化,p指向第一个结点,j为计数器
    while(p1 && j<i)
    {
    p1 = p1->next;
    ++j;
    }
    if(!p1 || j>i)
    return ERROR; //第i个元素不存在
    e=p1->data;
    return OK;
    }

    //带表头结点的单链表的插入
    Status Listinsert_L(LinkList &L,int i,ElemType e)
    {
    LinkList p,s;
    int j;
    p = L;
    j = 0;
    while(p && j<i-1)
    {
    p = p->next;
    ++j;
    }
    if(!p || j>i-1)
    return ERROR;
    s=(LinkList)malloc(sizeof(LNode)); //生产新结点
    s->data=e;
    s->next=p->next;
    p->next=s;
    L->data++;
    return OK;
    }

    //带头结点单链表的删除
    Status ListDelete_L(LinkList &L,int i,ElemType &e)
    {
    LNode *p,*q;
    int j;
    p = L;
    j=0;
    while(p->next && j<i-1) //注意不能写成(p && j<i-1)
    {
    p=p->next;
    ++j;
    }
    if(!(p->next) || j>i-1)
    return ERROR;
    q = p->next;
    p->next = q->next;
    e = q->data;
    //printf("%d",e);
    free(q);
    L->data--; //使链表中的元素个数减一
    return OK;
    }
    //求单链表的长度的函数
    void Length_L(LinkList L)
    {
    int num=0;
    LinkList p;
    p=L->next;
    while(p)
    {
    num++;
    printf("%3d",p->data);
    p=p->next;
    }
    printf(" 这个单链表的长度为:%d",num);
    }

    //定义输出链表函数
    Status Print_L(LinkList L)
    {
    LinkList p;
    p=L->next;
    printf("this list contains %d elements ",L->data);
    while(p)
    {
    printf("%4d->",p->data);
    p=p->next;
    }
    printf("NULL ");
    return OK;
    }

    /*已知线性表中的元素以值递增有序排列,并以单链表作存储结构。
    写一高效算法,删除表中所有值大于mink且小于maxk的元素(若表中存在这样的元素)
    同时释放被删节点空间,并分析算法时间复杂度。

    (考虑当这个线性表不是有序排列该怎么办,那就写一个单链表的排序算法,
    若单链表的元素无序,则先调用排序算法进行排序,再调用此算法进行删除)*/

    Status Delete_Between(LinkList &L,int mink,int maxk)
    {
    LNode *p,*q;
    p = L;
    while(p->next && p->next->data<=mink)
    p=p->next; //p是最后一个不大于mink的元素
    if(p->next) //如果还有比mink更大的元素
    {
    q=p->next;
    while(q->data<maxk)

    {
    q=q->next; //q是第一个不小于maxk的元素

    L->data--;

    }
    p->next=q;
    }
    return OK;

    }
    //建立主函数
    int main()
    {
    LinkList L;
    int n=8,i,i_1,i_2,e,e_1,e_2,e_3,e_4;

    //调用CreatList_L函数,创建一个单链表
    //printf("Please input the number in the list: ");
    CreatList_L(L,n);
    printf(" ");

    //调用GetElem_L函数,查找单链表中的第i个元素,调用Length_L函数,求表长
    printf("单链表中的数据为: ");
    Length_L(L);
    printf(" ");
    printf(" 请输入你要获取的元素序号:");
    scanf("%d",&i);
    GetElem_L(L,i,e);
    printf("the %dth number is:%d",i,e);
    printf(" ");

    //调用Listinsert_L函数,实现元素插入功能,然后调用输出链表函数,输出插入后的链表
    printf("清输入插入元素的位置: ");
    scanf("%d",&i_1);
    printf(" 请输入要插入的元素: ");
    scanf("%d",&e_1);
    Listinsert_L(L,i_1,e_1);
    Print_L(L);
    printf(" ");

    //调用Delete函数,用来删除指定的元素,然后再调用Print_L函数输出删除元素后的链表
    printf("请输入要删除的位置是: ");
    scanf("%d",&i_2);
    ListDelete_L(L,i_2,e_2);
    Print_L(L);
    printf(" ");

    //调用Delete_Between函数,用来删除指定两个元素之间的元素,然后调用Print函数,输出操作后的链表
    printf(" 删除a和b之间的元素,请输入:");
    scanf("%d%d",&e_3,&e_4);
    Delete_Between(L,e_3,e_4);
    Length_L(L);
    Print_L(L);
    printf(" ");

    return 0;
    }

  • 相关阅读:
    内存溢出常见原因分析
    内存溢出,与内存泄露
    ping不通linux服务器排查
    内存,缓存,cpu,硬盘关系
    cpu 基础知识
    sql查询以及常见问题理解解析
    月入一万,活在北京 (zz)
    超越信息和通讯 迎接新一轮数字化变革 (转载)
    The specified DSN contains an architecture mismatch between the Driver and Application (zz.IS2120@B)
    Excel .xls文件导入、导出 的例子
  • 原文地址:https://www.cnblogs.com/sun-/p/4840607.html
Copyright © 2011-2022 走看看