• 数据结构(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#

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

  • 相关阅读:
    【C#】Send data between applications
    【C#】Switch datatype between object and byte[]
    【C#】Get the html code of a webpage
    MSIL Hello World
    MonoGame 3.2 下,截屏与 Texture2D 的保存
    mciSendString 的两个小坑
    virtual 修饰符与继承对析构函数的影响(C++)
    让 OpenAL 也支持 S16 Planar(辅以 FFmpeg)
    博客园第一篇——SDL2+FFmpeg 制作简单播放器&同步
    第五次UML作业——结对作业二:班级成绩表
  • 原文地址:https://www.cnblogs.com/xiaowenhu/p/xiaotiger_2.html
Copyright © 2020-2023  润新知