您的位置:首页 > 理论基础 > 数据结构算法

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

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

(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: