自言自语

I'm Wang Xianyuan, writing for myself, more studying, more experience…

线性表的链式存储结构

By

最近参加校园招聘,笔试是必要的。先热身,把数据结构的基础东东拿出来 Review 一下。
线性表的链式存储结构:
链式存储表示:

typedef struct LNode{
  ElemType   data;
  Struct LNode *next;
}LNode,*LinkList;

基本操作在链表上的实现:
(1) 单链表的取元素算法(经典)

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

算法分析:
基本操作是: 比较 j 和 I, 并把指针后移 , 循环体执行的次数 , 与被查元素的位置有关 . 假设表长为 n, 如果 1<=i<=n, 那么循环体中语句的执行次数为 i-1. 否则次数为 n 所以时间复杂度为 O(n).

(2)  插入元素算法

Status ListInsert_L(LinkList &L, int i,ElemType e)
{
   p=L;j=0;
   while(p&&j<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;
}

(3) 删除元素算法

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

算法分析 :
插入和删除算法 , 都要先找到第 i-1 个节点 , 所以时间复杂度为 O(n);
(4) 单链表的建立算法

void CreateList_L(LinkList &L,int n){
L =(LinkList)malloc(sizeof(LNode));
L->next = null;
  for(i = n;i>0;--i){
  p =(LinkList)malloc(sizeof(LNode));
  scanf(&p->data);
  p->next = L->next;
  L->next =p;
  }
}

算法分析 :
按照逆序循环输入 n 个数据元素的值 , 建立新节点 . 并插入 . 因此算法的时间复杂度为 O(n).

Leave a Reply