表-单链表(list/singly-linked-list)

单链表

链表是表ADT的一种链式映像。单链表是链表的一种,即每个结点只有一个指针域,指向和它相连的下一个结点。
(这里的链表是带有头结点的链表)

单链表的结点的声明与定义如下:

//clare node (写于头文件之中)
struct Node;
typedef struct Node *PtrToNode;
typedef struct PtrToNode Position;          //指向链表的结点的指针
typedef struct PtrToNode List;              //指向链表头的指针(分开来以示区分)

//define node 
struct Node{
  Elementtype Element;
  Position Next;
};

单链表上的一些操作:

(其它可自定义)

  • int IsEmpty(List L);
  • int IsLast(List L, Position P);
  • Position Find(Elementtype x, List L); //找到x第一次出现的位置
  • void Delete(Elementtype x, List L); //删除第一次出现的x
  • void Insert(List L, Position P, Elementtype x); //在P之前插入一个结点,值为x
  • void DeleteList(List L);
  • Position Advance(List L, Position P);

单链表上对这些操作的定义:

//functions
int IsEmpty(List L) {
  return L->Next == NULL;
}
int IsLast(List L, Position P) {
  return P->Next == NULL;
}

Position Find(Elementtype x, List L) {    //找到x第一次出现的位置
  Position p;
  P = L->Next;

  while (P && P->Element != x)
    P = P->Next;

  return P;
}

void Delete(Elementtype x, List L) {     //删除第一次出现的x
  Position P;
  P = L;

  //找出第一个指向元素x的指针P->Next,因为删除时需要知道结点的前驱,所以要这样查找:
  while (P->Next && P->Next->Element != x)
    P = P->Next;

  //特判: 如果P指向最后一个结点,则说明这个表中不存在x,所以什么也不做。
  if (P->Next != NULL) {
    //删除P->Next指向的结点
    Position Q = P->Next;
    P->Next = Q->Next;
    free(Q);
  }
  return;
}

void Insert(List L, Position P, Elementtype x) { //在P之前插入一个结点,值为x
  //首先,要确保P不是头结点
  if(P == L) return;

  //创建一个结点的空间
  Position Q;
  Q = (Position)malloc(sizeof(Node));
  if(!Q) exit(1);

  //insert
  Position Pre = Advance(Position P);
  Q->Next = P;
  Pre->Next = Q;

  return;
}

void DeleteList(List L) {
  Position P = L;
  while (P) {
    Position Q = P;
    P = P->Next;
    free(Q);
  }
}

Position Advance(List L, Position P) {
  //首先要确保P不是NULL且不明头结点
  if(P == L || P == NULL) return NULL;

  Position Q = L;
  while (Q->Next != P && Q->Next)
    Q = Q->Next;

  return Q;
}

至此单链表实现完毕

posted @ 2018-01-29 19:12  waterlemon  阅读(342)  评论(0编辑  收藏  举报