上一节讲述了线性表的顺序存储,对于线性表的顺序存储出现的问题,需要分配一整段连续的存储空间失败的可能性较之于链式存储大,同时进行数据插入和删除的时候可能造成需要移动整个线性表。下面要说的线性表的链式存储很好的解决了上述出现的问题,相比较于顺序存储链式存储稍微难理解一些,编程的难度也稍微大一些。
下面讲述线性表链式存储的一些函数:
初始化线性表
List * ListInit();
销毁线性表
int ListDestroy(List *list);
设置线性表为空
int ListClear(List *list);
获取线性表的长度
int ListLength(pList list);
判断线性表是否为空
int ListEmpty(pList list);
获取线性表的对应位置的值
int GetElem(pList list,int index);
获取此线性表中是否存在此数据,存在返回此数据在线性表中的位置
int LocateElem(pList list,int data);
判断此数据是线性表中若不是线性表首数据返回前驱值,如果是返回空
int PreElem(pList list,int data);
判断此数据是线性表中若不是线性表尾数据返回后继值,如果是返回空
int SuccElem(pList list,int data);
在线性表的指定位置插入数据
int ListInsert(pList list,int index,int data);
在线性表的制定位置删除数据
int ListDel(pList list,int index);
输出线性表的数据
void ListDisplay(pList list);
源程序:
list.h
#ifndef _LIST_H#define _LIST_H#define LIST_ERR -1#define LIST_OK 0typedef struct{ int data; struct ListNode * next;}ListNode,*plistnode;typedef struct{ plistnode head; unsigned int length;}List,*pList;/**初始化线性表*/List * ListInit();/**销毁线性表*/int ListDestroy(List *list);/**设置线性表为空*/int ListClear(List *list);/**获取线性表的长度*/int ListLength(pList list);/**判断线性表是否为空*/int ListEmpty(pList list);/**获取线性表的对应位置的值*/int GetElem(pList list,int index);/**获取此线性表中是否存在此数据,存在返回此数据在线性表中的位置*/int LocateElem(pList list,int data);/**判断此数据是线性表中若不是线性表首数据返回前驱值,如果是返回空*/int PreElem(pList list,int data);/**判断此数据是线性表中若不是线性表尾数据返回后继值,如果是返回空*/int SuccElem(pList list,int data);/**在线性表的指定位置插入数据*/int ListInsert(pList list,int index,int data);/**在线性表的制定位置删除数据*/int ListDel(pList list,int index);/**输出线性表的数据*/void ListDisplay(pList list);#endif
![19613b8db01b98319cb111bc2b5f049a.gif](https://i-blog.csdnimg.cn/blog_migrate/32b507f1b26b2e5a4ca7f2fd53027c86.gif)
list.c
#include #include "list.h"static ListNode *Getindex(pList list,int index);List * ListInit(){ List *list=NULL; printf("开始分配地址"); if(NULL==(list=(ListNode *)malloc(sizeof(List)))) { printf("分配地址空间失败"); return LIST_ERR; } printf("分配的地址为%u