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

来源:互联网 发布:淘宝手机卡怎么领取 编辑:程序博客网 时间:2024/05/18 03:24

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

#include <stdio.h>#include <malloc.h>#define OK 1#define ERROR 0typedef 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;}
2 0
原创粉丝点击