zoukankan      html  css  js  c++  java
  • 数据结构(C语言版)第二章2.82.11 动态链表

    主要实现以下几个接口:

    1. 顺序创建动态链表。

    2. 打印所有链表内容。

    3. 取得特定位置的链表内容。

    4. 向指定位置插入链表元素。

    5. 将两个链表整合成一个链表。

    具体代码如下,实现还是生成动态库。

    LinkList.h

    #ifndef _LINK_LIST_H
    #define _LINK_LIST_H
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define OK   1
    #define ERROR -1
    
    
    typedef int ElemType;
    typedef int Status;
    
    
    typedef struct LNode_
    {
        ElemType data;
        struct LNode_ *next;
        
    }LNode,*PLinkList;
    
    
    PLinkList CreateLinkList(PLinkList L,int n);
    
    void PrintLinkList(PLinkList L);
    
    
    void DestoryLinkList(PLinkList L);
    
    Status GetElem(PLinkList L,int turn, ElemType *pe);
    
    Status ListInsert(PLinkList L,int turn,ElemType e);
    
    Status ListDelete(PLinkList L,int turn, ElemType *pe);
    
    
    
    
    #endif

    LinkList.c

    #include "LinkList.h"
    
    /*2.8------2.11*/
    
    
    PLinkList CreateLinkList(PLinkList L,int n)
    {
        PLinkList p,p_head,p_temp;
    
        L = (PLinkList )malloc(sizeof(LNode));
    
        if(!L)
        {
            exit(0);
        }
    
        L->data = 0;
        L->next = NULL;
        
        p_head = L;
    
        int i = 0;
        int j = 0;
        p_temp = p_head;
    
        for(;i < n ; i++)
        {
            p = (PLinkList )malloc(sizeof(LNode));
    
            if(!p)
            {
                exit(0);
            }
    
            p->data = n*i - 4;
    
            //get the head
            if(p_temp->next)
            {
    #if 0        
                p_temp = p_head;
                for(j = 0 ; j < p_head->data ; j++)
                {
                    p_temp = p_temp->next;
                }        
    #endif            
                p_temp = p_temp->next;
            }
            
            p_temp->next = p;
            p->next = NULL;
            p_head->data += 1;
    
        }
    
        return L;
    }
    
    
    
    void PrintLinkList(PLinkList L)
    {
        int i = 0;
    
        PLinkList p;
        p = L;
        int len = p->data;
    
        for(; i < len ; i++)
        {
            p = p->next;
            printf("%d/%d: %p  %d\n",i,len,p,p->data);
                
        }
        printf("\n");
    }
    
    
    void DestoryLinkList(PLinkList L)
    {
        int i = 0;
    
        PLinkList p;
        p = L;
    
        int len = p->data;
    
        for(;i < len ; i++)
        {
            p = p->next;
            free(p);
        }
    }
    
    
    Status GetElem(PLinkList L,int turn, ElemType *pe)
    {
        PLinkList p;
        p = L;
    
        int i = 0;
    
        if((turn < 0 )|| (turn > p->data))
        {
            return -1;
        }
    
        for(; i < turn ; i++)
        {
            p = p->next;
    
        }
    
        if(!p)
        {
            return -2;
        }
    
        *pe = p->data;
    
        printf("%d in the list is %d\n\n",turn,*pe);
        return OK;
    
    }
    
    
    Status ListInsert(PLinkList L,int turn,ElemType e)
    {
        PLinkList p;
        p = L;
        
        int i = 0;
        if((turn < 0 ))
        {
            return -1;
        }
    
        //get the elem just before turn
        for(; i < turn-1 ; i++)
        {
            p = p->next;
    
        }
    
        if(!p)
        {
            return -2;
        }    
    
        PLinkList q;
        q = (PLinkList)malloc(sizeof(LNode));
        
        if(!q)
        {
            exit(0);
        }    
        q->data = e;
    
        //turn the pointer to next
        q->next = p->next;
        p->next = q;
    
        L->data += 1;
    //printf("------%d\n",L->data);
        return OK;
    
    }
    
    Status ListDelete(PLinkList L,int turn, ElemType *pe)
    {
        PLinkList p,q;
        p = L;
    
        int i = 0;
        if((turn < 0 )|| (turn > p->data))
        {
            return -1;
        }
    
        //get the elem just before turn
        for(; i < turn-1 ; i++)
        {
            p = p->next;
    
        }
    
        if(!p)
        {
            return -2;
        }    
        
        q = p->next;//Notice !!! if do like this , will get wrong, q = p; free(q->next); !!!
        *pe = p->next->data;
        
        p->next = p->next->next;
        
        free(q);
    
        printf("%d in the list : %d deleted\n\n",turn,*pe);
    
        L->data -= 1;
        return OK;
    
    }
    
    Status MergeList(PLinkList La,PLinkList Lb,PLinkList Lc)
    {
        int i = 0;
    
        int len_a = La->data;
        int len_b = Lb->data;
    
        PLinkList p,q,r;
    
        p = La;
        q = Lb;
        
        p = p->next;
        q = q->next;    
        Lc = r = La;
    
        while((p) && (q))
        {
            if(p->data <= q->data)
            {
                r->next = p;
                r = p;
                p = p->next;
            }
            else
            {
                r->next = q;
                r = q;
                q = q->next;
            }
            
        }
    
        if(p)
        {
            r->next = p;
         }
    
        if(q)
        {
            r->next = q;
        }
        Lc->data = len_a+len_b;
        
        PrintLinkList(Lc);
        return OK;
    
    }

    编译成动态库: gcc LinkList.c -fPIC -shared -o libLinkList.so

    测试主程序 Test_2.c

    #include "LinkList.h"
    
    
    int main(int argc,char ** argv)
    {
    
        PLinkList p;
        p = CreateLinkList(p,10);
        printf("--------------------p--------------------\n");
        PrintLinkList(p);
    
        int a = 0;
        GetElem(p,6, &a);
        
        printf("-------------------- insert p 188/8--------------------\n");
        ListInsert(p,8,188);
        PrintLinkList(p);
    
        printf("--------------------delete p  4--------------------\n");
        ListDelete(p, 4,&a);
        PrintLinkList(p);
    
        PLinkList q;
        q = CreateLinkList(q,5);
        printf("--------------------q--------------------\n");
        PrintLinkList(q);
    
        printf("--------------------p + q--------------------\n");
        PLinkList r;
        MergeList(p,q,r);
    
    
        DestoryLinkList(p);
        DestoryLinkList(q);
        exit(0);
    }

    编译运行:gcc -o test_2 test_2.c ./libLinkList.so

    运行结果:

    root@ubuntu:/mnt/hgfs/E/Lessons/MyExercise/DS/2# ./test_2
    --------------------p--------------------
    0/10: 0x8cc0018 -4
    1/10: 0x8cc0028 6
    2/10: 0x8cc0038 16
    3/10: 0x8cc0048 26
    4/10: 0x8cc0058 36
    5/10: 0x8cc0068 46
    6/10: 0x8cc0078 56
    7/10: 0x8cc0088 66
    8/10: 0x8cc0098 76
    9/10: 0x8cc00a8 86

    6 in the list is 46

    -------------------- insert p 188/8--------------------
    0/11: 0x8cc0018 -4
    1/11: 0x8cc0028 6
    2/11: 0x8cc0038 16
    3/11: 0x8cc0048 26
    4/11: 0x8cc0058 36
    5/11: 0x8cc0068 46
    6/11: 0x8cc0078 56
    7/11: 0x8cc00b8 188
    8/11: 0x8cc0088 66
    9/11: 0x8cc0098 76
    10/11: 0x8cc00a8 86

    --------------------delete p 4--------------------
    4 in the list : 26 deleted

    0/10: 0x8cc0018 -4
    1/10: 0x8cc0028 6
    2/10: 0x8cc0038 16
    3/10: 0x8cc0058 36
    4/10: 0x8cc0068 46
    5/10: 0x8cc0078 56
    6/10: 0x8cc00b8 188
    7/10: 0x8cc0088 66
    8/10: 0x8cc0098 76
    9/10: 0x8cc00a8 86

    --------------------q--------------------
    0/5: 0x8cc00c8 -4
    1/5: 0x8cc00d8 1
    2/5: 0x8cc00e8 6
    3/5: 0x8cc00f8 11
    4/5: 0x8cc0108 16

    --------------------p + q--------------------
    0/15: 0x8cc0018 -4
    1/15: 0x8cc00c8 -4
    2/15: 0x8cc00d8 1
    3/15: 0x8cc0028 6
    4/15: 0x8cc00e8 6
    5/15: 0x8cc00f8 11
    6/15: 0x8cc0038 16
    7/15: 0x8cc0108 16
    8/15: 0x8cc0058 36
    9/15: 0x8cc0068 46
    10/15: 0x8cc0078 56
    11/15: 0x8cc00b8 188
    12/15: 0x8cc0088 66
    13/15: 0x8cc0098 76
    14/15: 0x8cc00a8 86

    root@ubuntu:/mnt/hgfs/E/Lessons/MyExercise/DS/2#

    其中不足之处,望朋友们不吝指正,谢谢!

  • 相关阅读:
    如何在Ubuntu Server 18.04上安装Microsoft的Procmon
    如何在Ubuntu 20.04上安装Wine 5.0
    如何在Kali Linux 2020中启用SSH服务
    如何在Ubuntu 20.04 LTS Focal Fossa上安装Apache Groovy
    如何使用命令在Ubuntu 20.04 Linux上安装Vmware Tools
    在Ubuntu 20.04 LTS Focal Fossa上安装Zabbix Agent
    hdu 2089 不要62
    hdu 2093 成绩排名
    hdu 2104 hide handkerchief
    leetcode147对链表进行插入排序
  • 原文地址:https://www.cnblogs.com/xiaowenhu/p/xiaotiger_2.html
Copyright © 2011-2022 走看看