5单链表、其他形式链表、线性表总结

合集下载

数据结构线性表

数据结构线性表

数据结构线性表一、引言数据结构是计算机存储、组织数据的方式,它决定了数据访问的效率和灵活性。

在数据结构中,线性表是一种最基本、最常用的数据结构。

线性表是由零个或多个数据元素组成的有限序列,其中数据元素之间的关系是一对一的关系。

本文将对线性表的概念、分类、基本操作及其应用进行详细阐述。

二、线性表的概念1.数据元素之间具有一对一的关系,即除了第一个和一个数据元素外,其他数据元素都是首尾相连的。

2.线性表具有唯一的第一个元素和一个元素,分别称为表头和表尾。

3.线性表的长度是指表中数据元素的个数,长度为零的线性表称为空表。

三、线性表的分类根据线性表的存储方式,可以将线性表分为顺序存储结构和链式存储结构两大类。

1.顺序存储结构:顺序存储结构是将线性表中的数据元素按照逻辑顺序依次存放在一组地质连续的存储单元中。

顺序存储结构具有随机访问的特点,可以通过下标快速访问表中的任意一个元素。

顺序存储结构的线性表又可以分为静态顺序表和动态顺序表两种。

2.链式存储结构:链式存储结构是通过指针将线性表中的数据元素连接起来,形成一个链表。

链表中的每个节点包含一个数据元素和一个或多个指针,指向下一个或前一个节点。

链式存储结构具有动态性,可以根据需要动态地分配和释放节点空间。

链式存储结构的线性表又可以分为单向链表、双向链表和循环链表等。

四、线性表的基本操作线性表作为一种数据结构,具有一系列基本操作,包括:1.初始化:创建一个空的线性表。

2.插入:在线性表的指定位置插入一个数据元素。

3.删除:删除线性表中指定位置的数据元素。

4.查找:在线性表中查找具有给定关键字的数据元素。

5.更新:更新线性表中指定位置的数据元素。

6.销毁:释放线性表所占用的空间。

7.遍历:遍历线性表中的所有数据元素,进行相应的操作。

8.排序:对线性表中的数据元素进行排序。

9.合并:将两个线性表合并为一个线性表。

五、线性表的应用1.程序语言中的数组:数组是一种典型的顺序存储结构的线性表,常用于存储具有相同类型的数据元素。

线性表操作实验报告

线性表操作实验报告

忻州师范学院计算机科学与技术系实验报告(第六组)组长:梁启超组员:晋丹丹张艳华马军刘雪梅孙钰林刘涛分块调试:把算法分拆成几个功能模块,按C程序结构标准分模块调试;3)错误跟踪有两种方法:错误信息排查法、执行路线跟踪法。

错误信息排查法:根据错误信息进行分类排查,要求分析者对C的错误代码要有足够的了解和认识,有经验的程序员多用此法。

执行路线跟踪法:变量分析法(跟踪变量的值)、插入标签法(插入输出标签),这种方法适合初学者。

4)调试分析不宜面面俱到,具体写出关键问题就行。

分析如下:主函数main()首先调用显示操作菜单函数scan(),再根据用户输入的数字选项分别调用以下函数:(1)createlist_l头插法构造单链表;(2)createlist_l2尾插法构造单链表;两种二选一;(2)listinsert_l向单链表中插入元素;(3)listdelete_l删除单链表中的元素;(4)printlist_l遍历单链表;(5)getelem_l按位序查找单链表;(6)locateElem_l按值查找单链表;由上述结构可知,采用分功能模块调试的方法较合理,即主要功能按以下顺序实现:添加——查找——删除——遍历。

5.使用说明与测试结果程序名为TXL.exe,运行环境为DOS。

程序执行后显示(下图为参考截图例子。

)第一次操作需选择1或者2,并且只能选择一种。

程序执行显示我们选择的的是头插法构造单链表,输入1后显示要输入几个数1我们写5个请输入要插入的数据:我们插入15 25 35 45 55遍历单链表删除表中第2个元素在第3个元素中插入68按位序查找单链表;查找第4个元素五、实验总结(调试和运行程序过程中产生的问题及采取的措施;对算法的程序的讨论、分析,改进设想以及其它经验教训;对实验方式、组织、设备、题目的意见和建议等)附源程序清单:#include<stdio.h>#include<stdlib.h>typedef struct lnode{int data;struct lnode *next;}lnode,*linklist;linklist createlist_l(int n){int i;linklist l,p;l=(linklist)malloc(sizeof(lnode));l->next=NULL;printf("please input the data of :");for(i=n;i>0;--i){p=(linklist)malloc(sizeof(lnode));scanf("%d",&p->data);p->next=l->next;l->next=p;}return l;}linklist createlist_l2(int n){int i;linklist l,p,r;l=(linklist)malloc(sizeof(lnode));l->next=NULL;r=l;printf("please input the data of:");for(i=1;i<=n;i++)。

线性表知识点总结

线性表知识点总结

线性表知识点总结一、概述线性表是数据结构中的一种基本结构,它是一种线性的、有序的、可重复的数据结构。

线性表的存储结构有两种:顺序存储和链式存储。

二、顺序存储顺序存储的方式是把线性表的元素按照顺序存储在一个一维数组中,它的优点是随机访问时间复杂度为O(1),缺点是插入和删除操作时间复杂度为O(n)。

1. 初始化线性表的初始化需要先定义一个结构体,包含数据元素和线性表的长度两个成员。

```c#define MaxSize 100typedef struct{ElemType data[MaxSize];int length;}SqList;```2. 插入线性表的插入操作需要先判断是否有足够的空间进行插入操作,然后将插入位置后面的元素后移,最后将待插入的元素插入到插入位置。

```cStatus ListInsert(SqList &L, int i, ElemType e){int j;if(i<1 || i>L.length+1){return ERROR;}if(L.length>=MaxSize){return ERROR;}for(j=L.length;j>=i;j--){L.data[j]=L.data[j-1];}L.data[i-1]=e;L.length++;return OK;}```3. 删除线性表的删除操作需要先判断要删除的位置是否合法,然后将删除位置后面的元素前移,最后将最后一个元素赋值为空。

```cStatus ListDelete(SqList &L, int i, ElemType &e){int j;if(i<1 || i>L.length){return ERROR;}e=L.data[i-1];for(j=i;j<L.length;j++){L.data[j-1]=L.data[j];}L.length--;return OK;}```4. 查找线性表的按值查找操作需要遍历整个数组进行查找,时间复杂度为O(n),按位查找可以通过数组下标直接访问。

单链表实验报告总结

单链表实验报告总结

单链表实验报告总结‎单链表实验报告总结‎‎篇一:‎单链表实验报告‎实验一线性表基本操‎作的编程实现 --线‎性表在链表存储下的主‎要操作实现班级:T‎523-1 姓名:王‎娟学号:33 完成‎日期:201X.0‎ 4.04 地点‎:5502 学时:2‎学时一‎、需求分析【实验目‎的】通过本次实验,‎对课堂上线性表的知识‎进行巩固,进一步熟悉‎线性表的链接存储及‎相应的基本操作;并熟‎练掌握VC++‎6.0操作平台,学‎会调试程序,以及编写‎电子实验报告【实验‎要求】编写线性表的‎基本操作,有构造线性‎表,线性表的遍历,插‎入,删除,查找,求‎表长等基本功能,在此‎基础上能够加入DS下‎的图形界面以及学会文‎件的操作等功能,为以‎后的学习打下基础。

‎【实验任务】‎(1).线性表基本操‎作的编程实现,掌握线‎性表的建立、遍历、插‎入、删除等基本操作的‎编程实现,也可以进一‎步编程实现查找、逆序‎、排序等操作,存储结‎构可以在顺序结构或链‎表结构中任选,可以完‎成部分主要功能,也可‎以用菜单进行管理完成‎大部分功能。

还鼓励学‎生利用基本操作进行一‎些更实际的应用型程序‎设计。

(2)‎.用菜单管理,把线性‎表的顺序存储和链表存‎储的数据插入、删除运‎算进行程序实现。

建‎议实现键盘数据输入实‎现改实验的通用性。

为‎了体现功能的正常性,‎至少要编制遍历数据的‎函数.(3)‎.注意事项:开发语言‎使用C++,尽量使用‎面向对象的思想和实现‎方法,可以改编成应用‎软件. 【实验类型】‎验证型实验‎二、概要设计需要实‎现线性表的以下功能:‎1、创建单链‎表2、删除链‎表中的某个结点‎3、输出单链表(遍‎历)4、释放‎结点所占空间‎5、查找第i个结点‎6、插入一个结‎点7、求链表‎的长度二、详‎细设计(1)‎.数据结构线性表的‎线性结构觉决定了它的‎性质:数据元‎素之间是一种线性关系‎,数据元素一个接一‎个的排列,除了最后一‎个数据,其他的数据面‎临的下一个数据有且仅‎有一个。

链表实验报告总结doc

链表实验报告总结doc

链表实验报告总结篇一:顺序表,链表总结实验报告实验报告实验目的:学生管理系统(顺序表)实验要求:1.建表2.求表长3.插入4.查找5.删除6.列表7.退出源程序:#include#include#include#define MaxSize 1000typedef struct{char xh[40];char xm[40];int cj;}DataType; //学生的结构typedef struct {DataType data[MaxSize]; //定义表的数据类型int length; //数据元素分别放置在data[0]到data[length-1]当中} SqList; //表的结构void liebiao(SqList *L)//{int k,n;char q;printf("请输入,输入学生的个数:\n");fflush(stdin);scanf("%d",&n);for(k=0;k {printf("请输入学生学号\n");scanf("%s",L->data[k].xh);printf("请输入学生名字\n");scanf("%s",L->data[k].xm);printf("请输入学生成绩\n");scanf("%d",&L->data[k].cj); 建立表格}L->length=n;}void qb(SqList *L) //全部输出{int k,w;for(k=0;klength;k++){w=k+1;printf("第%d位学生:",w);printf("%s %s%d\n",L->data[k].xh,L->data[k].xm,L->d ata[k].cj);}}int cr(SqList *L,DataType *xs,int i) //插入信息{int j;if(L->length==MaxSize){printf("没有!");return 0;}else if((iL->length)){printf("程序溢出,不符合");return 0;}else{for(j=L->length-1;j>=i;j--){strcpy(L->data[j+1].xh,L->data[j].xh); strcpy(L->data[j+1].xm,L->data[j].xm);L->data[j+1].cj=L->data[j].cj;}strcpy(L->data[i].xh,xs->xh);strcpy(L->data[i].xm,xs->xm);L->data[i].cj=xs->cj;L->length=L->length+1;}return 0;}int cz(SqList *L) //查找信息{char xh[40];char xm[40];int cj;int i=0,u;printf(" 1、按学号查询\n"); printf(" 1、按姓名查询\n"); printf(" 1、按成绩查询\n"); printf("请选择:");fflush(stdin);scanf("%d",&u);if (u==1){printf("请输入要查找学生的学号:");scanf("%s",xh);for(i=0;ilength;i++){篇二:单链表的实验报告辽宁工程技术大学上机实验报告篇三:单链表实验报告实验一线性表基本操作的编程实现--线性表在链表存储下的主要操作实现班级:T523-1 姓名:王娟学号:33完成日期:XX.04.04 地点:5502学时:2学时一、需求分析【实验目的】通过本次实验,对课堂上线性表的知识进行巩固,进一步熟悉线性表的链接存储及相应的基本操作;并熟练掌握VC++ 6.0操作平台,学会调试程序,以及编写电子实验报告【实验要求】编写线性表的基本操作,有构造线性表,线性表的遍历,插入,删除,查找,求表长等基本功能,在此基础上能够加入DOS下的图形界面以及学会文件的操作等功能,为以后的学习打下基础。

线性表-上海金融学院信息管理系

线性表-上海金融学院信息管理系
2.
1.4.2 线性链表的插入和删除
(2)操作语句 p=……;
q=p->link; p->link = q->link; free(q);
1.4.2 线性链表的插入和删除
(3)
算法 一般情况下,删除的实现:
head
p
q
1.4.2 线性链表的插入和删除
pp.
31-32
为什么要用参数p_head,而不直接用head?
1. 定义 插入或删除操作,需要定位于操作结点 的前趋结点,但以前讨论的链表都是单向的, 要找某结点的前趋结点并不容易。 为了更方便地找到结点的前趋结点,这 里引进双向链表。 所谓双向链表,即其结点的左指针指向 它的前趋结点,右指针指向它的后继结点。
1.4.5 双向链表
双向链表的数据描述:
typedef struct node { int data; //数据域 struct node *llink, *rlink; //左、右指针 } NODE; NODE *head;
1.4.3 用线性链表表示多项式
思考:
3.
如何用类似方法解决多项式的乘法?
1.4.4 几种变形的线性链表
1.
2. 3.
环形链表 带表头结点的链表 带表头结点的环形链表
1. 环形链表
空环形链表 head 非空环形链表
^
1. 环形链表
如果我们用p=head起步,然后用 p=p->link 前进,那么在非环形链表的情况下,当 p==NULL 时,我们知道整个链表扫描完成。请问: 在环形链表的情况下,如何判断整个链表 扫描完成呢?
1.4.1 线性链表的逻辑结构及其建 立
建立链表的算法 (1)使用C中两个动态存储分配函数 malloc(size) 分配size长度的存储空间, 返回指向该空间的指针。 free(ptr) 释放以前分配的、并由ptr所指 的空间。 类似地,在C++中提供了两个新命令: new 和 delete

几种常见的线性表存储结构

⼏种常见的线性表存储结构1.线性表的的动态分配顺序存储结构1#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量2#define LISTINCREMENT 100 //线性表存储空间的分配增量3 typedef struct {4 ElemType *elem; //存储空间基址5int length; //当前长度6int size; //当前分配的存储容量7 }SqList; //动态分配 + 顺序存储结构2.线性表的单链表存储结构1 typedef struct LNode{ //结点类型2 ElemType data; //数据域3struct LNode *next; //指针域4 }*Link;5 typedef struct { //链表类型6 Link head, tail; //分别指向线性链表的头结点和最后⼀个结点7int len; //指⽰线性链表中数据元素的个数8 }LinkList;头指针:指⽰链表中第⼀个结点的存储位置(LNode *类型)头结点:单链表的第⼀个结点前附设⼀个结点(数据域可存长度 LNode类型)⾸元结点:第⼀个结点3.线性表的静态单链表存储结构1#define MAXSIZE 1000 //链表的最⼤长度2 typedef struct{3 ElemType data;4int cur;5 }Component, SLinkList[MAXSIZE];需要⽤户⾃⼰实现malloc和free函数,将所有未使⽤过的和被删除的结点⽤游标链成⼀个备⽤链表4.线性表的双向链表存储结构1 typedef struct DulNode{2 ElemType data;3struct DulNode *prior;4struct DulNode *next;5 }*Dulink;6 typedef struct { //链表类型7 Link head, tail; //分别指向线性链表的头结点和最后⼀个结点8int len; //指⽰线性链表中数据元素的个数9 }DulinkList;2015-06-27 21:21:29。

数据结构教学课件:线性表链表


头结点好处
a、由于开始结点的位置被存放在头结点的指针域中, 所以在链表的第一个位置上的操作(如插入、删 除等)就和在表的其它位置上的操作一致,无需 进行特殊处理; b、无论链表是否为空,其头指针是指向头结点的非 空指针(空表中头结点的指针域为空),头指针 始终不为空,因此空表和非空表的处理也就统一 了
}
带头结点的单链表 H
# a1 a2

an NULL
头结点
H
# NULL
头结点
linklist * initList() linklist * initList() { { linknode* pHead = (linknode*) linknode* pHead = 0; // pHead、 malloc( sizeof(linknode)); pRail分别为头、尾指针 linknode* pRail = pHead; linknode* pRail = pHead; // pHead、 char c; pRail分别为头、尾指针 char c; while( (c = getchar()) != ‘\n’) { linknode* pNode = while( (c = getchar()) != ‘\n’) { (linknode*)malloc( sizeof(linknod linknode* pNode = e )); (linknode*)malloc( sizeof( linknode scanf( "%c", &pNode->data ); )); scanf( "%c", &pNode->data ); pNode->next = 0; //新结点指 针域为空 pNode->next = 0; //新结点指针 pRail->next = pNode; 域为空 pRail = node; if( !pHead) pHead = pNode; } else pRail->next = pNode; return pHead; pRail = node; } } return pHead; }

单链表心得体会.doc

单链表心得体会篇一:数据结构课程设计实验报告心得体会链表c语言数据结构课程设计设计题目:两个链表的交叉合并专业班级:08软件工程3班姓名:xxxxxx学号:080107031123设计时间:2010/9/25指导教师:杨薇薇一、设计题目实现两个链表的合并设计目的1.掌握线性链表的建立。

2.掌握线性链表的基本操作。

设计内容和要求1.建立两个链表A和b,链表元素个数分别为m和n个。

2.假设元素分别为(x1,x2,?xm),和(y1,y2,?yn)。

把它们合并成一个线形表c,使得:当m>=n时,c=x1,y1,x2,y2,?xn,yn,?,xm当n>m时,c=y1,x1,y2,x2,?ym,xm,?,yn输出线性表c。

3.用直接插入排序法对c进行升序排序,生成链表d,并输出链表d。

4.能删除指定单链表中指定位子和指定值的元素。

二、运行环境(软、硬件环境)软件环境:Vc++6.0编程软件,运行平台:win32硬件:普通个人pc机、算法设计的思想三、算法的流程图四、算法设计分析这个两个链表的交叉合并算法主要运用到的是链表的基本操作,定义节点,将链表的创建、计算链表的长度、链表A,b的交叉组合、链表内容升序排列、删除链表指定位置元素、删除指定的元素等算法写成了独立函数,通过主函数调用。

这样就大大精简了主函数的操作。

但主函数中很大篇幅用到了if、else语句,用以指定链表指定结点和指定元素的删除操作,这样就使得本来很精简变得繁琐,降低了程序的质量。

所以其有优点和缺点,但需要不断的改进,不断优化该程序。

五、源代码程序源代码:#include<stdio.h>。

线性表知识点总结

线性表知识点总结线性表是数据结构中一种非常基础且重要的数据结构,它在计算机科学和程序设计中有着广泛的应用。

接下来,让我们详细了解一下线性表的相关知识点。

一、线性表的定义线性表是由零个或多个数据元素组成的有限序列。

这里的“有限”意味着线性表中的元素个数是确定的。

每个元素在表中的位置是按照顺序排列的,并且具有前驱和后继的关系,除了第一个元素没有前驱,最后一个元素没有后继。

二、线性表的特点1、元素之间存在顺序性:线性表中的元素按照一定的顺序排列,每个元素都有其特定的位置。

2、元素个数有限:线性表中的元素数量是有限的,不能是无限的。

3、元素类型相同:线性表中的元素具有相同的数据类型,这样便于进行统一的操作和处理。

三、线性表的存储结构1、顺序存储定义:顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素。

优点:可以随机访问表中的任意元素,查找操作效率高;存储密度高,不需要额外的指针来表示元素之间的关系。

缺点:插入和删除操作可能需要移动大量元素,效率较低;预先分配的存储空间可能会造成浪费或不足。

2、链式存储定义:链式存储是通过指针将各个元素链接起来,每个元素由数据域和指针域组成。

优点:插入和删除操作不需要移动大量元素,效率较高;不需要预先分配固定的存储空间,更加灵活。

缺点:不能随机访问,查找操作需要从头指针开始遍历,效率较低;存储密度较低,需要额外的指针空间。

四、线性表的基本操作1、初始化:创建一个空的线性表。

2、销毁:释放线性表所占用的存储空间。

3、清空:将线性表中的元素全部删除,使其成为一个空表。

4、判断是否为空:判断线性表是否为空。

5、求长度:返回线性表中元素的个数。

6、取值:获取指定位置的元素值。

7、查找:在线性表中查找指定元素。

8、插入:在指定位置插入一个新元素。

9、删除:删除指定位置的元素。

五、顺序表的实现1、定义数据类型通常使用一个数组来存储顺序表的元素,并使用一个整数来记录表的长度。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
// 输入 n 个数据元素,根据输入顺序建立带头结点的单链表
}
L = (LinkList) malloc (sizeof (LNode)); L->next = NULL; // 先建立一个带头结点的单链表 r = L ; //r指向尾结点 for (i = 0; i <n; i++) { p = (LinkList) malloc (sizeof (LNode)); scanf(&p->data); // 输入元素值 r->next = p; // 插入 r =p; //r指向新的尾结点 } r->next = NULL ; //尾结点的指针域为空
a1
a2
……
an-1
an
L
头结点没有前驱;最后 一个结点没有后继;
带头结点的空的双向链表
L
双向循环链表
空表
非空表
a1
a2 … ...
an
双向链表的操作特点:
ListLength、GetElem和LocateElem 和单链表相同。 “插入”和“删除”时需要同时修 改两个方向上的指针。
插入
p
ai-1
a1
a2
… 条件不再是“后继是否为空”, 而是“后继是否为头结点”。
类型定义同单链表linklist 如:求表长的操作: int getlen ( linklist L ) { int i =0; linklist p = L -> next ; while ( p!=L) { i + +; p=p->next; } return i ; }
例2:建立单链表--尾插法
L
L r 67 67 67 r r r r r
L
L
23 23
r->next = p; r =p;
10 10 10
L
L
67
67
23
23
45 45
36 ∧
r->next = NULL ;
//尾结点的指针域为空
void CreateList_L(LinkList &L, int n){
线性表运算的实现不同

按序号访问数据元素,使用顺序表优于链表。
插入删除操作,使用链表优于顺序表。
本章小结
1.了解线性表的逻辑结构特性是数据元素之间 存在着线性关系,在计算机中表示这种关系的 两类不同的存储结构是顺序存储结构和链式存 储结构。用前者表示的线性表简称为顺序表, 用后者表示的线性表简称为链表。 2.熟练掌握这两类存储结构的描述方法,以及 线性表的各种基本操作的实现。 3.能够从时间和空间复杂度的角度综合比较线性 表两种存储结构的不同特点及其适用场合。
e s s->next = p->next; s->next->prior = s;
ai
p->next = s; s->prior = p;
删除
ai-1 ai ai+1
q p q=p->next;
p->next = q->next;
p->next->prior = p;e=q->data;
free(q);
线性表两种存储的比较
实现不同
顺序表方法简单,各种高级语言中都有数组类型,容易实现; 链表的操作是基于指针的,相对来讲复杂些。
存储空间的占用和分配不同
从存储的角度考虑,顺序表的存储空间是静态分配的,在程序执行 之前必须明确规定它的存储规模,也就是说事先对“MAXSIZE”要有合 适的设定,过大造成浪费,过小造成溢出。而链表是动态分配存储空间 的,不用事先估计存储规模。可见对线性表的长度或存储规模难以估计 时,采用链表。
void ClearList_L(&L) {
// 将单链表重新置为一个空表,销毁怎么做 ???
while (L->next) {
p=L->next; L->next=p->next; free(p); } } // ClearList_L
算法时间复杂度: O(ListLength(L))
5) 建立单链表CreateList_L (&L, n)
其他形式链表、线性表总结
教学目的:1.掌握线性表的链式表示和实
现:顺序、逆序建立单链表的算法,掌握循 环链表、双向循环链表的C描述方法,了解 其遍历、插入、删除算法。
重点难点:顺序、逆序建立单链表的算法
教学内容
2.3 线性表的链式表示和实现
3、线性表的操作在单链表中的实现
4) 清空单链表ClearList_L(&L)
( 用两个指针表示元素间的逻辑关系 )
typedef struct DuLNode { ElemType data; // 数据域 struct DuLNode *prior; // 指向前驱的指针域 struct DuLNode *next; // 指向后继的指针域 } DuLNode, *DuLinkList;
an
例1:建立单链表--头插法
L L
∧ 36 ∧ 45 36 ∧ 36 ∧ 36 ∧ 36 ∧
L
L
10
23 67 23 10 10
45
45 45
L
L
void CreateList_L(LinkList &L, int n) {
// 逆序输入 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; // 插入 } } // CreateList_L 算法的时间复杂度为: O(Listlength(L))
6)链表的遍历(求表长)
void PrintList_L ( LinkList L ) { LinkList p = L->next ; while(p) { printf ( p->data ) ; //改为统计个数 p=p->next ; } }
其它形式的链表
1. 循环链表
最后一个结点的指针域的指针又指回 头结点(第一个结点)的链表,整个链表 形成一个环。
一元多项式
pn ( x) p0 p1 x p2 x ... pn x
2 n
在计算机中,可以用一个线性表来表示:
P = (p0, p1, …,pn)
但是对于形如
S(x) = 1 + 3x10000 – 2x20000
的多项式,上述表示方法是否合适?
一般情况下的一元稀疏多项式可写成
Pn(x) = p1xe1 + p2xe2 + ┄ + pmxem
其中:pi 是指数为ei 的项的非零系数,
0≤ e1 < e2 < ┄ < em = n
可以下列线性表表示:
((p1, e1), (p2, e2), ┄, (pm,em) )
例如: P999(x) = 7x3 - 2x12 - 8x999 可用线性表
与单链表操作比较 1.Initlist()初始化时,头结点的next不 为NULL,而是指向自身。 2.求表长:while中的条件改为p!=L; 3.插入、删除操作的基本语句无变化
操作基本一致,通常遇到的循环条件不
是判断指针p或p->next 是否为NULL,而是判
断它们是否等于头结点
2. 双向链表
如何从线性表得到单链表? 链表是一个动态的结构,它不需要
预分配空间,因此生成链表的过程是一
个个结点“逐个插入”的过程。
逆位序输入 n 个数据元素的值, 建立带头结点的单链表-头插法。
操作步骤: (1) 建立一个“空表”;
(2) 输入数据元素an, 建立结点并插入; (3) 输入数据元素an-1, 建立结点并插入; (4)依次类推,直至输入a1为止。 an-1 an
( (7, 3), (-2, 12), (-8, 999) )
表示
一元多项式的实现:
typedef OrderedLinkList polynomial;
// 用带表头结点的有序链表表示多项式
结点的数据元素类型定义为:
typedef struct { // 项的表示 float coef; // 系数 int expn; // 指数 } term, ElemType;
相关文档
最新文档