数据结构基础【03】单链表

来源:互联网 发布:淘宝换购拍下 编辑:程序博客网 时间:2024/06/03 15:41

单链表

定义:用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)

实现

基本操作

初始化 InitList
销毁 DestroyList
清空 ClearList
判断是否为空 ListEmpty
元素个数 ListLength
取出元素 GetElem
查找 LocateElem
插入元素 ListInsert
删除元素 ListDelete
前插法创建 CreateList_H
后插法创建 CreateList_R
遍历元素 TraverseList

单链表的具体实现(带头结点)

存储结构定义

#define MAXSIZE 100 //顺序表可能达到的最大长度#define OK 1#define ERROR 0#define OVERFLOW -2//结构定义typedef struct LNode{  int data;           //数据域  struct LNode *next; //节点的指针域} LNode, *LinkList;

初始化

int InitList(LinkList &L){  //构造空的单链表  L = new LNode;  L->next = NULL;  return OK;}

销毁

int DestroyList(LinkList &L){  LinkList q;  while (L)  {    q = L->next;    delete L;    L = q;  }  return OK;}

清空

int ClearList(LinkList L){  LinkList p, q;  p = L->next;  while (p)  {    q = p->next;    delete p;    p = q;  }  L->next = NULL;  return OK;}

判断是否为空

bool ListEmpty(LinkList L){  if (L->next = NULL)    return true;  return false;}

元素个数

int ListLength(LinkList L){  int i = 0;  while (L)  {    i++;    L = L->next;  }  return i;}

取出元素

int GetELem(LinkList L, int i, int &e){  LinkList p;  int j;  p = L->next;  j = 1;  while (p && j < i)  {    p = p->next;    j++;  }  if (!p || j > i)    return ERROR;  e = p->data;  return OK;}

查找

LNode *LocateElem(LinkList L, int e){  LinkList p;  p = L->next;  while (p && p->data != e)  {    p = p->next;  }  return p;}

插入元素

int ListInsert(LinkList &L, int i, int e){  LinkList p, s;  p = L;  int j = 0;  while (p && j < i - 1)  {    p = p->next;    j++;  }  if (!p || j > i - 1)    return ERROR;  s = new LNode;  s->data = e;  s->next = p->next;  p->next = s;  return OK;}

删除元素

int ListDelete(LinkList &L, int i){  LinkList p, q;  p = L;  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;  delete q;  return OK;}

前插法创建

void CreateList_H(LinkList &L, int n){  LinkList p;  L = new LNode;  L->next = NULL;  for (int i = 0; i < n; i++)  {    p = new LNode;    scanf("%d",&p->data);    p->next = L->next;    L->next = p;  }}

后插法创建

void CreateList_R(LinkList &L, int n){  L = new LNode;  L->next = NULL;  LinkList r, p;  r = L;  for (int i = 0; i < n; i++)  {    p = new LNode;    scanf("%d",&p->data);    p->next = NULL;    r->next = p;    r = p;  }}

遍历元素 TraverseList

void TraverseList(LinkList L){  L = L->next;  while (L)  {    printf("%d->", L->data);    L = L->next;  }}