數據結構-單鏈表基本操作實現(含全部代碼)


 

版權聲明:本文為博主原創文章,遵循 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("插入位置無效!!!\n");
            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("刪除位置無效!!!\n");
            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("\n");
        }
        else
        {
            printf("當前單鏈表已空!\n");
        }
    }
    //插入功能函數 調用ListInsert后插
    void Insert(LinkList &L)
    {
      int place;ElemType e;bool flag;
      printf("請輸入要插入的位置(從1開始)及元素:\n");
      scanf("%d%d",&place,&e);
      flag=ListInsert(L,place,e);
      if(flag)
      {
        printf("插入成功!!!\n");
        PrintList(L);
      }
    }
    //刪除功能函數 調用ListDelete刪除
    void Delete(LinkList L)
    {
      int place;bool flag;
      printf("請輸入要刪除的位置(從1開始):\n");
      scanf("%d",&place);
      flag=ListDelete(L,place);
      if(flag)
      {
        printf("刪除成功!!!\n");
        PrintList(L);
      }
    }
    //查找功能函數 調用LocateElem查找
    void Search(LinkList L)
    {
      ElemType e;LNode *q;
      printf("請輸入要查找的值:\n");
      scanf("%d",&e);
      q=LocateElem(L,e);
      if(q)
      {
        printf("找到該元素!\n");
      }
      else
        printf("未找到該元素!\n");
    }
    //菜單
    void menu()
    {
       printf("********1.后插    2.刪除*********\n");
       printf("********3.查找    4.輸出*********\n");
       printf("********5.退出          *********\n");
    }
    //主函數
    int main()
    {
     LinkList L;int choice;
     InitList(L);
     while(1)
     {
      menu();
      printf("請輸入菜單序號:\n");
      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("輸入錯誤!!!\n");
      }
     }
     return 0;
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM