码迷,mamicode.com
首页 > 其他好文 > 详细

单向链表

时间:2015-01-24 21:16:41      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:

链表有两种类型.一种是带有表头的和不带有表头的,其实基本操作都差不多。只是在带有表头的链表中,第一个节点没放东西,属于浪费资源,但是便于插入和删除,主要针对的是第一个节点的操作。(个人习惯用带有表头的链表)

//链表的基本操作(带有表头)

#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;

typedef struct node
{
    ElemType data;
    struct node *next;
}LNode, *LinkList;

//初始化链表 (只建表头)
void InitLinkList(LinkList &L)
{
    LinkList p = NULL;
    if (NULL == L)
    {
        p = (LinkList)malloc(sizeof(LNode));
        if (NULL == p)
        {
            printf("内存分配失败\n");
            free(p);
            exit(0);
        }

        L = p;
        L->next = NULL;
    }
    else
    {
        printf("链表不为空,无需初始化\n");
        exit(0);
    }
}

//插入元素
void InsertLinkList(LinkList &L, int nInsertPoint, ElemType nInsertValue)
{
    LinkList p = NULL, r = NULL;
    int i = 0;

    if (NULL == L)
    {
        printf("表头为空,请先初始化\n");
        exit(0);
    }

    r = (LinkList)malloc(sizeof(LNode));
    if (NULL == r)
    {
        printf("内存分配失败\n");
        free(r);
        exit(0);
    }
    r->data = nInsertValue;
    
    p = L;
    while ((NULL != p) && (i < nInsertPoint - 1))   //合法插入点,指针移动,定位到带插入点之前
    {
        p = p->next;
        i++;
    }

    while ((NULL == p) || (i > nInsertPoint - 1))   //非法插入点。 前者:插入点越界; 后者:插入点<=0;
    {
        printf("非法插入点,请检查参数\n");
        exit(0);
    }

    r->next = p->next;
    p->next = r;
}

//校验头指针和其next域是否为空
void CheckLinkList(LinkList L)
{
    if (NULL == L)
    {
        printf("指针为空,请检查参数\n");
        exit(0);
    }
    if (NULL == L->next)
    {
        printf("链表为空,无法销毁.\n");
        exit(0);
    }
}

//输出链表
void PrintLinkList(LinkList L)
{
    LinkList p = NULL;
    int i = 0;

    CheckLinkList(L);
    
    p = L->next;        //注意:此处不是p = L;
    while (NULL != p)
    {
        printf("%d ", p->data);
        p = p->next;
    }

    printf("\n");
}

//删除节点
void DeleteLinkList(LinkList &L, int nDeletePoint)
{
    LinkList p = NULL, r = NULL;
    int i = 0;

    CheckLinkList(L);

    p = L;
    while ((NULL != p) && (i < nDeletePoint - 1))        //指针移动到删除点之前
    {
        p = p->next;
        i++;
    }

    while ((NULL == p) || (i > nDeletePoint - 1))        //非法删除点。前者:是否越界; 后者:删除点是否<=0
    {
        printf("非法删除点.\n");
        exit(0);
    }

    //删除节点
    r = p->next;
    p->next = r->next;

    free(r);
}

//销毁链表
void DestroyLinkList(LinkList &L)
{
    LinkList p = NULL, r = NULL;

    CheckLinkList(L);

    p = L->next;        //注意:此处不是p = L;
    while (NULL != p)
    {
        r = p;
        p = p->next;
        free(r);
    }

    printf("成功销毁链表\n");
}

//通过查找点,查找元素值 (返回p->data)
ElemType FindElem(LinkList L, int nFindPoint)
{
    LinkList p = NULL;
    int i = 0;

    CheckLinkList(L);

    p = L;
    while ((NULL != p) && (i < nFindPoint))
    {
        p = p->next;
        i++;
    }
    while ((NULL == p) || (i > nFindPoint) || 0 == nFindPoint)            //非法查找点。前者:是否越界; 后者:删除点是否<=0
    {
        printf("非法查找点.\n");
        exit(0);
    }

    return p->data;
}

//通过元素查找,若存在,返回其位序,否则返回-1
int LocateElem(LinkList L, ElemType elem)
{
    LinkList p = NULL;
    int nSeq = 1;

    CheckLinkList(L);

    p = L->next;
    while ((NULL != p) && (elem != p->data))
    {
        nSeq++;
        p = p->next;
    }

    if (NULL == p)
    {
        return -1;        //没找到
    }
    else
    {
        return nSeq;    
    }
}

int LengthOfLinkList(LinkList L)
{
    LinkList p = NULL;
    int nLength = 0;
    
    CheckLinkList(L);

    p = L->next;
    while (NULL != p)
    {
        nLength++;
        p = p->next;
    }
    return nLength;
}


int main()
{
    LinkList La = NULL;
    int nInsertCount;  //待插入元素个数
    int nInsertValue;  //待插入元素值
    int i = 0;

    InitLinkList(La);

    printf("请输入插入个数:");
    scanf("%d", &nInsertCount);

    while (i < nInsertCount)
    {
        printf("为p->data赋值:");
        scanf("%d", &nInsertValue);

        InsertLinkList(La, i + 1, nInsertValue);        //插入元素

        i++;
    }

    /*-------------测试查找-------------
    int x = FindElem(La, -1);
    printf("%d\n", x);
    */

    /*-------------测试序号-------------
    int nSeq = LocateElem(La, 3);
    printf("%d\n", nSeq);
    */


    /*-------------测试长度-------------
    int nLength = LengthOfLinkList(La);
    printf("%d\n", nLength);
    */
    
    /*-------------测试删除-------------
    //删除前
    PrintLinkList(La);

    //删除后
    DeleteLinkList(La, 4);
    PrintLinkList(La);
    */

    DestroyLinkList(La);

    return 0;
}

 本文转自:http://www.cnblogs.com/michaelGood/archive/2012/10/16/2725831.html

单向链表

标签:

原文地址:http://www.cnblogs.com/gaowf/p/4246492.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!