zoukankan      html  css  js  c++  java
  • 【 数据结构(C语言)】线性表——单链表和单循环链表

    1.线性链表:用任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的也可以是不连续)

    2.动态链表和静态链表的区别

    • 静态链表是用数组实现的,是顺序的存储结构,在物理地址上是连续的,而且需要预先分配大小。
    • 动态链表是用申请内存函数(C是malloc,C++是new)动态申请内存的,所以在链表的长度上没有限制。动态链表因为是动态申请内存的,所以每个节点的物理地址不连续,要通过指针来顺序访问。

    3.单链表基本功能实现

    #include <bits/stdc++.h>
    using namespace std;
    #define ElemType  int
    #define Status int
    #define ERROR -1
    #define OK 1
    
    typedef struct LNode
    {
       ElemType data;
       struct  LNode *next;
    }LNode ,*LinkList;
    LinkList CreateListHead_L(int n)///* 头插入
    {
        LinkList L = (LinkList)malloc(sizeof(LNode));
        L->next = NULL;
        while (n--)
        {
            LinkList newnode = (LinkList)malloc(sizeof(LNode));
            scanf("%d",&newnode->data);
            newnode->next = L->next;
            L->next = newnode;
        }
        return L;
    }
    LinkList CreateListTail_L(int n)///尾插入
    {
        LinkList L = (LinkList)malloc(sizeof(LNode));
        LinkList last = (LinkList)malloc(sizeof(LNode));
        L->next = NULL;
        last = L;
        while (n--)
        {
            ElemType e;
            scanf("%d",&e);
            LinkList newnode = (LinkList)malloc(sizeof(LNode));
            newnode->data = e;
            last->next = newnode;
            newnode->next = NULL;
            last = newnode;
        }
        return L;
    }
    Status GetElem_L(LinkList &L,int i,ElemType &e)
    {
        LinkList index = L->next;
        int ct = 1;
        while (index && ct < i)
        {
            index = index->next;
            ++ct;
        }
        if (!index || ct > i) return ERROR;
        e = index->data;
        return OK;
    }
    Status ListInsert_L(LinkList &L,int i,ElemType e)
    {
        LinkList index = L->next;
        int ct = 1;
        while (index && ct < (i-1))
        {
            index = index->next;
            ++ct;
        }
        if (!index || ct > i -1) return ERROR;
        LinkList newnode = (LinkList)malloc(sizeof(LNode));
        newnode->data = e;
        newnode->next = index->next;
        index->next = newnode;
        return OK;
    }
    Status ListDeteleByPos_L(LinkList &L,int i,ElemType &e)
    {
        LinkList index = L->next;
        int ct = 1;
        while (index && ct < i-1)
        {
            index = index->next;
            ++ct;
        }
        if (!(index->next) || ct > i-1) return ERROR;
        LinkList tmp  = index->next;
        index->next = tmp->next;
        e = tmp->data;
        free(tmp);
        return OK;
    }
    Status ListDeteleByVal_L(LinkList &L,ElemType e)
    {
        LinkList index = L->next,pri = L;
        while (index) /// 注意:判断的如果是 pri pri 是最后一个元素的时候 index 已经超出链表
        {
            if (index->data == e)
            {
                pri->next = index->next;
                free(index);
                index = pri->next;
            }
            else
            {
                pri = pri->next;
                index = index->next;
            }
        }
        return OK;
    }
    int GetLength(LinkList &L)
    {
        int len = 0;
        LinkList index = L->next;
        while (index)
        {
           index = index->next;
           len++;
        }
        return len;
    }
    LinkList ListReverse(LinkList &L)
    {
        LinkList a = L->next;
        LinkList b = a->next;
        LinkList c = b->next;
        a->next = NULL;
        int len = GetLength(L);
        while (len--)
        {
            b->next  = a;
            c = b;
            b = a;
            if(!a)
            {
                L->next=a;
            }
            else c=c->next;
        }
        return L;
    }
    void TrverseLinklist(LinkList &L)///* 注意:这里是带头指针的链表
    {
        LinkList  index = L->next;
        for (;index!= NULL; index = index->next)
        {
            cout<<index->data<<" ";
        }
        cout<<endl;
    }
    

    4.单循环链表

    注意:只是将单链表中的最后一个结点的指针是指着头结点的,形成循环

    #include <bits/stdc++.h>
    using namespace std;
    #define ElemType  int
    #define Status int
    #define ERROR -1
    #define OK 1
    
    typedef struct LNode
    {
       ElemType data;
       struct  LNode *next;
    }LNode ,*LinkList;
    LinkList CreateListHead_L(int n)///* 头插入
    {
        LinkList L = (LinkList)malloc(sizeof(LNode));
        L->next = L;/// 改:
        while (n--)
        {
            LinkList newnode = (LinkList)malloc(sizeof(LNode));
            scanf("%d",&newnode->data);
            newnode->next = L->next;
            L->next = newnode;
        }
        return L;
    }
    LinkList CreateListTail_L(int n)///尾插入
    {
        LinkList L = (LinkList)malloc(sizeof(LNode));
        LinkList last = (LinkList)malloc(sizeof(LNode));
        L->next = L;
        last = L;
        while (n--)
        {
            ElemType e;
            scanf("%d",&e);
            LinkList newnode = (LinkList)malloc(sizeof(LNode));
            newnode->data = e;
            last->next = newnode;
            newnode->next = L;/// 改:
            last = newnode;
        }
        return L;
    }
    Status GetElem_L(LinkList &L,int i,ElemType &e)
    {
        LinkList index = L->next;
        int ct = 1;
        while (index && ct < i)
        {
            index = index->next;
            ++ct;
        }
        if (!index || ct > i) return ERROR;
        e = index->data;
        return OK;
    }
    Status ListInsert_L(LinkList &L,int i,ElemType e)
    {
        LinkList index = L->next;
        int ct = 1;
        while (index && ct < (i-1))
        {
            index = index->next;
            ++ct;
        }
        if (!index || ct > i -1) return ERROR;
        LinkList newnode = (LinkList)malloc(sizeof(LNode));
        newnode->data = e;
        newnode->next = index->next;
        index->next = newnode;
        return OK;
    }
    Status ListDeteleByPos_L(LinkList &L,int i,ElemType &e)
    {
        LinkList index = L->next;
        int ct = 1;
        while (index && ct < i-1)
        {
            index = index->next;
            ++ct;
        }
        if (!(index->next) || ct > i-1) return ERROR;
        LinkList tmp  = index->next;
        index->next = tmp->next;
        e = tmp->data;
        free(tmp);
        return OK;
    }
    Status ListDeteleByVal_L(LinkList &L,ElemType e)
    {
        LinkList index = L->next,pri = L;
        while (index != L) /// 改:将循环条件改了
        {
            if (index->data == e)
            {
                pri->next = index->next;
                free(index);
                index = pri->next;
            }
            else
            {
                pri = pri->next;
                index = index->next;
            }
        }
        return OK;
    }
    int GetLength(LinkList &L)
    {
        int len = 0;
        LinkList index = L->next;
        while (index != L)/// 改:将循环条件改了
        {
           index = index->next;
           len++;
        }
        return len;
    }
    void TrverseLinklist(LinkList &L)///* 注意:这里是带头指针的链表
    {
        LinkList  index = L->next;
        for (;index!= L; index = index->next)/// 改:将循环条件改了
        {
            cout<<index->data<<" ";
        }
        cout<<endl;
    }
    

      

  • 相关阅读:
    linux 命令
    linux 命令
    linux 命令
    linux命令
    ubuntu 下安装ssh服务,并修改ssh端口
    爬虫基础
    Django之中间件
    Django之用户认证组件
    Django之cookie&session
    Django之forms组件
  • 原文地址:https://www.cnblogs.com/sxy-798013203/p/7768144.html
Copyright © 2011-2022 走看看