【复习代码】单链表

来源:互联网 发布:营销qq for mac 编辑:程序博客网 时间:2024/06/03 21:56

没有单独编写头文件和测试函数,写在同一个文件中。详细解释在【复习笔记】


#include<stdio.h> 

#include<stdlib.h>


#define TURE  1
#define FALSE 0
typedef int data_t;


typedef struct LNode {
    data_t data;
    struct LNode *next;
}LNode, *LinkList;


LinkList CreateLinkList(void)
{
    LinkList L = (LNode *)malloc(sizeof(LNode));


    if(NULL == L)
    {
        return NULL;
    }


    L->next = NULL;


    return L;
}


void ClearLinkList(LinkList L)
{
    LinkList q;
    while(L->next)
    {
        q = L->next;
        L->next = q->next;
        free(q);
    }
    q = NULL;   //防止q变成野指针
}


int LengthLinkList(LinkList L)
{
    int count = 0;
    LinkList p = L->next;
    while(p)
    {
        count ++;
        p = p->next;
    }
    return count;
}


int IsEmpty(LinkList L)
{
#if 0
    if(L->next)
    {
        return FALSE;
    }
    return TRUE;
#endif


#if 1
    if(0 == LengthLinkList(L))
    {
        return TURE;
    }
    return FALSE;
#endif
}


LinkList LocateLinkList(LinkList L, data_t x)
{
    LinkList p = L->next;
    while(p)
    {
        if(x == p->data)
        {
            return p;
        }
        p = p->next;
    }


    return NULL;
}


LinkList FindLinkList(LinkList L, int i)
{
    if(i<1 || i>LengthLinkList(L))
    {
        return NULL;
    }


    LinkList p = L->next;
    int j;
    for(j = 1; j < i; j ++)
    {
        p = p->next;
    }
    return p;
}


int InsertLinkList(LinkList L, data_t x, int i)
{
    if(i<1 || i>(LengthLinkList(L)+1))
    {
        return FALSE;
    }


    LinkList p = L;
    int j;


    for(j = 1; j < i; j ++)
    {
        p = p->next;
    }


    LinkList Q = (LinkList)malloc(sizeof(LNode));
    if(Q != NULL)
    {
        Q->data = x;
        Q->next = NULL;
    }


    Q->next = p->next;
    p->next = Q;


    return TURE;
}


int DelLinkList(LinkList L, int i)
{
    if(i<1 || i >LengthLinkList(L))
    {
        return FALSE;
    }


    LinkList p = L;
    int j;


    for(j = 1; j < i; j ++)
    {
        p = p->next;
    }


    LinkList q = p->next;
    p->next = q->next;
    q->next = NULL;
    free(q);
    return TURE;
}


void DisplayLinkList(LinkList L)
{
    LinkList p = L->next;
    while(p)
    {
        printf("%-d ", p->data);
        p = p->next;
    }
    printf("\n");
}


void RevLinkList(LinkList L)
{
    LinkList p, q = L->next;
    L->next = NULL;
    while(q)
    {
        p = q->next;
        q->next = L->next;
        L->next = q;
        q = p;
    }
}


LinkList MergeLinkList(LinkList L1, LinkList L2)
{
    LinkList p1 = L1->next, p2 = L2->next;
    LinkList r = L1;
    free(L2);


    while(p1 && p2)
    {
        if(p1->data > p2->data)
        {
            r->next = p2;
            p2 = p2->next;
        }
        else
        {
            r->next = p1;
            p1 = p1->next;
        }
        r = r->next;
    }


    if(p1)
    {
        r->next = p1;
    }
    if(p2)
    {
        r->next = p2;
    }


    return L1;
}




int main()
{
    LinkList L1 = CreateLinkList();
    LinkList L2 = CreateLinkList();


    int i;
    for(i = 1; i <= 5; i ++)
    {
        InsertLinkList(L1, i, i);
    }


    for(i = 1; i <= 10; i++ )
    {
        InsertLinkList(L2, i+2, i);
    }
    DisplayLinkList(L1);
    DisplayLinkList(L2);


    printf("isempty: %d\n",IsEmpty(L1));


    DelLinkList(L2, 3);
    DisplayLinkList(L2);


    MergeLinkList(L1, L2);
    DisplayLinkList(L1);


    printf("length: %d\n", LengthLinkList(L1));


    printf("L1(10): %p\n", FindLinkList(L1, 10));


    printf("Locate L1(shi): %p\n", LocateLinkList(L1, 10));


    RevLinkList(L1);
    DisplayLinkList(L1);


    ClearLinkList(L1);
    DisplayLinkList(L1);
    return 0;
}
0 0
原创粉丝点击