第二章 线性表【数据结构与算法】2

简介: 第二章 线性表【数据结构与算法】2

2.4.3 循环链表(自学)

循环单链表的操作与单列表基本一致,不同之处在于单链表的循环结束条件是p或p->next为空,而循环单链表的判断条件是它们是否等于头指针
相关代码请看配套资源

3-循环链表.c

创建和遍历

void main(){
  LinkList ha;        //定义单链表头指针      
  ha=InitList();      //初始化单链表
  CreatByRear(ha);        //尾插法创建单链表
  OutPut(ha);       //输出单链表 
} 

运行结果如下



2.4.4 双向链表(自学)

结点定义如下

typedef struct dlnode{
  DataType data;
  Struct dlnode *prior,*next;
}DLNode,*DLinkList;

1.双向链表中结点的插入操作

设p指向链表中的某结点,s指向待插入的新结点,将s插在p的前面,尤其要注意操作顺序,操作过程如下

①s->prior=p->prior;
② p->prior->next=s;
③s->next=p;
④p->prior=s;


2.双向链表中结点的删除操作

设p指向双向链表中待删除的结点,操作过

程如图所示。具体如下。

①p->prior->next=p->next;
②p->next->prior-p->prior;
③free(p);


相关代码请看配套资源

4-双向链表.c

增删插

void main(){
  LinkList ha;        //定义单链表头指针      
  ha=InitList();      //初始化单链表
  CreatByRear(ha);        //尾插法创建单链表
  OutPut(ha);       //输出单链表 
  printf("在第2个位置上插入\n"); 
  Insert(ha,2);
  OutPut(ha);       //输出单链表 
  printf("在第2个位置上删除\n"); 
  Delete(ha,2);
  OutPut(ha);       //输出单链表 
} 

运行结果如下



2.4.5 静态链表(自学)

静态链表是用数组实现的,每个数据元素除了存储数据信息外,还要存储逻辑相邻的下一个数据元素在数组中的位置。可见,静态链表是用数组实现的,但是逻辑相邻的数据元素不一定在物理位置上也相邻

图2-21所示是一个静态链表的例子,SL是一个带头结点的单链表,表示了线性表
(a1,a2,,a3,a4,a5)的存储结构。
从头结点的next域得到4,找到结点a1的位置,再从a1的next域得到2,找到a2的位置
,如此可依次访问此链表中的所有结点。
对于图2-21,最后一个结点a5的下一个元素位置为4,即a1所在的位置,
这又构成一个循环静态链表。



静态链表描述如下。  
typedef struct{
  DataType data;  
  int next;
} SNode;  //结点类型  
SNode sd[ MAXSIZE];  
int SL;  //头指针变量

这种链表的结点中也有数据域data和指针域next,与前面所讲链表中的指针不同的是,这里的指针next(整型)是结点在数组中的下标,称为“静态指针”,所以称这种链表为静态链表。通常将静态链表的next域称为“游标”(cursor),也就是用游标来模拟指针。

相关代码请看配套资源

5-静态链表

int main(){
  printf("非循环\n");
  SNode sd[MAXSIZE];
  int SL=4;
  sd[0].data=0;
  sd[0].next=SL;
  Create(sd,SL);  //2 2 3 3 1 1 5 5 4 0
  //物理位置 
  int i=0;
  for(i;i<6;i++){
    printf("%d\n",sd[i].data);
  }
  //0 5 3 1 2 4
  //逻辑位置 
  OutPut(sd,SL);//2  3  1   5   4
  printf("循环\n");
  SNode sdX[MAXSIZE];
  int SLX=4;
  sdX[0].data=0;
  sdX[0].next=SLX;
  CreateX(sdX,SLX);//2 2 3 3 1 1 5 5 4 4(SLX) 
  //物理位置 
  int j=0;
  for(j;j<6;j++){
    printf("%d\n",sdX[j].data);
  }
  //0 5 3 1 2 4
  //逻辑位置 
  OutPutX(sdX,SLX);//2  3  1   5   4
}

运行结果如下




2.5 顺序表和链表的比较

顺序表查找、遍历简单

链表插入、删除简单

2.6 实例分析与实现

约瑟夫环

相关代码请看配套资源

约瑟夫环.c

  int n=0;
  int m=0;
  NodeType * pHead = NULL;
  do{
    //人数n超过最大人数,重新输人人数n直至满足条件为止
    if(n> MAX){ 
      printf("人数太多,请重新输入!\n");
    }
    printf("请输人人数n(最多%d个):",MAX);
    scanf( "%d",&n);
  }while(n > MAX);
  printf("请输入初始密码m:");
  scanf("%d", &m);
  CreaList(&pHead,n);//创建单向循环链表
  printf("\n---------打印循环链表--------\n");
  PrntList(pHead);//打印循环链表
  printf( "\n打印出队情况--\n");
  JosephusOperate(&pHead,m);//运行约瑟夫环问题  
  return 1;

运行结果如下



一元多项式运算器

相关代码请看配套资源

多项式.c

void main(){
  //默认指数递增排序 
  printf("输入h1\n");
  //建立 
  LinkList h1=CreatByBear();
  printf("输出h1\n");
  OutPut(h1);
  printf("\n");
  printf("求值\n");
  double x;
  printf("输入x:");
  scanf("%lf",&x);
  double r=result(h1,x);
  printf("%lf\n",r);
  printf("der\n");
  LinkList hder=der(h1);
  OutPut(hder);
  printf("\n");
  printf("输入h2\n");
  //建立 
  LinkList h2=CreatByBear();
  printf("输出h2\n");
  OutPut(h2);
  printf("\n");
  printf("add\n");
  LinkList hadd=add(h1,h2);
  OutPut(hadd);
  printf("\n");
//  
  printf("sub\n");
  LinkList hsub=sub(h1,h2);
  OutPut(hsub);
  printf("\n");
  printf("mul\n");
  LinkList hmul=mul(h1,h2);
  OutPut(hmul);
} 




相关文章
|
5月前
|
存储 算法 数据安全/隐私保护
第二章 线性表【数据结构与算法】【精致版】
第二章 线性表【数据结构与算法】【精致版】
85 0
|
8月前
|
算法
数据结构与算法2.1线性表、链表
数据结构与算法2.1线性表、链表
29 0
数据结构与算法2.1线性表、链表
|
5月前
|
人工智能 算法 C语言
【408数据结构与算法】—线性表的定义和分析(二)
【408数据结构与算法】—线性表的定义和分析(二)
|
9月前
|
存储 算法
第二章 线性表【数据结构与算法】3
第二章 线性表【数据结构与算法】3
28 0
|
9月前
|
存储 算法 数据安全/隐私保护
第二章 线性表【数据结构与算法】1
第二章 线性表【数据结构与算法】1
58 0
|
12月前
|
存储 算法 Java
数据结构与算法(二):线性表
上一篇《数据结构与算法(一):概述》中介绍了数据结构的一些基本概念,并分别举例说明了算法的时间复杂度和空间复杂度的求解方法。这一篇主要介绍线性表。
65 0
|
存储 算法
数据结构/数据结构与算法实验一 线性表的相关算法实现
数据结构/数据结构与算法实验一 线性表的相关算法实现
65 0
数据结构/数据结构与算法实验一 线性表的相关算法实现
|
机器学习/深度学习 人工智能 算法
【408数据结构与算法】—线性表的定义和分析(二)
线性表的定义:线性表示具有相同数据类型的n(n>=0)个数据元素的有限序列,其中n为表长,当n=0 时,线性表是一个空表,若用L命名线性表,则一般表示为:L=(a1,a2,……,ai,an)
【408数据结构与算法】—线性表的定义和分析(二)
|
存储 算法 小程序
educoder数据结构与算法 线性表 第2关:实现一个链接存储的线性表
educoder数据结构与算法 线性表 第2关:实现一个链接存储的线性表
323 0
educoder数据结构与算法 线性表 第2关:实现一个链接存储的线性表
|
存储 算法
educoder数据结构与算法 线性表 第1关:实现一个顺序存储的线性表
educoder数据结构与算法 线性表 第1关:实现一个顺序存储的线性表
413 0
educoder数据结构与算法 线性表 第1关:实现一个顺序存储的线性表