线性表的存储结构(链式存储结构)

距上一次写线性表的顺序存储结构已经有一段时间了(详戳http://blog.csdn.net/u010429311/article/details/50933932),这次主要接着来实现线性表的链式存储结构,即我们通常所说的链表。
链表可以用一组任意的存储单元存储线性表的数据元素,而存储数据的这组存储单元可以是连续的,也可以是不连续的。具体看一下图解:
这里写图片描述
在链表中,我们也可以实现链表的创建、插入、删除等操作。其原理如下图:
这里写图片描述
以下是具体的实现代码:
定义结构体:

#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;

typedef struct LNode{
    ElemType data;    //结点的数据
    struct LNode *next;   //指向下一结点的指针
} LNode, *LinkList;

创建链表:

/*
*逆序往链表里插入n个元素
*/
Status createList(LinkList &L, int n) {
    LinkList p;   
    L = (LinkList) malloc(sizeof(LNode));  //申请结点空间
    L->next = NULL;   //建立带头结点的链表
    for (; n > 0; n--) {
        p = (LinkList) malloc(sizeof(LNode)); //生成新结点
        scanf("%d", &p->data);  //输入结点的元素
        p->next = L->next;   //插入到表头
        L->next = p; 
    }
    return OK;
}

插入元素:

/*
*往链表的第i个位置插入元素
*/
Status listInsert(LinkList &L, int i, ElemType e) {
    LinkList p, s;
    p = L;
    int j = 0;
    while (p && j < i - 1) {  //寻找第i-1个结点
        p = p->next;  
        j++;
    }
    if (!p || j > i - 1) return ERROR;
    s = (LinkList) malloc(sizeof(LNode)); //申请新结点
    s->data = e;  //插入新的结点
    s->next = p->next;
    p->next = s;
    return OK;
}

删除元素:

Status listDelete(LinkList &L, int i, ElemType &e) {
    LinkList p, q;
    p = L;
    int j = 0;
    while (p->next && j < i - 1) {  //寻找第i个结点
        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;
}

遍历链表:

Status loadList(LinkList &L) {
    if (L->next == NULL) {
        return ERROR;
    }
    LinkList p;
    p = L->next;  //注意,头结点没有存放数值,应从L->next开始遍历
    while(p) {    //遍历结点,输出数值
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
    return OK;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值