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

数据结构学习之单向链表的基本操作(非递归实现)

时间:2015-06-18 22:13:31      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:链表   带头结点   

【摘要】本文讨论的均为带头结点的线性链表的基本操作,包括创建、删除、插入、打印等等,欢迎大家批评指正错误。

(1)单链表存储结构

typedef struct LNode
{
     int data;
     struct LNode *next;
}LinkList;

(2)创建链表

/* 功能:构建一个空的带头节点的单链表*/
Status InitList (struct LNode **L)
{
    (*L) = (struct LNode *)malloc(sizeof(struct LNode)); //产生头节点

    if(!*L){
        return ERROR;
    }

    (*L)->next = NULL;//作为结束标志位

    return OK;
}

(3)删除链表

/*带头结点链表删除*/
Status ClearList(struct LNode *L)//
{
    LinkList *p,*q;
    p = L->next; //第一个结点

    while(p)
    {
        q = p->next;
        free(p);
        p = q;
    }

    L->next = NULL; //头结点指针域清空
    return OK;
}

(4)插入数据

/* 在带头节点的单链表L中的第i个位置之前插入元素e*/
Status ListInsert(struct LNode *L,int i,int e)
{
    int j =0;
    struct LNode *p=L,*s=NULL;

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

    if(!p || j>i-1)//没有找到
        return ERROR;

    s = (struct LNode *)malloc(sizeof(struct LNode));

    if(!s)
        printf("malloc error~\n");

    s->data = e;
    s->next = p->next;//插入节点
    p->next = s;

    return OK;
}

(4)删除单个节点

/*在带头节点的单链表中删除第i个元素,并有e返回其值*/
Status ListDelete(LinkList *L,int i,int *e)
{

    LinkList *p=L,*q;
    int j=0;

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

    if(!p->next || j>i-1)
        return ERROR;

    q = p->next; //保存下来
    p->next = q->next;
    *e = q->data;

    free(q);
    return OK;
  }

(5)打印数据

/* 依次对L的每个元素打印输出数据*/
Status ListTraverse(struct LNode *L,void (*vi)(int))
{
    LinkList *p = L->next;  //第一个结点

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

    printf("\n");
    return OK;
}

数据结构学习之单向链表的基本操作(非递归实现)

标签:链表   带头结点   

原文地址:http://blog.csdn.net/xy010902100449/article/details/46552029

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