Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7724134
  • 博文数量: 961
  • 博客积分: 15795
  • 博客等级: 上将
  • 技术积分: 16612
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 14:23
文章分类

全部博文(961)

文章存档

2016年(1)

2015年(61)

2014年(41)

2013年(51)

2012年(235)

2011年(391)

2010年(181)

分类: C/C++

2011-05-19 10:36:15

/*

 * 链表实现函数

 * Lzy     2011-5-18

 */

#include

 

typedef int ElemType;

 

typedef struct Node

{

    ElemType data;            /*结点值*/

    struct Node *next;       /*存储下一个结点的地址*/

}LNode, *LinkList;

 

void LinkListInitlist(LinkList *L)     /*建立一个空的带头结点的单链表*/

{

    (*L) = (LNode *)malloc(sizeof(LNode));

    (*L)->next = NULL;  

}

 

void LinkListCreate(LinkList L)     /*建立一个单链表*/

{

    LNode *p1, *p2;

    p1 = L;

       

    while(1)

    {

        p2 = (LNode *)malloc(sizeof(LNode));

        printf("输入要保存的数据(-1结束)");

        scanf("%d",&p2->data);

        if(p2->data == -1)

            break;

        p1->next = p2;

        p1 = p2;

    }

    p1->next = NULL;

}

 

int LinkListGetlen(LinkList L)          /*求链表长度*/

{

    int num = 0;

    LNode *p = L->next;

 

    while(p)                       /*结点不为空*/

    {

        num++;                     /*计数加一*/

        p = p->next;                 

    }

 

    return num;

}

 

LNode *LinkListGetelembyNum(LinkList L,int n)     /*按序号取元素*/

{

    int num = 1;

    LNode *p = L->next;

 

    if(n < 1 || n > LinkListGetlen(L))     /*检查序号是否合法*/

    {

        printf("序号有误!\n");

        return 0;

    }

   

    while(num < n)

    {

        num++;                         /*序号加一*/

        p = p->next;                 

    }

    return p;

}

 

LNode *LinkListLocate(LinkList L, ElemType X)     /*查找运算*/

{

    LNode *p;

 

    for(p = L->next; p != NULL; p = p->next)

    {

        if(p->data == X)                  /*判断数据域是否相等*/

            return p;

    }

    printf("没有这元素!\n");

    return 0;

}

 

int LinkListInsert(LinkList L,int n, ElemType X) /*在第n个元素后插入元素X*/

{

    LNode *p1, *p2;

 

    p1 = LinkListGetelembyNum(L,n); /*查找第n个节点*/

    if(p1 == 0)

        return 0;

 

    p2 = (LNode *)malloc(sizeof(LNode));       /*给新节点分配存储空间*/

    p2->data = X;

 

    p2->next = p1->next;     /*插入位置后继节点的指针域给新节点的指针域*/

    p1->next = p2;                /*插入位置指针域更改为新节点的指针*/

    return 1;

}

 

ElemType LinkListDelelem(LinkList L,int n)    /*在第n个元素后删除*/

{

    LNode *p1, *p2;

    ElemType temp;

    p1 = LinkListGetelembyNum(L,n); /*查找第n个节点*/

    if(p1 == 0)

        return 0;

 

    p2 = p1->next;

    temp = p2->data;

 

    p1->next = p2->next; /*删除p2所指向的节点*/

    free(p2);

    return temp;      /*返回删除元素的值*/

}

 

void LinkListDisp(LinkList L)       /*链表元素输出*/

{

    LNode *p;

    p = head->next;

    while(p)

    {

        printf("%d ",p->data);

        p = p->next;

    }

    printf("\n");

}

——部分:Linux C

阅读(1937) | 评论(0) | 转发(2) |
0

上一篇:C_顺序表

下一篇:C_双向循环链表

给主人留下些什么吧!~~