第二章 线性表【数据结构与算法】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);
} 




相关文章
|
7月前
|
存储 算法 数据安全/隐私保护
第二章 线性表【数据结构与算法】【精致版】
第二章 线性表【数据结构与算法】【精致版】
136 0
|
算法
数据结构与算法2.1线性表、链表
数据结构与算法2.1线性表、链表
40 0
数据结构与算法2.1线性表、链表
|
1月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人之数据结构与算法系列学习×单双链表精题详解、数据结构、C++、排序算法、java 、动态规划 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
6月前
|
算法
数据结构和算法学习记录——线性表之双向链表(上)-结点类型定义、初始化函数、创建新结点函数、尾插函数、打印函数、尾删函数
数据结构和算法学习记录——线性表之双向链表(上)-结点类型定义、初始化函数、创建新结点函数、尾插函数、打印函数、尾删函数
55 0
|
6月前
|
存储 算法
数据结构和算法学习记录——特殊线性表之队列-队列的概念、队列结构体类型定义 、基本接口函数、初始化函数、销毁队列函数、入队列函数、判断队列是否为空、出队列函数、读取队头队尾的数据 、计算队列数据个数
数据结构和算法学习记录——特殊线性表之队列-队列的概念、队列结构体类型定义 、基本接口函数、初始化函数、销毁队列函数、入队列函数、判断队列是否为空、出队列函数、读取队头队尾的数据 、计算队列数据个数
49 0
|
6月前
|
算法 C语言
数据结构和算法学习记录——特殊线性表之栈(下)-销毁栈函数、判断栈是否为空、压栈函数、出栈函数、取栈顶元素、计算栈中有多少个元素、栈有关习题-有效的括号
数据结构和算法学习记录——特殊线性表之栈(下)-销毁栈函数、判断栈是否为空、压栈函数、出栈函数、取栈顶元素、计算栈中有多少个元素、栈有关习题-有效的括号
40 0
|
6月前
|
算法
数据结构和算法学习记录——特殊线性表之栈(上)-栈的概念、栈的结构、链式栈数组栈、栈的结构体定义、栈的基本接口函数、栈顶初始化函数
数据结构和算法学习记录——特殊线性表之栈(上)-栈的概念、栈的结构、链式栈数组栈、栈的结构体定义、栈的基本接口函数、栈顶初始化函数
39 0
|
6月前
|
算法
数据结构和算法学习记录——线性表之双向链表(下)-头插函数、头删函数、查找函数、pos位置之前插入结点、pos位置删除结点及其复用、销毁链表函数
数据结构和算法学习记录——线性表之双向链表(下)-头插函数、头删函数、查找函数、pos位置之前插入结点、pos位置删除结点及其复用、销毁链表函数
33 0
|
6月前
|
算法
数据结构和算法学习记录——线性表之单链表(下)-头插函数、尾删函数、头删函数、查找函数、pos位置插入&删除数据、单链表销毁
数据结构和算法学习记录——线性表之单链表(下)-头插函数、尾删函数、头删函数、查找函数、pos位置插入&删除数据、单链表销毁
66 0
|
6月前
|
存储 算法
数据结构和算法学习记录——线性表之单链表(上)-初始单链表及其尾插函数(顺序表缺陷、单链表优点、链表打印)
数据结构和算法学习记录——线性表之单链表(上)-初始单链表及其尾插函数(顺序表缺陷、单链表优点、链表打印)
45 0