zoukankan      html  css  js  c++  java
  • 数据结构-单链表基本操作实现(含全部代码)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
    本文链接:https://blog.csdn.net/lady_killer9/article/details/82700743

    今天是单链表的实现,主要实现函数如下:

    •     InitList(LinkList &L)               参数:单链表L 功能:初始化 时间复杂度 O(1)
    •     ListLength(LinkList L)           参数:单链表L 功能:获得单链表长度 时间复杂度O(n)
    •     ListInsert(LinkList &L,int i,ElemType e) 参数:单链表L,位置i,元素e 功能:位置i后插 时间复杂度O(n)[加入了查找]
    •                                                                         若已知指针p指向的后插 O(1)
    •     ListDelete(LinkList &L,int i) 参数:单链表L,位置i 功能:删除位置i元素 时间复杂度O(n)[加入了查找]
    •                                                     若已知p指针指向的删除 最好是O(1),因为可以与后继结点交换数据域,然后删除后继结点。
    •                                                     最坏是O(n),即从头查找p之前的结点,然后删除p所指结点
    •     LocateElem(LinkList L,ElemType e) 参数:单链表L,元素e 功能:查找第一个等于e的元素,返回指针 时间复杂度O(n)

    代码:

        /*
            Project: single linkeed list (数据结构 单链表)
            Date:    2018/09/14
            Author:  Frank Yu
            InitList(LinkList &L) 参数:单链表L 功能:初始化 时间复杂度 O(1)
            ListLength(LinkList L) 参数:单链表L 功能:获得单链表长度 时间复杂度O(n)
            ListInsert(LinkList &L,int i,ElemType e) 参数:单链表L,位置i,元素e 功能:位置i后插 时间复杂度O(n)[加入了查找]
                                                    若已知指针p指向的后插 O(1)
            ListDelete(LinkList &L,int i) 参数:单链表L,位置i 功能:删除位置i元素 时间复杂度O(n)[加入了查找]
                                          若已知p指针指向的删除 最好是O(1),因为可以与后继结点交换数据域,然后删除后继结点。
                                          最坏是O(n),即从头查找p之前的结点,然后删除p所指结点
            LocateElem(LinkList L,ElemType e) 参数:单链表L,元素e 功能:查找第一个等于e的元素,返回指针 时间复杂度O(n)
        */
        #include<cstdio>
        #include<cstdlib>
        #include<cstring>
        #include<cmath>
        #include<iostream>
        using namespace std;
        #define Status int
        #define ElemType int
        //单链表结点数据结构
        typedef struct LNode
        {
            ElemType data;//数据域
            struct LNode *next;//指针域
        }LNode,*LinkList;
        //**************************基本操作函数***************************//
        //初始化函数
        Status InitList(LinkList &L)
        {
         L = new LNode;//生成头结点 这样删除等操作就不必分第一个结点和其他了
         L->next = NULL;
         return 1;
        }
        //获取单链表长度 头结点无数据,不算
        int ListLength(LinkList L)
        {
            LinkList p=L;int sum=0;
            while(p)
            {
             sum++;
             p=p->next;
            }
            return sum-1;//去除头结点
        }
        //插入函数--后插法 插入到第i(1<=i<=length+1)个位置 即i-1之后 不必区分i的位置
        bool ListInsert(LinkList &L,int i,ElemType e)
        {
            LNode* s;LinkList p=L;int j=0;
            while(p&&(j<i-1))//j指到i-1位置或者p已经到最后时跳出
            {
             p=p->next;
             ++j;
            }
            if(!p||j>i-1)//i<1或者i>ListLength(L)+1时,插入位置无效 不调用ListLength,提高效率
            {
                printf("插入位置无效!!!
    ");
                return false;
            }
            s=new LNode;
            s->data=e;
            s->next=p->next;
            p->next=s;
            return true;
        }
        //删除函数 删除位置i的结点 即删除i-1之后的结点
        bool ListDelete(LinkList &L,int i)
        {
             LNode* s;LinkList p=L;int j=0;
            LinkList q;
            while(p&&(j<i-1))//j指到i-1位置
            {
             p=p->next;
             ++j;
            }
            if(!(p->next)||j>i-1)//i<1或者i>ListLength(L)时,删除位置无效
            {
                printf("删除位置无效!!!
    ");
                return false;
            }
            q=p->next;
            p->next=q->next;
            free(q);//释放空间
            return true;
        }
        //查找函数 按值查找 查找第一个等于e的结点 成功返回该结点指针,否则返回NULL
        LNode *LocateElem(LinkList L,ElemType e)
        {
            LNode *p=L;
            while(p&&(p->data!=e))
            {
                p=p->next;
            }
            return p;
        }
        //**************************功能实现函数**************************//
        //遍历输出函数
        void PrintList(LinkList L)
        {
            LinkList p=L->next;//跳过头结点
            if(ListLength(L))
            {
                printf("当前单链表所有元素:");
                while(p)
                {
                    printf("%d ",p->data);
                    p=p->next;
                }
                printf("
    ");
            }
            else
            {
                printf("当前单链表已空!
    ");
            }
        }
        //插入功能函数 调用ListInsert后插
        void Insert(LinkList &L)
        {
          int place;ElemType e;bool flag;
          printf("请输入要插入的位置(从1开始)及元素:
    ");
          scanf("%d%d",&place,&e);
          flag=ListInsert(L,place,e);
          if(flag)
          {
            printf("插入成功!!!
    ");
            PrintList(L);
          }
        }
        //删除功能函数 调用ListDelete删除
        void Delete(LinkList L)
        {
          int place;bool flag;
          printf("请输入要删除的位置(从1开始):
    ");
          scanf("%d",&place);
          flag=ListDelete(L,place);
          if(flag)
          {
            printf("删除成功!!!
    ");
            PrintList(L);
          }
        }
        //查找功能函数 调用LocateElem查找
        void Search(LinkList L)
        {
          ElemType e;LNode *q;
          printf("请输入要查找的值:
    ");
          scanf("%d",&e);
          q=LocateElem(L,e);
          if(q)
          {
            printf("找到该元素!
    ");
          }
          else
            printf("未找到该元素!
    ");
        }
        //菜单
        void menu()
        {
           printf("********1.后插    2.删除*********
    ");
           printf("********3.查找    4.输出*********
    ");
           printf("********5.退出          *********
    ");
        }
        //主函数
        int main()
        {
         LinkList L;int choice;
         InitList(L);
         while(1)
         {
          menu();
          printf("请输入菜单序号:
    ");
          scanf("%d",&choice);
          if(choice==5) break;
          switch(choice)
          {
          case 1:Insert(L);break;
          case 2:Delete(L);break;
          case 3:Search(L);break;
          case 4:PrintList(L);break;
          default:printf("输入错误!!!
    ");
          }
         }
         return 0;
        }
  • 相关阅读:
    ajax实现异步请求的过程
    GET和POST的区别,何时使用POST?
    函数有几种调用方式?
    substring、slice、substr的区别
    Spring 调用 Stored Procedure 并获取返回值
    Oracle 中, 使用 Instr 函数 替换 OR
    Oracle Materialized View refresh
    Oracle中Union 和 Union All
    toString() 和 强制类型转换 (String)
    2013年这一年
  • 原文地址:https://www.cnblogs.com/yangf428/p/11546055.html
Copyright © 2011-2022 走看看