数据结构(C语言版)---第二章2.8-2.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#

 

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

posted on 2013-06-05 10:31  净坛使者  阅读(1112)  评论(2编辑  收藏  举报

导航