知识大全 数据结构复习总结第二章线性表

Posted 结点

篇首语:智者不为愚者谋,勇者不为怯者死。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 数据结构复习总结第二章线性表相关的知识,希望对你有一定的参考价值。

  第二章线性表

   线性表的逻辑结构

  线性表是由n(n≥ )个数据元素组成的有限序列 当n= 是称为空表 非空的线性表记为(a a a …an)

  线性表的基本运算有

   )InitList(L) 构造空表 即表的初始化;

   )ListLength(L) 求表的结点个数 即表长;

   )GetNode(L i) 取表中第i个结点 要求 ≤i≤ListLength(L);

   )LocateNode(L x)查找L中值为x的结点并返回结点在L中的位置 有多个x则返回首个 没有则返回特殊值表示查找失败

   )InsertList(L x i)在表的第i个位置插入值为x的新结点 要求 ≤i≤ListLength(L)+ ;

   )DeleteList(L i)删除表的第i个位置的结点 要求 ≤i≤ListLength(L);

   线性表的顺序存储结构

   顺序表

  顺序表是把线性表的结点按逻辑次序存放在一组地址连续的存储单元里

  结点的存储地址计算公式 Loc(ai)=Loc(a )+(i )*C; ≤i≤n

  顺序表的定义

  #define listsize

  typedef int datatype;

  typedef struct

  datatype data[listsize];

  int length;

  ]seqlist;

   顺序表山的基本运算

   插入

  void insertlist(seqlist *L datatype x int i)

  

  int j;

  if(i< ||i>L >length+ )

  error( position error );

  if(L >length>=listsize)

  error( overflow );

  for(j=L >length ;j>=i ;j )

  L >data[j+ ]=L >data[j];

  L >data[i ]=x;

  L >length++;

  

  在顺序表上插入要移动表的n/ 结点 算法的平均时间复杂度为O(n)

   删除

  void delete (seqlist *L int i)

  

  int j;

  if(i< ||i>L >length)

  error( position error );

  for(j=i;j<=L >length ;j++)

  L >data[j ]=L >data[j];

  L >length ;

  

  在顺序表上删除要移动表的(n+ )/ 结点 算法的平均时间复杂度为O(n)

   线性表的链式存储结构

  用链接方式存储的线性表称链表

   单链表

  在结点中除了存储结点值还存储结点的后继结点的地址 data|next data是数据域 next是指针域 只有一个链域的链表称单链表

  单链表结点的定义

  Typedef char datatype;

  Typedef struct node

  Datatype data;

  Struct node *next;

  listnode;

  typedef listnode *linklist;

  listnode *p;

  linklist head;

  结点的动态生成p=(listnode *)malloc(sizeof(listnode));结点的回收free(p);

   建立单链表 时间复杂度为O(n)

   ) 头插法建表

  Link createlistF(void)

  

  char ch;

  linklist head;

  listnode *s;

  head=NULL;

  ch=getchar();

  while(ch!= \\n )

  s=(listnode *)malloc(sizeof(listnode));

  s >data=ch;

  s >next=head;

  head=s;

  ch=getchar();

  

  return head;

  

   )尾插法建表

  Link createlistR(void)

  

  char ch;

  linklist head;

  listnode *s *r;

  s=NULL;r=NULL;

  while((ch=getchar())!= \\n )

  s=(listnode *)malloc(sizeof(listnode));

  s >data=ch;

  if(head=NULL)

  head=s;

  else

  r >next=s;

  r=s;

  

  if(r!=NNULL)

  r >next=NULL;

  return head;

  

  在链表开始结点前附加一个头结点的优点是 )链表第一个位置的操作无需特殊处理; )将空表和非空表的处理统一

   )带头结点的尾插法建表

  Linklist createlisR (void)

  

  char ch;

  linklist head=(listnode *)malloc(sizeof(listnode));

  listnode *s *r;

  r=head;

  while((ch=getchar())!= \\n )

  s=(listnode *)malloc(sizeof(listnode));

  s >data=ch;

  r >next=s;

  r=s;

  

  r >next=NULL;

  return head;

  

   查找运算 时间复杂度为O(n)

   ) 按序号查找

  Listnode * getnode(linklist head int i)

  

  int j;

  listnode *p;

  p=head;j= ;

  while(p >next&&j

  p=p->next;

  j++;

  

  if(i==j)

  return p;

  else

  return NULL;

  

  2) 按值查找。tW.WingwIt.cOm

  Listnode * locatenode(linklist head ,datatype key)

  

  listnode *p=head->next;

  while(p&&p->data!=key)

  p=p->next;

  return p;

  

  3. 插入运算。时间复杂度为O(n)。

  Void insertlist(linklist head ,datatype x, int i)

  

  listnode *p;

  p=getnode(head,i-1);

  if(p==NULL);

  error(“position error”);

  s=(listnode *)malloc(sizeof(listnode));

  s->data=x;

  s->next=p->next;

  p->next=s;

  

  4. 删除运算。时间复杂度为O(n)。

  Void deletelist(linklist head ,int i)

  

  listnode *p ,*r;

  p=getnode(head ,i-1);

  if(p==NULL||p->next==NULL)

  error(“position error”);

  r=p->next;

  p->next=r->next;

  free(r);

  

  2.3.2循环链表。

  循环链表是一种首尾相连的链表。特点是无需增加存储量,仅对表的链接方式修改使表的处理灵活方便。

  单链表是将终端结点的指针域指向表头结点或开始结点。为使空表和非空表处理一致可设置一个头结点。

  用头指针表示的单循环链表查找开始结点的时间是O(1),查找尾结点的时间是O(n);用尾指针表示的单循环链表查找开始结点和尾结点的时间都是O(1)。

  2.3.3双链表

  在结点中增加一个指针域,prior|data|next。形成的链表中有两条不同方向的链称为双链表。

  双链表结点定义。

  Typedef struct dlistnode

  Datatype data;

  Struct dlistnode *prior,*next;

  dlistnode;

  typedef dlistnode *dlinklist;

  dlinklist head;

  1) 双链表的前插操作。时间复杂度为O(1)。

  Void dinsertbefore(dlistnode *p ,datatype x)

  

  dlistnode *s=malloc(sizeof(dlistnode));

  s->data=x;

  s->prior=p->prior;

  s->next=p;

  p->prior->next=s;

  p->prior=s;

  

  2) 双链表的删除操作。时间复杂度为O(1)。

  Void ddeletenode(dlistnode *p)

  

  p->prior->next=p->next;

  p->next->prior=p->prior;

  free(p);

  

  2.4顺序表和链表的比较。

  1) 基于空间的考虑:顺序表的存储空间是静态分配的,链表的存储空间是动态分配的。顺序表的存储密度比链表大。因此,在线性表长度变化不大,易于事先确定时,宜采用顺序表作为存储结构。

  2) 基于时间的考虑:顺序表是随机存取结构,若线性表的操作主要是查找,很少有插入、删除操作时,宜用顺序表结构。对频繁进行插入、删除操作的线性表宜采用链表。若操作主要发生在表的首尾时采用尾指针表示的单循环链表。

  附二:

  第二章 线性表

  *************************************************************************************

  线性表是由n≥0个数据元素组成的有限序列。n=0是空表;非空表,只能有一个开始结点,有且只能有一个终端结点。

  *************************************************************************************

  线性表上定义的基本运算:·构造空表:Initlist(L)

  ·求表长:Listlength(L)

  ·取结点:GetNode(L,i)

  ·查找:LocateNode(L,x)

  ·插入:InsertList(L,x,i)

  ·删除:Delete(L,i)

cha138/Article/program/sjjg/201311/23755

相关参考

知识大全 数据结构考研分类复习真题 第二章 线性表[23]

  四 应用题  .线性表有两种存储结构一是顺序表二是链表试问  ()如果有n个线性表同时并存并且在处理过程中各表的长度会动态变化线性表的总数也会自动地改变在此情况下应选用哪种存储结构?为什

知识大全 数据结构考研分类复习真题 第二章 线性表[4]

  线性表的表元存储方式有(())和链接两种试指出下列各表中使用的是何种存储方式表是(())存储方式表是(())存储方式表是(())存储方式表是(())存储方式表左的s指向起始表元【上海海运学院二(分

知识大全 数据结构考研分类复习真题 第二章 线性表[28]

  五算法设计题  假设有两个按元素值递增次序排列的线性表均以单链表形式存储请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表并要求利用原来两个单链表的结点存放归并后的单链表【北京大学三(

知识大全 数据结构考研分类复习真题 第二章 线性表[39]

  已知长度为n的线性表A采用顺序存储结构请写一时间复杂度为(n)空间复杂度为()的算法该算法删除线性表中所有值为item的数据元素(O()表示算法的辅助空间为常量)  【北京航空航天大学五(分)】 

知识大全 数据结构考研分类复习真题 第二章 线性表[36]

  请写一个算法将顺序存储结构的线性表(aan)逆置为(ana)【大连海事大学八(6分)】  类似本题的另外叙述有  ()设有一带头结点的单链表编程将链表颠倒过来要求不用另外的数组或结点完成  【南京

知识大全 数据结构考研分类复习真题 第二章 线性表[37]

  .已知L为没有头结点的的单链表中第一个结点的指针每个结点数据域存放一个字符该字符可能是英文字母字符或数字字符或其它字符编写算法构造三个以带头结点的单循环链表表示的线性表使每个表中只含同一类字符(要

知识大全 数据结构考研分类复习真题 第二章 线性表[30]

  顺序结构线性表LA与LB的结点关键字为整数LA与LB的元素按非递减有序线性表空间足够大试用类PASCAL语言给出一种高效算法将LB中元素合到LA中使新的LA的元素仍保持非递减有序高效指最大限度的避

知识大全 数据结构考研分类复习真题 第二章 线性表[2]

  .若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算则利用(   )存储方式最节省时间【哈尔滨工业大学二(分)】  A.顺序表 &nb

知识大全 数据结构考研分类复习真题 第二章 线性表[1]

  第章 线性表  一 选择题  .下述哪一条是顺序存储结构的优点?(   )【北方交通大学一(分)】  A.存储密度大 B.插入运算方便&

知识大全 数据结构考研分类复习真题 第二章 线性表[33]

  试编写在带头结点的单链表中删除(一个)最小值结点的(高效)算法void delete(Linklist &L)【北京理工大学九(分)】  已知非空线性链表由list指出