实现单链表的各种基本运算
数据结构能力测试集训题目

数据结构能力测试集训题目线性表1.实现顺序表各种基本运算的算法,并基础上设计一个主程序完成如下功能:(1)初始化顺序表L;(2)采用尾插法依次插入a,b,c,d,e;(3)输出顺序表L;(4)输出顺序表L的长度;(5)判断顺序表L是否为空;(6)输出顺序表L的第3个元素;(7)输出元素a的位置;(8)在第四个元素位置上插入f元素;(9)输出顺序表L;(10)删除顺序表L的第3个元素;(11)输出顺序表L;(12)释放顺序表L。
2.实现单链表各种基本运算的算法,并基础上设计一个主程序完成如下功能:(1)初始化单链表h;(2)采用尾插法依次插入a,b,c,d,e;(3)输出单链表h;(4)输出单链表h的长度;(5)判断单链表h是否为空;(6)输出单链表h的第3个元素;(7)输出元素a的位置;(8)在第四个元素位置上插入f元素;(9)输出单链表h;(10)删除单链表h的第3个元素;(11)输出单链表h;(12)释放单链表h;3.实现双链表各种基本运算的算法,并基础上设计一个主程序完成如下功能:(1)初始化双链表h;(2)采用尾插法依次插入a,b,c,d,e;(3)输出双链表h;(4)输出双链表h的长度;(5)判断双链表h是否为空;(6)输出双链表h的第3个元素;(7)输出元素a的位置;(8)在第四个元素位置上插入f元素;(9)输出双链表h;(10)删除双链表h的第3个元素;(11)输出双链表h;(12)释放双链表h;4.实现循环单链表各种基本运算的算法,并基础上设计一个主程序完成如下功能:(1)初始化循环单链表h;(2)采用尾插法依次插入a,b,c,d,e;(3)输出循环单链表h;(4)输出循环单链表h的长度;(5)判断循环单链表h是否为空;(6)输出循环单链表h的第3个元素;(7)输出元素a的位置;(8)在第四个元素位置上插入f元素;(9)输出循环单链表h;(10)删除循环单链表h的第3个元素;(11)输出循环单链表h;(12)释放循环单链表h;5.实现循环单链表各种基本运算的算法,并基础上设计一个主程序完成如下功能:(1)初始化循环双链表h;(2)采用尾插法依次插入a,b,c,d,e;(3)输出循环双链表h;(4)输出循环双链表h的长度;(5)判断循环双链表h是否为空;(6)输出循环双链表h的第3个元素;(7)输出元素a的位置;(8)在第四个元素位置上插入f元素;(9)输出循环双链表h;(10)删除循环双链表h的第3个元素;(11)输出循环双链表h;(12)释放循环双链表h;6.求集合的并,交,差运算(用有序单链表表示)栈和队列7.实现顺序栈各种基本运算的算法,编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序完成以下各种功能:(1)初始化栈s(2)判断栈s是否非空(3)依次进栈元素a,b,c,d,e(4)判断栈s是否非空(5)输出栈长度(6)输出从栈顶到栈底元素(7)输出出栈序列(8)判断栈s是否非空(9)释放栈8.实现链栈各种基本运算的算法,编写一个程序,实现链栈的各种基本算法,并在此基础上设计一个主程序完成如下功能:(1)初始化链栈s(2)判断链栈s是否非空(3)依次进栈元素a,b,c,d,e(4)判断链栈s是否非空(5)输出链栈长度(6)输出从栈顶到栈底元素(7)输出链栈序列(8)判断链栈s是否非空(9)释放链栈9.实现顺序队列各种基本运算的算法,编写一个程序,实现顺序循环队列各种基本运算,并在此基础上设计一个主程序完成如下功能:(1)初始化队列q(2)判断队列q是否非空(3)依次进队列元素a,b,c(4)出队一个元素,输出该元素(5)输出队列q的元素的个数(6)依次进队列元素d,e,f(7)输出队列q的元素的个数(8)输出出队序列(9)释放队列10.实现链队各种基本运算的算法,编写一个程序,实现链队的各种基本运算,在此基础上设计一个主程序完成如下功能:(1)初始化链队q(2)判断链队q是否非空(3)依次进链队元素a,b,c(4)出队一个元素,输出该元素(5)输出链队q的元素的个数(6)依次进链队元素d,e,f(7)输出链队q的元素的个数(8)输出出队序列(9)释放链队串11.实现顺序串各种基本运算的算法,编写一个程序实现顺序的基本运算的算法,比在此基础上设计一个主程序完成如下功能:(1)建立s=”abcdefghefghijklmn”和串s1=”xyz”(2)输出串s(3)输出串s的长度(4)在串s的第9个字符位置插入串s1而产生串s2(5)输出串s2(6)删除串s第2个字符开始的5个字符而产生的串s2(7)输出串s2(8)将串s第2个字符开始的5个字符替换成串s1而产生串s2(9)输出串s2(10)提取串s的第2个字符开始的10个字符而产生串s3(11)输出串s3(12)将串s1和串s2连接起来而产生的串s4(13)输出串s412.实现链串个各种基本运算的算法,编写一个程序实现链串的各种基本运算,并在此基础上设计一个主程序完成如下功能;(1)建立s=”abcdefghefghijklmn”和串s1=”xyz”(2)输出串s(3)输出串s的长度(4)在串s的第9个字符位置插入串s1而产生串s2(5)输出串s2(6)删除串s第2个字符开始的5个字符而产生的串s2(7)输出串s2(8)将串s第2个字符开始的5个字符替换成串s1而产生串s2(9)输出串s2(10)提取串s的第2个字符开始的10个字符而产生串s3(11)输出串s3(12)将串s1和串s2连接起来而产生的串s4(13)输出串s413.顺序串的各种模式匹配运算,编写一个程序实现顺序串的各种模式匹配运算,并在此基础上完成如下功能:(1)建立”abcabcdabcdeabcdefabcdefg”目标串s和”abcdeabcdefab”模式串t(2)采用简单匹配算法求t在s中的位置(3)由模式串t求出next值和nextval值(4)采用KMP算法求t在s中的位置(5)采用改进的KMP算法求t在s中的位置查找14.实现顺序查找的算法,编写一个程序输出在顺序表{3,6,2,10,1,8,5,7,4,9}中采用顺序方法查找关键字5的过程。
基于单链表实现集合的交集、并集、差集的运算

基于单链表实现集合的交集、并集、差集的运算解题思路(单链表求交集、并集、差集的思想和顺序表求交集、并集、差集的思想基本相同)1.先通过CreateListR 函数将集合 a 和 b 中的元素添加到顺序表 ha 和 hb 中,添加过程使⽤的是顺序表原有的Initlist 函数(初始化表)和ListInsert 函数(向表中插⼊元素)。
2.因为原集合是⽆序的,所以我通过 sort 函数(选择排序),使得集合变得有序。
3.得到有序集合 ha 和 hb 后,便可以使⽤ Union 函数(类似归并的思想写出来的求并集的函数),求出 ha 和 hb 的并集。
4.⽽求交集的⽅法则是,通过将集合 a 中的元素⼀个⼀个取出,并通过函数LocateElem ,查看集合 hb 中是否存在该元素,如果存在则将元素放⼊ hc ,如果不存在,则舍去。
以此求得两集合的交集。
5.求两集合的差则可以反过来,同样通过将集合 a 中的元素⼀个⼀个取出,并通过函数LocateElem ,查看集合 hb 中是否存在该元素,如果不存在则将元素放⼊ hc ,如果存在,则舍去。
以此求得两集合的差集。
#include <iostream>#include <cstdio>#include <malloc.h>using namespace std;/* 定义单链表数据 */typedef char ElemType;typedef struct LNode{ElemType data;struct LNode *next;}LinkList;/* 单链表的初始化 */void InitList(LinkList *&L){L = (LinkList *)malloc(sizeof(LinkList));L->next=NULL;}/* 向单链表中插⼊数据元素 */bool ListInsert(LinkList *&L,int x,char e){int j = 0;LinkList *p = L, *s;while(p!=NULL && j<x-1){p = p->next;j++;}if(p==NULL){return false;}else{s = (LinkList *)malloc(sizeof(LinkList));s->data = e;s->next = p->next;p->next = s;return true;}}/* 输出单链表 */void DispList(LinkList *L){LinkList *p = L->next;while(p!=NULL){printf("%c ",p->data);p = p->next;}printf("\n");}/* 求单链表的长度 */int ListLength(LinkList *L){LinkList *p = L->next;int i = 0;while(p!=NULL){p = p->next;}return i;}/* 查看单链表是否为空 */bool ListEmpty(LinkList *L){return L->next==NULL;}/* 求单链表中某个数据元素值 */bool GetElem(LinkList *L,int i, ElemType &e) {LinkList *p = L;int j = 0;while(p!=NULL && j < i){p=p->next;j++;}if(p==NULL){return false;}else{e = p->data;return true;}}/* 在单链表中查找元素 */int LocateElem(LinkList *L,ElemType e){LinkList *p = L;int i = 0;while(p!=NULL && p->data!=e){p = p->next;i++;}if(p==NULL){return0;}else{return i;}}/* 删除单链表中第 i 个元素*/bool ListDelete(LinkList *&L,int i,ElemType &e) {int j = 0;LinkList *p = L, *q;while(p!=NULL && j < i - 1){p = p->next;j++;}if(p==NULL)return false;else{q = p->next;if(q==NULL)return false;e = q->data;p->next = q->next;free(q);return true;}}/* 删除单链表 */void DestroyList(LinkList *&L){LinkList *p = L;LinkList *q = p->next;while(q!=NULL){p = q;q = p->next;}free(p);}void CreateListR(LinkList *&L,ElemType e[],int n) {InitList(L);int i;for(i = 0;i < n; ++i){if(!LocateElem(L,e[i]))ListInsert(L,i+1,e[i]);}}void InsterSect(LinkList *a,LinkList *b,LinkList *&c) {DestroyList(c);InitList(c);LinkList *p = a->next;int i = 0;while(p!=NULL){if(LocateElem(b,p->data))ListInsert(c,++i,p->data);p = p->next;}}void Subs(LinkList *a,LinkList *b,LinkList *&c){DestroyList(c);InitList(c);LinkList *p = a->next;int i = 0;while(p!=NULL){if(!LocateElem(b,p->data))ListInsert(c,++i,p->data);p = p->next;}}void Union(LinkList *a,LinkList *b,LinkList *&c){InitList(c);LinkList *p = a->next;LinkList *q = b->next;int k = 0;while(p!=NULL && q!=NULL){if(p->data < q->data){ListInsert(c,k+1,p->data);p = p->next;k++;}else if(p->data == q->data){ListInsert(c,k+1,p->data);p = p->next;q = q->next;k++;}else{ListInsert(c,k+1,q->data);q = q->next;k++;}}while(p!=NULL){ListInsert(c,k+1,p->data);p = p->next;k++;}while(q!=NULL){ListInsert(c,k+1,q->data);q = q->next;}///cout<<"hehe"<<endl;}void sort(LinkList *&L){LinkList *p , *pre, *q, *k;InitList(p);int i = 0;char c;while(!ListEmpty(L)){pre = L ->next;c = pre->data;while(pre!=NULL){if(c>=pre->data)c = pre->data;pre = pre->next;}ListInsert(p,++i,c);int tag = LocateElem(L,c);ListDelete(L,tag,c);}L = p;}int main( ){LinkList *ha, *hb, *hc;ElemType a[]={'c','a','e','h'};ElemType b[]={'f','h','b','g','d','a'};printf("集合的运算如下\n");CreateListR(ha,a,4);CreateListR(hb,b,6);printf("原集合 A: "); DispList(ha); printf("原集合 B: "); DispList(hb); sort(ha);sort(hb);printf("有序集合A:"); DispList(ha); printf("有序集合B:"); DispList(hb); Union(ha,hb,hc);printf("集合的并C:"); DispList(hc); InsterSect(ha,hb,hc);printf("集合的交C:"); DispList(hc); Subs(ha,hb,hc);printf("集合的差C:"); DispList(hc); DestroyList(ha);DestroyList(hb);DestroyList(hc);return0;}。
链表及其应用

头指针是指向链表中第一个结点(或为头结点或为首
元素结点)的指针。 单链表可由一个头指针唯一确定。
头结点是在链表的首元素结点之前附设的一个结点;
数据域内只放空表标志和表长等信息;
首元素结点是指链表中存储线性表第一个数据元素
a1的结点。
33
第3章 链表及其应用
讨论1. 在链表中设置头结点有什么好处?
我们可以用结构体来定义静态链表的节点数据类型: typedef struct{ Datatype data; int next; }node;
一个静态链表可以描述为: #define maxsize 100 node nodepool[maxsize];//存放链表的数组 int head; //放头指针的head 在静态链表中进行插入与删除操作不需要移动元素,
4
第3章 链表及其应用
3.1 链表的基本概念
3.1.1 什么是链表 ☞ 3.1.2 链表的逻辑结构
3.1.3 链表的存储结构 3.1.4 静态链表和动态链表 3.1.5 链表的基本运算
5
第3章 链表及其应用
♣ 链表的逻辑结构
☞ 同一链表中所有数据元素的数据类型必须相同。 ☞ 链表中相邻的元素ai-1、ai间存在序偶关系,即 对于非空的链表,ai-1是ai的唯一直接前驱,ai+1是 ai的唯一直接后继;而a1无前驱,an无后继 ☞ 链表属于线性逻辑结构。
结点3的地址:p->next;
28
第3章 链表及其应用
H
a1
p
p
a2
a3
a4
a5 ∧
再令p = p->next, 数据元素a3值:p ->data
结点4的地址:p->next;
实现单链表的各种基本运算

实现单链表的各种基本运算一、实验目的了解单链表表的结构特点及有关概念,掌握单链表的各种基本操作算法思想及其实现。
二、实验内容编写一个程序,实现顺序表的各种基本运算:1、初始化单链表;2、单链表的插入;3、单链表的输出;4、求单链表的长度5、判断单链表是否为空;6、输出单链表的第i位置的元素;7、在单链表中查找一个给定元素在表中的位置;8、单链表的删除; 9、释放单链表三、算法思想与算法描述简图四、实验步骤与算法实现#include<stdio.h>#include<malloc.h>typedef char ElemType;typedef struct LNode//定义单链表{ ElemType data;struct LNode *next;}LinkList;void InitList(LinkList*&L){ L=(LinkList*)malloc(sizeof(LinkList));//创建头结点L->next=NULL;//头结点赋值为空}void DestroyList(LinkList*&L)//销毁单链表(释放单链表L占用的内存空间即逐一释放全部结点的空间){ LinkList*p=L,*q=p->next;while(q!=NULL){free(p);p=q;q=p->next;}free(p);}int ListEmpty(LinkList*L)//判线性表是否为空表ListEmpty(L){ return(L->next==NULL);}//若单链表L没有数据结点,则返回真,否则返回假。
int ListLength(LinkList*L)//求线性表的长度ListLength(L){ LinkList*p=L;int i=0;while(p->next!=NULL){i++;p=p->next;}return(i);//返回单链表L中数据结点的个数}void DispList(LinkList*L)//输出线性表DispList(L){LinkList*p=L->next;while (p!=NULL)//逐一扫描单链表L的每个数据结点,并显示各结点的data域值。
数据结构实验报告实现单链表各种基本运算的算法

实验截图(1)void InitList(LinkNode *&L)//初始化线性表{L=(LinkNode *)malloc(sizeof(LinkNode)); //创建头结点L->next=NULL;//单链表置为空表}void DestroyList(LinkNode *&L)//销毁线性表{LinkNode *pre=L,*p=pre->next;实验截图(2)bool GetElem(LinkNode *L,int i,ElemType &e) //求线性表中第i个元素值{ int j=0;if (i<=0) return false;//i错误返回假LinkNode *p=L;//p指向头结点,j置为0(即头结点的序号为0) while (j<i && p!=NULL)//找第i个结点p{ j++;p=p->next;}if (p==NULL)//存在值为e的结点,返回其逻辑序号ireturn(i);}实验截图(3)bool ListInsert(LinkNode *&L,int i,ElemType e) //插入第i个元素{ int j=0;if (i<=0) return false;//i错误返回假LinkNode *p=L,*s;//p指向头结点,j置为0(即头结点的序号为0) while (j<i-1 && p!=NULL)//查找第i-1个结点p{ j++;p=p->next;}}实验截图(4)编写exp2-2.cpp程序包含有关代码//文件名:exp2-2.cpp#include "linklist.cpp"int main(){LinkNode *h;ElemType e;printf("单链表的基本运算如下:\n");printf(" (1)初始化单链表h\n");InitList(h);printf(" (2)依次采用尾插法插入a,b,c,d,e元素\n");return 1;}实验截图(5)运行得到结果实验截图(6)。
算法与数据结构实验报告

2015-2016学年第二学期《算法与数据结构》课程实验报告专业软件工程学生姓名成晓伟班级软件141学号1410075094实验学时16实验教师徐秀芳信息工程学院实验一单链表的基本操作一、实验目的1.熟悉C语言上机环境,进一步掌握C语言的基本结构及特点。
2.掌握线性表的各种物理存储表示和C语言实现。
3.掌握单链表的各种主要操作的C语言实现。
4.通过实验理解线性表中的单链表存储表示与实现。
二、主要仪器及耗材普通计算机三、实验内容与要求1、用C语言编写一个单链表基本操作测试程序。
(1)初始化单链表(2)创建单链表(3)求单链表长度(4)输出单链表中每一个结点元素(5)指定位置插入某个元素(6)查找第i个结点元素的值(7)查找值为e 的结点,并返回该结点指针(8)删除第i个结点(9)销毁单链表2、实验要求(1)程序中用户可以选择上述基本操作。
程序启动后,在屏幕上可以菜单形式显示不同功能,当按下不同数字后完成指定的功能,按其他键,则显示错误后重新选择。
(2)要求用线性表的顺序存储结构,带头结点的单链表存储结构分别实现。
(3)主函数实现对基本操作功能的调用。
3、主要代码(1)初始化单链表LinkList *InitList(){ //创建一个空链表,初始化线性表LinkList *L;L=(LinkList *)malloc(sizeof(LinkList));L->next=NULL;return L;}(2)创建单链表//头插法void CreateListF(LinkList *L){LinkList *s;int i=1,a=0;while(1){printf("输入第%d个元素(0表示终止)",i++);scanf("%d",&a);if(a==0)break;s=(LinkList *)malloc(sizeof(LinkList));s->data=a;s->next=L->next;L->next=s;}}(3)求链表长度int ListLength(LinkList *L){ //求链表长度int n=0;LinkList *p=L;while(p->next!=NULL){p=p->next;n++;}return(n);}(4)在指定位置插入元素int InsertList(LinkList *L,int i,ElemType e){LinkList *p=L,*s;int j=0;while(p!=NULL&&j<i-1){p=p->next;j++;} //找出要插入的位置的前一个位置if(p==NULL){return 0;}else{s=(LinkList *)malloc(sizeof(LinkList));s->data=e;s->next=p->next;p->next=s;return 1;}}(5)输出链表void DispList(LinkList *L){ //输出链表LinkList *p=L->next;while(p!=NULL){printf("%d",p->data);p=p->next;}printf("\n");}(6)查找链表中指定元素int GetElem(LinkList *L,int i){ //查找链表中指定元素LinkList *p=L;int j=0;while(j<i&&p!=NULL){j++;p=p->next;}if(p==NULL){return 0;}else{return p->data;}}(7)查找值是e的结点并返回该指针LinkList *LocateElem(LinkList *L,ElemType e){ //查找值是e的结点并返回该指针int i=1;LinkList *p=L;while(p!=NULL)if(p->data==e) return p;}if(p==NULL){return NULL;}}(8)删除元素int ListDelete(LinkList *L,int i,ElemType *e){ //删除元素LinkList *p=L,*q;int j=0;while(p!=NULL&&j<i-1){p=p->next;j++;} //找到要删除元素地址的前一个地址if(p==NULL){ return 0;} //不能删除else{q=p->next;*e=q->data;p->next=q->next;free(q); //删除成功return 1;}}(9)销毁链表void DestroyList(LinkList *L){//销毁链表LinkList *pre=L,*p=L->next;while(p!=NULL){free(pre);pre=p;p=pre->next;}free(pre);}main函数:int main(){LinkList *L;ElemType e;int i;L=InitList();CreateListF(L);DispList(L);printf("输入要查找的元素位置:\n");scanf("%d",&i);e=GetElem(L,i);printf("%d\n",e);printf("单链表长度为:%d\n",ListLength(L));printf("输入要删除元素的位置:");scanf("%d",&i);if (i>ListLength(L)){printf("超出范围重新输入");scanf("%d",&i);}if(ListDelete(L,i,&e)==0){printf("未找到元素\n");}else DispList(L);printf("输入插入元素的位置和值:");scanf("%d%d",&i,&e);InsertList(L,i,e);DispList(L);return 0;}4、测试数据及测试结果输入:23 56 12 28 45输出:四、注意事项1、存储结构定义和基本操作尽可能用头文件实现。
数据结构-单链表实验报告

单链表实验报告一、实验目的1、帮助读者复习C++语言程序设计中的知识。
2、熟悉线性表的逻辑结构。
3、熟悉线性表的基本运算在两种存储结构上的实现,其中以熟悉链表的操作为侧重点。
二、实验内容[问题描述]实现带头结点的单链表的建立、求长度,取元素、修改元素、插入、删除等单链表的基本操作。
[基本要求](1)依次从键盘读入数据,建立带头结点的单链表;(2)输出单链表中的数据元素(3)求单链表的长度;(4)根据指定条件能够取元素和修改元素;(5)实现在指定位置插入和删除元素的功能。
三、算法设计(1)建立带表头结点的单链表;首先输入结束标志,然后建立循环逐个输入数据,直到输入结束标志。
(2)输出单链表中所有结点的数据域值;首先获得表头结点地址,然后建立循环逐个输出数据,直到地址为空。
(3)输入x,y在第一个数据域值为x的结点之后插入结点y,若无结点x,则在表尾插入结点y;建立两个结构体指针,一个指向当前结点,另一个指向当前结点的上一结点,建立循环扫描链表。
当当前结点指针域不为空且数据域等于x的时候,申请结点并给此结点数据域赋值为y,然后插入当前结点后面,退出函数;当当前结点指针域为空的时候,申请结点并给此结点数据域赋值为y,插入当前结点后面,退出函数。
(4)输入k,删除单链表中所有的结点k,并输出被删除结点的个数。
建立三个结构体指针,一个指向当前结点,另一个指向当前结点的上一结点,最后一个备用;建立整形变量l=0;建立循环扫描链表。
当当前结点指针域为空的时候,如果当前结点数据域等于k,删除此结点,l++,跳出循环,结束操作;如果当前结点数据域不等于k,跳出循环,结束操作。
当当前结点指针域不为空的时候,如果当前结点数据域等于k,删除此结点,l++,继续循环操作;如果当前结点数据域不等于k,指针向后继续扫描。
循环结束后函数返回变量l的值,l便是删除的结点的个数。
四、实验结果1、新建一个链表:2、输出链表的数据:(4)插入数据:在数据为3后面插入一个数据100:(5)删除数据:删除刚刚插入的数据100:五、总结实验之前由于准备不够充分,所以堂上实验时只完成了建立单链表和数据的输出,而后面两个实验要求也是用来很多时间长完成的。
做表格时如何做到计算公式的循环运用-

竭诚为您提供优质文档/双击可除做表格时如何做到计算公式的循环运用?篇一:实现循环单链表表各种基本运算的算法篇二:excel循环引用产生的原因及解决方法excel循环引用产生的原因及解决方法我们打开excel文件时,如果遇到有“microsoftofficeexcel不能计算公式。
公式中的单元格引用指向的是公式的结果,从而造成循环引用。
”的提示,这时这个文件中,就包含了循环引用了。
循环引用:如果公式引用自己所在的单元格,不论是直接的还是间接的,都称为循环引用。
循环引用有一个特别的应用例子。
而且只要打开的工作簿中有一个包含循环引用,excel都将无法自动计算所有打开的工作簿。
这时只能取消循环引用,或利用先前的迭代计算结果计算循环引用中的每个单元格引用。
下面的图就是直接与间接造成循环引用的实例:上面的图中,e3的单元格的公式为=sum("e:e"),这样的公式直接引用了公式所在的单元格,而造成循环引用,而a4的公式为=c1,c1的公式为=c6,最后c6的公式为=a4,这样(做表格时如何做到计算公式的循环运用)的情况就造成了间接的循环引用了。
知道了循环引用的成因之后,解决的方法一就是去除与更正错误的公式,像e3的公式经常是因为选择数据区域时有误造成的,修改成正确的区域就可以了。
那怎么快速定位错误的公式所在的单元格呢?在写公式的时候,当设定的公式造成循环引用时,就会出现如左边部份的蓝色箭头,这样我们就比较容易找出出错的位置。
但如果是保存后再打开时,excel不会生成类似的标志,除非你选择了公式所在的单元格,在利用循环引用工具栏里的命令生成。
不过好在我们可以在状态栏(右下角)里看到出错出现公式的位图,如图会显示——循环:e3,这样我们就可以跟据这个提示,一个个修改过来,至到没有提示为至!到此,循环引用的原因与解决方法就说完了,遇到类似问题的你,就不会再困惑了吧!篇三:在woRd中表示循环小数中循环节的方法在woRd中表示循环小数中循环节的方法:方法:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实现单链表的各种基本运算一、实验目的了解单链表表的结构特点及有关概念,掌握单链表的各种基本操作算法思想及其实现。
二、实验内容编写一个程序,实现顺序表的各种基本运算:1、初始化单链表;2、单链表的插入;3、单链表的输出;4、求单链表的长度5、判断单链表是否为空;6、输出单链表的第i位置的元素;7、在单链表中查找一个给定元素在表中的位置;8、单链表的删除; 9、释放单链表三、算法思想与算法描述简图主函数main void InitList(LinkList*&L) 初始化单链表Lvoid DestroyList(LinkList*&L)//释放单链表Lint ListEmpty(LinkList*L)//判断单链表L是否为空集int Listlength(LinkList*L)//返回单链表L的元素个数void DispList(LinkListt*L)//输出单链表Lint GetElem(LinkList*L,int i,char e)/*ElemType e)获取单链表L中的第i个元素*/int LocateEmpty(LinkList*L,char e)/*ElemType e)在单链表L中查找元素e*/int ListInsert(LinkList*&L,int i,char e)/*ElemType e)在单链表中第i个位置上插入元素e*/int ListDelete(LinkList*&L,int i,char &e)/*ElemTypee)在单链表L中删除第i个元素*/四、实验步骤与算法实现#include<stdio.h>#include<malloc.h>typedef char ElemType;typedef struct LNode//定义单链表{ ElemType data;struct LNode *next;}LinkList;void InitList(LinkList*&L){ L=(LinkList*)malloc(sizeof(LinkList));//创建头结点L->next=NULL;//头结点赋值为空}void DestroyList(LinkList*&L)//销毁单链表(释放单链表L占用的内存空间即逐一释放全部结点的空间){ LinkList*p=L,*q=p->next;while(q!=NULL){free(p);p=q;q=p->next;}free(p);}int ListEmpty(LinkList*L)//判线性表是否为空表ListEmpty(L){ return(L->next==NULL);}//若单链表L没有数据结点,则返回真,否则返回假。
int ListLength(LinkList*L)//求线性表的长度ListLength(L){ LinkList*p=L;int i=0;while(p->next!=NULL){i++;p=p->next;}return(i);//返回单链表L中数据结点的个数}void DispList(LinkList*L)//输出线性表DispList(L){LinkList*p=L->next;while (p!=NULL)//逐一扫描单链表L的每个数据结点,并显示各结点的data域值。
{printf("%c",p->data);p=p->next;}printf("\n");}int GetELem(LinkList*L,int i,ElemType&e)//求线性表L中指定位置的某个数据元素GetElem(L,i,&e){int j=0;LinkList*p=L;while(j<i&&p!=NULL)//在单链表L中从头开始找到第 i个结点,若存在第i 个数据结点,则将其data域值赋给变量e。
{j++;p=p->next;}if(p==NULL)return 0;//不存在第i个数据结点else{e=p->data;//存在第i个数据结点return 1;}}int LocateElem(LinkList*L,ElemType e)//按元素值查找LocateElem(L,e) {LinkList *p=L->next;int n=1;while (p!=NULL&&p->data!=e)//在单链表L中从头开始找第1个值域与e相等的结点,若存在这样的结点,则返回位置,否则返回0。
{p=p->next;n++;}if(p=NULL)return (0);elsereturn (n);}int ListInsert(LinkList*&L,int i,ElemType e)//插入数据元素ListInsert(&L,i,e){int j=0;LinkList*p=L,*s;while(j<i-1&&p!=NULL)//先在单链表L中找到第i-1个结点*p,若存在这样的结点,将值为e的结点*s插入到其后。
{j++;p=p->next;}if(p==NULL)return 0;//未找到位序为i-1的结点else{s=(LinkList*)malloc(sizeof(LinkList));s->data=e;s->next=p->next;//将*s插入到*p之后p->next=s;return 1;}}int ListDelete(LinkList*&L,int i,ElemType &e)//删除数据元素ListDelete(&L,i,&e){int j=0;LinkList*p=L,*q;while(j<i-1&&p!=NULL)//查找第i-1个结点{j++;p=p->next;}if(p==NULL)//未找到位序为i-1的结点return 0;else//找到位序为i-1的结点*p{q=p->next;//q指向要删除的结点if(q==NULL)return 0;//若不存在第i个结点,返回0e=q->data;p->next=q->next;//从单链表中删除*q结点free(q);//释放*q结点return 1;}}void main(){LinkList *h;ElemType e;printf("(1)初始化单链表h\n");InitList(h);printf("(2)依次采用尾插入abcd,efgh,jilk,nnnn,kkkk元素\n");ListInsert(h,1,'abcd');ListInsert(h,2,'efgh');ListInsert(h,3,'jilk');ListInsert(h,4,'nnnn');ListInsert(h,5,'kkkk');printf("(3)输出单链表h:");DispList(h);printf("(4)单链表h长度=%d\n",ListLength(h));printf("(5)单链表h为%s\n",(ListEmpty(h)?"空":"非空")); GetELem(h,3,e);printf("(6)单链表h的第三个元素=%c\n",e);printf("(7)元素a的位置=%d\n",LocateElem(h,'a'));printf("(8)在第四个元素的位置上插入9元素\n"); ListInsert(h,4,'9');printf("(9)输出单链表h:");DispList(h);printf("(10)删除h的第三个元素\n");ListDelete(h,3,e);printf("(11)输出单链表h:");DispList(h);printf("(12)释放单链表h\n");DestroyList(h);}五、实验测试及结果六、思考题1、单链表有带头结点和不带头结点两种形式,则相应的操作实现有何区别?答:在带头节点的单链表中,头指针(head)只有一个域,即链指针,它指向头结点,头结点有两个域,一个是数据域,值为0(NULL),还有一个域,链指针,这个链指针指向单链表的第一个数据元素。
而在不带头结点的单链表中,头指针也只有一个链指针,但它指向单链表的第一个数据元素。
2、单向循环链表、双向链表、双向循环链表基本操作的实现。
答:(1)单向循环链表循环链表的基本运算实现算法与非循环链表的算法基本相同,只是对表尾的判断作了改变。
因此单向循环链表与单链表基本上操作相同,只不过表尾的条件将发生变化。
(2)双向链表基本操作实现双链表中有两个指针域,一个指向其直接后继结点,另一个指向其直接前驱结点。
建立双链表有头插法和尾插法。
【1】头插法:Void CreateListF(DLinkList *&L,ElemType a[],int n)//由含有n个元素的数组a创建带头结点的双链表L{DLinkList *s;int i;L=(DLinkList *)malloc(sizeof(DLinkList));L->prior=L->next=NULL;for(i=0;i<n;i++){s=(DLinkList *)malloc(sizeof(DLinkList));s->data=a[i];s->next=L->next;if(L->next!=NULL)L->next=L->prior=s;L->next=s;s->prior=L;}}【2】尾插法Void CreateListF(DLinkList *&L,ElemType a[],int n)//由含有n个元素的数组a创建带头结点的双链表L{DLinkList *s,*r;int I;L=(DLinkList *)malloc(sizeof(DLinkList));L->prior=L->next=NULL;r=L;//r始终指向尾结点,开始时指向头结点for(i=0;i<n;i++){s=(DLinkList *)malloc(sizeof(DLinkList));s->data=a[i];r->next=s;s->prior=r;r=s;}r->next=NULL;}在双链表中,大部分基本操作运算与单链表相同,除插入与删除有所区别。