• 链表存储


    #include<iostream>
    #include<malloc.h>
    using namespace std;
    typedef int ElemType;
    //结点结构
    typedef struct node{
    ElemType data;
    struct node *next;
    }SLink;
    //初始化链表
    void InitSLink(SLink *&L){
      //这个为头结点分配一个内存
      L=(SLink *)malloc(sizeof(SLink));
      //指向NULL
      L->next = NULL;
    }
    //销毁链表
    void DestrorySLink(SLink *&L){
    //指针别名
    SLink *pre=L,*p=L->next;
     while(p!=NULL){
       free(pre);
       pre=p;
       p=p->next;
     }//销毁最后的结点
     free(pre);
    }
    
    
    //因为要判断是否删除成功函数返回值应该整型  注意这里可以使用指针的别名或者直接传递  反正指向的是同一个内存空间
    int InsElem(SLink *L,ElemType a,int r){
    //注意一点 线性表当中的数组 下标是固定从0
    //开始,而链表不是应该从实际上考虑
    //注意一个问题:插入第r个位置 也就是除了头结点开始的元素结点第r个位置 也就是先找到第r-1个元素结点也就是先找到整条单链表的第r个元素 也就是实际顺序上的第r-1个元素
    int i=0;
    SLink *p = L;
    //找到r-1个元素
    while(p!=NULL&&i<r-1){
     i++;
     p=p->next;
    }
    if(p==NULL){
     return 0;
    }
    //创建一个节点 将节点插在当前节点的后面
    SLink *s= (SLink *)malloc(sizeof(SLink));
     s->next = p->next;
    s->data = a;
    p->next=s;
    return 1;
    
    }
    
    //删除元素
    int DelElem(SLink *&L,int r){
    //不能删除0节点
    if(r<=0){
     return 0;
    }
    //从第一个节点开始
    int j=1;
    SLink *p=L->next,*q;
    //找到他的前节点
    while(p!=NULL&&j<r-1){
     p=p->next;
    }
    //不存在该节点的前节点
    if(p==NULL){
     return 0;
    }
    //p->next = (p->next)->next;错误写法这里赋值完后无法释放要删除的节点内存
    q=p->next;
    p->next=q->next;
    cout<<q->data;
    cout<<p->data;
    free(q);
    return 1;
    }
    
    
    
    //定位元素
    int LocElem(SLink *&L,ElemType a){
     int i=1;
     SLink *p=L->next;
     while(p->data!=a&&p->next!=NULL){
      i++;
      p=p->next;
     }
     if(p->next==NULL){
       return 0;
     }
      //返回元素的值
      return i;
    }
    
    
    void DisSLink(SLink *&L){
     SLink *p=L->next;
    cout<<"链表的值如下"<<endl;
    while(p!=NULL){
       cout<<p->data<<" ";
       p=p->next;
     }
    cout<<endl;
    }
    
    //获得某个位置元素的值
    int LocaElem(SLink *&L,int r){
    if(r<=0){
     return 0;
    }
    int i=1;
    SLink *p=L->next;
    while(p!=NULL&&i!=r){
      i++;
     p=p->next;
    }
    if(p==NULL){
     cout<<"该位置不存在元素"<<endl;
    }else{
     cout<<"位于链表"<<r<<"处为:"<<p->data<<endl;
    }
    }
    
    int GetLength(SLink *&L){
      int i=0;
      SLink *p=L->next;
      while(p!=NULL){
       i++;
       p=p->next;
      }
      return i;
    
    }
    int main(){
    /*
    带头结点不循环单链表
    基本算法:
    初始化链表InitSLink()
    销毁链表DestrorySLink()
    插入元素InsElem
    删除元素DelElem
    获得某个位置的元素GetElem
    输出元素DisSLink
    获得元素的位置LocaElem
    获取链表长度GetLength
    
    
    */
    SLink *L;
    //初始化
    InitSLink(L);
    //插入元素
    InsElem(L,32,1);
    InsElem(L,2,2);
    InsElem(L,3,3);
    InsElem(L,12,4);
    InsElem(L,22,5);
    InsElem(L,42,6);
    InsElem(L,3,7);
    LocaElem(L,5);
    LocaElem(L,12);
    
    cout<<"当前有"<<endl;
    DisSLink(L);
    cout<<"删除第二个元素"<<endl;
    cout<<(DelElem(L,2)?"成功":"失败")<<endl;
    
    cout<<"现在存在的元素"<<endl;
    DisSLink(L);
    cout<<"链表当前长度"<<GetLength(L)<<endl;
    cout<<"元素3的位置"<<LocElem(L,3)<<endl;
    return 0;
    }

    执行结果:

    [root@VM_0_11_centos gcc]# ./51.c
    位于链表5处为:22
    该位置不存在元素
    当前有
    链表的值如下
    32 2 3 12 22 42 3 
    删除第二个元素
    232成功
    现在存在的元素
    链表的值如下
    32 3 12 22 42 3 
    链表当前长度6

    元素3的位置是2
    [root@VM_0_11_centos gcc]#

      一次性创建并且插入结点

    //头插法
    void Inithead(SLink *&L,ElemType a[],int l){
    L=(SLink *)malloc(sizeof(SLink));
    L->next=NULL;
    //创建的结点
    SLink *s;
    for(int i=0;i<l;i++){
    s=(SLink *)malloc(sizeof(SLink));
    s->data=a[i];
    s->next=L->next;
    L->next=s;
    }
    
    }
    
    //尾插发
    void Initfoot(SLink *&L,ElemType a[],int l){
    
    L=(SLink *)malloc(sizeof(SLink));
    //L->next=NULL;
    SLink *foot=L,*s;//这个应该卸载分配内存之后
    for(int i=0;i<l;i++){
    s=(SLink *)malloc(sizeof(SLink));
    //在原尾结点指向新插入的结点
    //s->next=NULL;
    s->data=a[i];
    foot->next=s;
    //尾部指针指向新插入的结点
    foot=s;
    }
    
    foot->next=NULL;
    
    }

    获得最大结点:

    //获得最大节点
    void GetMax(SLink *&L){
      //先假定当前元素为最大节点
      int l=0,maxl=0;
      SLink *p = L->next,*max=p;
       while(p!=NULL){
        l++;
        if(p->data > max->data){
         max=p;
         //最大元素的位置
         maxl=l;
        }
         p=p->next;
    
      }
    
     if(max==NULL){
       cout<<"当前空链"<<endl;
     }else{
       cout<<"最大节点位于"<<maxl<<""<<max->data<<endl;
     }
    }

  • 相关阅读:
    ELK--filebeat命令行参数解释
    ELK--filebeat详解
    centOS7 修改DNS
    nginx-日志统计
    ceph 安装ceph问题汇总
    正则 挖网站表格复习
    c#反射优化 表达式树
    combotree 满足条件的节点不可选中
    NHibernate获取实体配置信息(表名,列名等等)
    jqgrid 单元格放超链接文本
  • 原文地址:https://www.cnblogs.com/webcyh/p/11333510.html
Copyright © 2020-2023  润新知