数据结构课程设计单链表操作

合集下载

单链表课程设计

单链表课程设计

单链表课程设计一、课程目标知识目标:1. 学生能理解单链表的基本概念,掌握其结构特点及在数据结构中的重要性。

2. 学生能够运用所学知识,实现单链表的创建、插入、删除和查找等基本操作。

3. 学生能够掌握单链表与数组、栈、队列等其他数据结构的关系与区别。

技能目标:1. 学生能够运用编程语言(如C、C++等)实现单链表的相关操作,提高编程能力。

2. 学生能够通过实际操作,培养解决实际问题的能力,提高逻辑思维能力。

情感态度价值观目标:1. 学生通过学习单链表,培养对数据结构的兴趣,提高学习积极性。

2. 学生在学习过程中,学会与他人合作,培养团队精神和沟通能力。

3. 学生能够认识到数据结构在计算机科学中的重要性,增强对专业知识的认同感。

课程性质分析:本课程为计算机科学与技术专业的基础课程,旨在让学生掌握单链表这一基础数据结构,为后续学习更复杂的数据结构打下基础。

学生特点分析:学生已具备基本的编程能力,具有一定的逻辑思维能力,但可能对数据结构的应用场景认识不足,需要通过实际案例激发兴趣。

教学要求:1. 结合实际案例,讲解单链表的理论知识,让学生了解其在实际问题中的应用。

2. 通过课堂讲解、上机实践等教学手段,让学生掌握单链表的相关操作。

3. 注重培养学生的编程能力和逻辑思维能力,提高解决实际问题的能力。

二、教学内容1. 单链表基本概念:介绍单链表的定义、结构特点及其在数据结构中的应用场景。

- 教材章节:第二章第二节- 内容安排:讲解单链表的组成元素(节点、指针)、分类(单向、双向)及优缺点。

2. 单链表基本操作:- 教材章节:第二章第三节- 内容安排:讲解单链表的创建、插入、删除、查找等基本操作,并通过实例演示。

3. 单链表与其它数据结构的对比:- 教材章节:第二章第四节- 内容安排:分析单链表与数组、栈、队列等其他数据结构的区别和联系,突出单链表的特点。

4. 单链表编程实践:- 教材章节:第二章第五节- 内容安排:结合上机实践,让学生动手实现单链表的基本操作,培养编程能力和解决实际问题的能力。

单链表的操作课程设计

单链表的操作课程设计

单链表的操作 课程设计一、课程目标知识目标:1. 理解单链表的概念,掌握单链表的结构特点及其在数据结构中的重要性。

2. 学会创建单链表,理解单链表节点的定义及链表的初始化过程。

3. 掌握单链表的基本操作,包括插入、删除、查找和遍历等。

技能目标:1. 能够运用所学知识,独立编写程序实现单链表的创建和基本操作。

2. 能够通过单链表解决实际问题,如数据管理、排序等。

3. 能够对单链表程序进行调试和优化,提高程序的执行效率。

情感态度价值观目标:1. 培养学生的逻辑思维能力,提高学生分析问题和解决问题的能力。

2. 激发学生对数据结构的兴趣,引导学生主动探索和学习更多相关知识。

3. 培养学生的团队协作意识,通过课堂讨论和小组活动,让学生学会互相帮助和共同进步。

本课程针对高年级学生,在已有编程基础和基本数据结构知识的前提下,进一步深化对单链表的认识和应用。

课程注重理论与实践相结合,强调学生的动手实践能力和问题解决能力的培养。

通过本课程的学习,期望学生能够掌握单链表的相关知识,为后续学习更复杂的数据结构打下坚实基础。

二、教学内容1. 单链表的基本概念:包括单链表的定义、结构特点及其在数据结构中的应用场景。

- 教材章节:第二章第二节“线性表的链式存储结构”2. 单链表的创建与初始化:讲解单链表节点的定义,演示如何创建和初始化一个单链表。

- 教材章节:第二章第三节“单链表的创建与初始化”3. 单链表的基本操作:- 插入:介绍在单链表中插入节点的具体方法,包括头部插入、尾部插入和指定位置插入。

- 删除:讲解删除单链表中节点的操作,包括头部删除、尾部删除和指定位置删除。

- 查找:介绍在单链表中查找特定节点的算法。

- 遍历:演示如何遍历单链表,访问链表中的所有节点。

- 教材章节:第二章第四节“单链表的基本操作”4. 单链表的应用案例:结合实际问题,展示如何运用单链表解决数据管理和排序等问题。

- 教材章节:第二章第五节“单链表的应用实例”5. 单链表的调试与优化:介绍如何对单链表程序进行调试和优化,提高程序执行效率。

数据结构-单链表基本操作实现(含全部代码)

数据结构-单链表基本操作实现(含全部代码)

数据结构-单链表基本操作实现(含全部代码)今天是单链表的实现,主要实现函数如下:InitList(LinkList &L) 参数:单链表L 功能:初始化时间复杂度 O(1)ListLength(LinkList L) 参数:单链表L 功能:获得单链表长度时间复杂度O(n)ListInsert(LinkList &L,int i,ElemType e) 参数:单链表L,位置i,元素e 功能:位置i后插时间复杂度O(n)[加⼊了查找]若已知指针p指向的后插 O(1)ListDelete(LinkList &L,int i) 参数:单链表L,位置i 功能:删除位置i元素时间复杂度O(n)[加⼊了查找]若已知p指针指向的删除最好是O(1),因为可以与后继结点交换数据域,然后删除后继结点。

最坏是O(n),即从头查找p之前的结点,然后删除p所指结点LocateElem(LinkList L,ElemType e) 参数:单链表L,元素e 功能:查找第⼀个等于e的元素,返回指针时间复杂度O(n)代码:/*Project: single linkeed list (数据结构单链表)Date: 2018/09/14Author: Frank YuInitList(LinkList &L) 参数:单链表L 功能:初始化时间复杂度 O(1)ListLength(LinkList L) 参数:单链表L 功能:获得单链表长度时间复杂度O(n)ListInsert(LinkList &L,int i,ElemType e) 参数:单链表L,位置i,元素e 功能:位置i后插时间复杂度O(n)[加⼊了查找]若已知指针p指向的后插 O(1)ListDelete(LinkList &L,int i) 参数:单链表L,位置i 功能:删除位置i元素时间复杂度O(n)[加⼊了查找]若已知p指针指向的删除最好是O(1),因为可以与后继结点交换数据域,然后删除后继结点。

数据结构单链表实验报告

数据结构单链表实验报告

数据结构单链表实验报告一、实验目的本次实验的主要目的是深入理解和掌握数据结构中单链表的基本概念、操作原理和实现方法。

通过实际编程实现单链表的创建、插入、删除、查找等操作,提高对数据结构的应用能力和编程技能。

二、实验环境本次实验使用的编程语言为 C 语言,开发环境为 Visual Studio 2019。

三、实验原理单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据域和指针域。

数据域用于存储节点的数据信息,指针域用于指向下一个节点的地址。

通过这种链式结构,可以方便地进行节点的插入、删除和遍历等操作。

四、实验内容与步骤1、单链表节点的定义```ctypedef struct Node {int data;struct Node next;} Node;```2、单链表的创建```cNode createList(){Node head = NULL;Node newNode;int data;printf("请输入节点数据(输入-1 结束):\n");scanf("%d",&data);while (data!=-1) {newNode =(Node)malloc(sizeof(Node));newNode>data = data;newNode>next = NULL;if (head == NULL) {head = newNode;} else {Node temp = head;while (temp>next!= NULL) {temp = temp>next;}temp>next = newNode;}scanf("%d",&data);}return head;}```3、单链表的插入操作```cvoid insertNode(Node head, int position, int data) {Node newNode =(Node)malloc(sizeof(Node));newNode>data = data;newNode>next = NULL;if (position == 1) {newNode>next = head;head = newNode;} else {Node temp = head;int count = 1;while (temp!= NULL && count < position 1) {temp = temp>next;count++;}if (temp!= NULL) {newNode>next = temp>next;temp>next = newNode;} else {printf("插入位置无效!\n");}}}```4、单链表的删除操作```cvoid deleteNode(Node head, int position) {if (head == NULL) {printf("链表为空,无法删除!\n");return;}Node temp = head;if (position == 1) {head = head>next;free(temp);} else {Node prev = NULL;int count = 1;while (temp!= NULL && count < position) {prev = temp;temp = temp>next;count++;}if (temp!= NULL) {prev>next = temp>next;free(temp);} else {printf("删除位置无效!\n");}}}```5、单链表的查找操作```cNode searchNode(Node head, int data) {Node temp = head;while (temp!= NULL) {if (temp>data == data) {return temp;}temp = temp>next;}return NULL;}```6、单链表的遍历打印```cvoid printList(Node head) {Node temp = head;while (temp!= NULL) {printf("%d ", temp>data);temp = temp>next;}printf("\n");}```五、实验结果与分析1、创建单链表输入一系列整数,成功创建了单链表。

数据结构单链表实验报告

数据结构单链表实验报告

数据结构单链表实验报告一、实验目的1、深入理解单链表的数据结构及其基本操作。

2、掌握单链表的创建、插入、删除、查找等操作的实现方法。

3、通过实际编程,提高对数据结构和算法的理解和应用能力。

二、实验环境1、操作系统:Windows 102、编程语言:C 语言3、开发工具:Visual Studio 2019三、实验原理单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据域和指针域。

指针域用于指向下一个节点,从而形成链表的链式结构。

单链表的基本操作包括:1、创建链表:通过动态分配内存创建链表的头节点,并初始化链表为空。

2、插入节点:可以在链表的头部、尾部或指定位置插入新的节点。

3、删除节点:根据给定的条件删除链表中的节点。

4、查找节点:在链表中查找满足特定条件的节点。

四、实验内容(一)单链表的创建```cinclude <stdioh>include <stdlibh>//定义链表节点结构体typedef struct Node {int data;struct Node next;} Node;//创建单链表Node createList(){Node head =(Node)malloc(sizeof(Node));if (head == NULL) {printf("内存分配失败!\n");return NULL;}head>data = 0;head>next = NULL;return head;}int main(){Node list = createList();//后续操作return 0;}```在创建单链表时,首先为头节点分配内存空间。

若内存分配失败,则提示错误信息并返回`NULL`。

成功分配内存后,初始化头节点的数据域和指针域。

(二)单链表的插入操作插入操作分为三种情况:头部插入、尾部插入和指定位置插入。

1、头部插入```cvoid insertAtHead(Node head, int data) {Node newNode =(Node)malloc(sizeof(Node));if (newNode == NULL) {printf("内存分配失败!\n");return;}newNode>data = data;newNode>next = head>next;head>next = newNode;}```头部插入时,创建新节点,将新节点的数据域赋值,并将其指针域指向原头节点的下一个节点,然后更新头节点的指针域指向新节点。

单链表基本操作

单链表基本操作

单链表基本操作在计算机科学里,链表是一种常见的数据结构,它可以用来解决各种复杂的问题。

其中,单链表是最常见的一种,它由一系列节点组成,每个节点包含了一个数据元素和一个指针,指向下一个节点。

这篇文章将介绍单链表的基本操作,包括创建、插入、删除和遍历等。

创建单链表创建单链表是基本操作之一,它有两种方法:头插法和尾插法。

头插法是从链表的头节点开始,逐个将新节点插入。

具体来说,创建一个空链表,设置一个头节点,将头节点的指针指向空;依次输入新节点,将新节点的指针指向表头,将表头的指针指向新节点。

这样,每插入一个新节点就成为了新的表头,即最后插入的节点为新的表头。

尾插法则是从链表的尾节点开始,逐个将新节点插入。

具体来说,创建一个空链表,设置一个头节点,将头节点的指针指向空;依次输入新节点,将新节点的指针指向空,将最后一个节点的指针指向新节点。

这样,最后插入的节点为尾节点,它的指针值为空。

插入节点插入节点是指在单链表的任意位置插入一个新节点。

插入节点的前提是找到插入位置,可以通过遍历单链表来查找插入位置。

插入新节点的基本步骤如下:1、创建新节点;2、将新节点的指针指向待插入节点的后继节点;3、将待插入节点的指针指向新节点。

删除节点删除节点是指删除单链表中的任意节点。

删除节点的前提是找到删除的节点位置,可以通过遍历单链表来查找删除位置。

删除节点的基本步骤如下:1、找到要删除的节点;2、将该节点的前驱节点的指针指向该节点的后继节点;3、删除该节点。

遍历节点遍历节点是指按照链表的顺序依次访问链表中的各个节点。

遍历节点的基本步骤如下:1、从链表的头节点开始遍历;2、依次访问每个节点的数据元素;3、通过指针访问下一个节点,直到遇到尾节点。

优缺点单链表的优点是简单,灵活,易于实现和扩展,可以方便地进行插入和删除等操作。

其缺点是存在指针开销,查找元素时需要遍历整个链表,不能直接访问链表中任意位置的节点。

总结单链表是一种最常用的数据结构,它是由一系列节点组成,每个节点包含一个数据元素和一个指针,指向下一个节点。

数据结构 实验一:实现单链表各种基本运算的算法

数据结构 实验一:实现单链表各种基本运算的算法

- 1 -实验一:实现单链表各种基本运算的算法一、 实验目的1、 掌握单链表存储结构的类型定义;2、 实现单链表各种基本运算的算法。

二、 实验环境1、 Windows 操作系统;2、 Visual C++ 6.0三、 实验内容实现单链表各种基本运算的算法。

四、 概要设计1.存储结构的类型定义:Typedef struct LNode{ElemType data;Struct LNode *next;}LinkList;2.单链表示意图:3.项目组成图:4.algo2_2.cpp 的程序文件包含的函数原型及功能:InitList(LinkList *&L) 初始化单链表LDestroyList(LinkList *&L) 释放单链表LListEmpty(LinkList *L)判断单链表L 是否为空表ListLength(LinkList *L)返回单链表L 的元素个数DispList(LinkList *L)输出单链表LGetElem(LinkList *L,int i,ElemType &e)获取单链表L 的第i 个元素LocateElem(LinkList *L,ElemType e)在单链表L 中查找元素eListInsert(LinkList *&L,int i,ElemType e)在单链表L 中的第i 个位置上插入元素e…… head a 1 a 2 a 3 a n ∧ListDelete(LinkList *&L,int i,ElemType &e)在单链表L中删除第i个元素5.exp2_2.cpp程序文件简介:InitList(LinkList *&L) 初始化单链表LDestroyList(LinkList *&L) 释放单链表LListEmpty(LinkList *L) 判断单链表L是否为空表ListLength(LinkList *L) 返回单链表L的元素个数DispList(LinkList *L) 输出单链表LGetElem(LinkList *L,int i,ElemType &e) 获取单链表L的第i个元素LocateElem(LinkList *L,ElemType e) 在单链表L中查找元素eListInsert(LinkList *&L,int i,ElemType e) 在单链表L中的第i个位置上插入元素e ListDelete(LinkList *&L,int i,ElemType &e) 在单链表L中删除第i个元素6.proj2-2的项目的模块结构:在文件algo2-2中,(1)定义单链表结构类型;(2)初始化单链表(3)定义释放单链表的函数(4)定义判断单链表是否为空的函数(5)定义返回单链表元素个数的函数(6)定义输出单链表的函数(7)定义获取第i个元素的函数(8)定义查找元素的函数(9)定义插入元素的函数(10)定义删除元素的函数在文件exp2-2中分别调用algo2-2中所定义的函数7.函数调用关系图:五、详细设计源代码清单见附录。

实验二 单链表基本操作

实验二 单链表基本操作

实验二单链表基本操作一实验目的1.学会定义单链表的结点类型,实现对单链表的一些基本操作和具体的函数定义,了解并掌握单链表的类定义以及成员函数的定义与调用。

2.掌握单链表基本操作及两个有序表归并、单链表逆置等操作的实现。

二实验要求1.预习C语言中结构体的定义与基本操作方法。

2.对单链表的每个基本操作用单独的函数实现。

3.编写完整程序完成下面的实验内容并上机运行。

4.整理并上交实验报告。

三实验内容1.编写程序完成单链表的下列基本操作:(1)初始化单链表La。

(2)在La中第i个元素之前插入一个新结点。

(3)删除La中的第i个元素结点。

(4)在La中查找某结点并返回其位置。

(5)打印输出La中的结点元素值。

2 .构造两个带有表头结点的有序单链表La、Lb,编写程序实现将La、Lb合并成一个有序单链表Lc。

合并思想是:程序需要3个指针:pa、pb、pc,其中pa,pb分别指向La表与Lb表中当前待比较插入的结点,pc 指向Lc表中当前最后一个结点。

依次扫描La和Lb中的元素,比较当前元素的值,将较小者链接到*pc 之后,如此重复直到La或Lb结束为止,再将另一个链表余下的内容链接到pc所指的结点之后。

3.构造一个单链表L,其头结点指针为head,编写程序实现将L逆置。

(即最后一个结点变成第一个结点,原来倒数第二个结点变成第二个结点,如此等等。

)四思考与提高1.如果上面实验内容2中合并的表内不允许有重复的数据该如何操作?2.如何将一个带头结点的单链表La分解成两个同样结构的单链表Lb,Lc,使得Lb中只含La表中奇数结点,Lc中含有La表的偶数结点?1.编写程序完成单链表的下列基本操作:(1)初始化单链表La。

(2)在La中第i个元素之前插入一个新结点。

(3)删除La中的第i个元素结点。

(4)在La中查找某结点并返回其位置。

(5)打印输出La中的结点元素值。

#include<stdio.h>#include<stdlib.h>#include <malloc.h>#define OK 1#define ERROR 0typedef int Status;typedef int ElemType;//定义存储结构typedef struct Lnode{int data; /*每个元素数据信息*/struct Lnode *next; /*存放后继元素的地址*/} LNode,*LinkList;int main(){void Create_L(LinkList &L,int n);void Print_L(LinkList L);Status ListInsert_L(LinkList &L,int i,ElemType e);Status ListDelete_L(LinkList &L,int i,ElemType &e);Status Find_L(LinkList L,int e);LinkList La;//创建单链表Laint n;printf("请输入链表La中的元素个数:\n");scanf("%d",&n);Create_L(La,n);//初始化单链表printf("现在La中的元素为:\n");Print_L(La);printf("-------------------------------------\n\n");printf("现在准备插入元素,请输入插入位置及所插入元素的值\n");int i,e;scanf("%d %d",&i,&e);ListInsert_L(La,i,e);printf("插入后La中的元素为:\n");Print_L(La);printf("-------------------------------------\n\n");printf("现在准备删除元素,请输入删除位置\n");scanf("%d",&i);ListDelete_L(La,i,e);printf("删除后La中的元素为:\n");Print_L(La);printf("-------------------------------------\n\n");printf("请输入所要查找元素的值:\n");scanf("%d",&e);Find_L(La,e);printf("所要查找元素的位置为:%d\n",Find_L(La,e)); }void Create_L(LinkList &L,int n){int j=1;L=(LinkList)malloc(sizeof(Lnode));L->next =NULL;//先建立一个带头结点的单链线性表L for(int i=n;i>0;--i){LinkList p=(LinkList)malloc(sizeof(Lnode));printf("请输入链表La中的第%d个元素:\n",j++);scanf("%d",&p->data);p->next=L->next;L->next =p;}//(逆序实现)/*LinkList q=L;for(int i=1;i<=n;i++){LinkList p=(LinkList)malloc (sizeof(Lnode));q->next=p;p->next=NULL;q=q->next ;printf("请输入链表La中的第%d个元素:\n",i);scanf("%d",&p->data);}//(正序实现)*/}//初始化单链表//输出单链表void Print_L(LinkList L){LinkList p;p=L->next;while(p){printf("%d ",p->data );p=p->next;}printf("\n");}//在单链表L的第i个位置前插入元素eStatus ListInsert_L(LinkList &L,int i,ElemType e) {LinkList p=L;int j=0;while(p&&j<i-1){p=p->next; ++j;}if(!p||j>i-1) return ERROR;LinkList s=(LinkList)malloc(sizeof(LNode));s->data=e; s->next=p->next;p->next=s;return OK;} //ListInsert_L//删除单链表L中第i个位置上的元素Status ListDelete_L(LinkList &L,int i,ElemType &e) {LinkList p=L;int j=0;while( p->next && j<i-1){p=p->next; ++j;}if(!p->next||j>i-1) return ERROR;LinkList q=p->next; p->next=q->next;e=q->data;free(q);return OK;}//LinkDelete_L/*查找元素并返回位置*/Status Find_L(LinkList L,int e){LinkList p=L->next;int j=1;while(p->data!=e&&p->next){p=p->next;j++;}if(p->data==e) return j;else{printf("无当前元素\n");return ERROR;}if(!p){printf("无当前元素\n");return ERROR;}}//定位2 .构造两个带有表头结点的有序单链表La、Lb,编写程序实现将La、Lb合并成一个有序单链表Lc。

数据结构实验,线性表的插入和删除,单链表操作,Huffman编码树

数据结构实验,线性表的插入和删除,单链表操作,Huffman编码树
2.上机输入、调试实验程序;
{ int i,j,k,x1,x2,m1,m2;
for(i=1;i<(2*n);i++)
{ t[i].pa=t[i].lc=t[i].rc=0;
if(i<=n)
t[i].data=w[i];
else
t[i].data=0;
}
for(i=1;i<n;i++)
{ m1=m2=MAX;
x1=x2=0;
for(j=1;j<(n+i);j++)
ListCount=0;
int nOperateState;
while(TRUE)
{
printf( "选择你要操作的方法,1为插入,2为删除,3为查询!4为退出\r\n ");
scanf("%d",&nOperateState);
switch(nOperateState)
{
case 1:
InsertInfo();
{
printf("请不要重复插入相同学号的信息\r\n");
LocalFree(Info);
return;
}
ptemp=ptemp->pNext;
}
}
if (ListHead)
{
if (ListCount==1)
{
ListTail=Info;
ListTail->pNext=NULL;
ListHead->pNext=ListTail;
temp->stu_num,temp->stu_age,temp->stu_english_grade);

单链表的基本操作(查找,插入,删除)

单链表的基本操作(查找,插入,删除)

单链表的基本操作(查找,插⼊,删除)这周⽼师给的作业跟上周貌似差不多。

只是⽤了单链表。

完成单链表的基本操作函数。

1) 初始化单链表2) 给定的数据元素存放在⼀维数组中,分别完成头插法和尾插法建⽴单链表3) 将数据元素从键盘依次输⼊,分别完成头插法和尾插法建⽴单链表4) 输出单链表的长度5) 实现按位查找和按值查找6) 实现插⼊和删除操作7) 实现遍历单链表操作#include <cstdio>#include <cstring>#include <cstdlib>//查找1.内容2.序号//插⼊//删除typedef struct student{int num;char name[10];}STU;typedef struct Node{STU data;struct Node * next;}Node;void denglu(Node *L);//登录函数void chazhao(Node *L);//查找函数void Printf(Node *L);//输出函数void CreateFromHead(Node *L);//头插法void CreateFormTail(Node *L);//尾插法void panduan(Node *L);//判断头插还是尾插void Get(Node *L);//按序号结点查找void Locate(Node *L);//按内容查找(值)void Inslist(Node *L);//插⼊void Dellist(Node *L);//删除void Dellist(Node *L)//删除{system("CLS");int n;printf("请输⼊要删除的结点\n");scanf("%d",&n);if(n<=0){printf("输⼊的数据不合法,请重新输⼊\n");Dellist(L);}Node *pre,*r;int k=0;pre=L;while(pre->next !=NULL&&k<n-1){pre=pre->next;k=k+1;}if(pre->next==NULL){printf("没有找到该结点,请重新输⼊\n");Dellist(L);}r=pre->next;pre->next=r->next;free(r);printf("删除成功!\n");denglu(L);}void Inslist(Node *L)//插⼊{system("CLS");int n;printf("请输⼊在第⼏个位置插⼊数据\n");scanf("%d",&n);printf("请输⼊插⼊的学号,姓名\n");int num1;char name1[10];scanf("%d %s",&num1,name1);Node *pre,*s;int k=0;if(n<=0){printf("输⼊的数据不合法,请重新输⼊\n");Inslist(L);}pre=L;while(pre!=NULL&&k<n-1){pre=pre->next;k=k+1;}if(pre==NULL){printf("⽆法找到该节点,请重新输⼊\n");Inslist(L);}s=(Node*)malloc(sizeof(Node));strcpy(s->data .name ,name1);s->data.num=num1;s->next =pre->next ;pre->next =s;printf("插⼊成功!\n");denglu(L);}void Locate(Node *L)//按内容查找(值){system("CLS");int n;printf("请输⼊要查找的学号\n");scanf("%d",&n);Node *p;p=L->next;while(p!=NULL){if(p->data.num!=n){p=p->next;}elsebreak;}printf("你要查找的学号所对应的信息为%d %s\n",p->data.num,p->);denglu(L);}void Get(Node *L)//按序号结点查找{system("CLS");int n;printf("请输⼊你要查找的结点\n");scanf("%d",&n);if(n<=0){printf("输⼊的数据不合法,请重新输⼊\n");Get(L);}Node *p;p=L;int j=0;while((p->next!=NULL)&&(j<n)){p=p->next;j++;}if(n==j){printf("你要查找的结点的储存位置的数据为%d %s\n",p->data.num,p->); }denglu(L);}void Printf(Node *L){int q=0;Node *p=L->next;while(p!=NULL){q++;printf("%d %s\n",p->data.num,p->); p=p->next;}printf("单链表长度为%d\n",q);denglu(L);}void chazhao(Node *L){printf("1.按序号查找\n");printf("2.按内容查找\n");printf("3.返回主界⾯\n");int aa;scanf("%d",&aa);switch(aa){case 1:Get(L);case 2:Locate(L);case 3:denglu(L);break;default:printf("输⼊错误请重新输⼊\n");chazhao(L);}}void denglu(Node *L){int a;printf("请选择你要做什么\n");printf("1.查找\n");printf("2.插⼊\n");printf("3.删除\n");printf("4.打印现有的学⽣信息及单链表长度\n"); printf("5.退出\n");scanf("%d",&a);switch(a){case 1:chazhao(L);case 2:Inslist(L);case 3:Dellist(L);case 4:Printf(L);case 5:printf("谢谢使⽤\n");exit(0);default:printf("输⼊错误请重新输⼊\n");denglu(L);}}void CreateFromHead(Node *L)//头插法{Node *s;int n;//n为元素个数printf("请输⼊元素个数\n");scanf("%d",&n);printf("请输⼊学号姓名\n");for(int i=1;i<=n;i++){s=(Node *)malloc(sizeof(Node));scanf("%d %s",&s->data.num,s->); s->next=L->next;L->next=s;}}void CreateFormTail(Node *L)//尾插法{Node *s,*r;r=L;int n;//n为元素个数printf("请输⼊元素个数\n");scanf("%d",&n);printf("请输⼊学号姓名\n");for(int i=1;i<=n;i++){s=(Node *)malloc(sizeof(Node));scanf("%d %s",&s->data.num,s->);r->next=s;r=s;if(i==n){r->next=NULL;}}}Node *InitList(Node *L)//初始化单链表{L=(Node *)malloc(sizeof(Node));L->next=NULL;return L;}void panduan(Node *L){int q;printf("请选择⽤哪种⽅式建⽴链表\n");printf("1.头插法\n");printf("2.尾插法\n");scanf("%d",&q);switch(q){case (1):CreateFromHead(L);printf("输⼊成功!\n");break;case (2):CreateFormTail(L);printf("输⼊成功!\n");break;default:printf("输⼊错误请重新输⼊\n");panduan(L);}}int main(){Node *L=NULL;L=InitList(L);panduan(L);denglu(L);return 0;}ps.贴上来的代码空格有点⼩奇怪啊。

数据结构-单链表实验报告

数据结构-单链表实验报告

数据结构-单链表实验报告数据结构单链表实验报告一、实验目的本次实验的主要目的是深入理解和掌握单链表这一数据结构的基本概念、操作原理以及在实际编程中的应用。

通过编写和调试相关程序,提高对数据结构的理解和编程能力,培养解决实际问题的思维和方法。

二、实验环境本次实验使用的编程语言为C++,编程环境为Visual Studio 2019。

三、实验原理单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据域和指针域。

数据域用于存储节点的数据信息,指针域用于指向下一个节点。

通过这种方式,节点依次连接形成链表。

单链表的基本操作包括创建链表、插入节点、删除节点、查找节点、遍历链表等。

在实现这些操作时,需要特别注意指针的操作,避免出现空指针异常和内存泄漏等问题。

四、实验内容(一)创建单链表创建单链表的过程就是依次为每个节点分配内存空间,并将节点连接起来。

以下是创建单链表的代码实现:```cppinclude <iostream>using namespace std;//定义链表节点结构体struct ListNode {int data;ListNode next;ListNode(int x) : data(x), next(NULL) {}};//创建单链表ListNode createList(){ListNode head = NULL;ListNode tail = NULL;int num;cout <<"请输入链表节点的值(输入-1 结束):";cin >> num;while (num!=-1) {ListNode newNode = new ListNode(num);if (head == NULL) {head = newNode;tail = newNode;} else {tail>next = newNode;tail = newNode;}cin >> num;}return head;}```(二)插入节点插入节点可以分为在表头插入、在表尾插入和在指定位置插入三种情况。

课程设计单链表

课程设计单链表

课程设计单链表一、教学目标本节课的学习目标包括以下三个方面:1.知识目标:学生需要掌握单链表的基本概念、性质和操作方法,包括单链表的定义、节点结构、基本操作(创建、插入、删除、查找等)。

2.技能目标:学生能够熟练使用编程语言实现单链表的各种操作,培养学生的编程能力和问题解决能力。

3.情感态度价值观目标:通过学习单链表,培养学生对计算机科学和编程的兴趣,提高学生自主学习和探索的精神。

二、教学内容本节课的教学内容主要包括以下几个部分:1.单链表的基本概念和性质:介绍单链表的定义、节点结构以及单链表的特点。

2.单链表的基本操作:讲解创建、插入、删除、查找等单链表的基本操作,并通过示例代码进行演示。

3.单链表的应用:介绍单链表在实际编程中的应用场景,例如链表排序、链表查找等。

三、教学方法为了提高教学效果,本节课将采用以下几种教学方法:1.讲授法:教师通过讲解单链表的基本概念、性质和操作方法,引导学生掌握相关知识。

2.案例分析法:通过分析实际案例,让学生了解单链表在编程中的应用,提高学生的实践能力。

3.实验法:安排课堂实验环节,让学生动手编写代码实现单链表的各种操作,培养学生的动手能力和问题解决能力。

四、教学资源为了支持本节课的教学,我们将准备以下教学资源:1.教材:选择合适的计算机科学教材,为学生提供系统的学习资料。

2.参考书:提供相关的参考书籍,丰富学生的知识体系。

3.多媒体资料:制作PPT、动画等多媒体资料,直观展示单链表的操作过程。

4.实验设备:准备计算机、编程环境等实验设备,确保学生能够顺利进行实验操作。

五、教学评估为了全面、客观地评估学生的学习成果,本节课将采用以下几种评估方式:1.平时表现:通过观察学生在课堂上的参与程度、提问回答等情况,评估学生的学习态度和理解程度。

2.作业:布置与单链表相关的编程练习,评估学生对知识点的掌握情况和实际操作能力。

3.考试:安排一次期中考试,测试学生对单链表知识的全面理解和运用能力。

数据结构课程设计-单链表

数据结构课程设计-单链表

目录1 选题背景 (2)2 方案与论证 (3)2.1 链表的概念和作用 (3)2.3 算法的设计思想 (4)2.4 相关图例 (5)2.4.1 单链表的结点结构 (5)2.4.2 算法流程图 (5)3 实验结果 (6)3.1 链表的建立 (6)3.2 单链表的插入 (6)3.3 单链表的输出 (7)3.4 查找元素 (7)3.5 单链表的删除 (8)3.6 显示链表中的元素个数(计数) (9)4 结果分析 (10)4.1 单链表的结构 (10)4.2 单链表的操作特点 (10)4.2.1 顺链操作技术 (10)4.2.2 指针保留技术 (10)4.3 链表处理中的相关技术 (10)5 设计体会及今后的改进意见 (11)参考文献 (12)附录代码: (13)1 选题背景陈火旺院士把计算机60多年的发展成就概括为五个“一”:开辟一个新时代----信息时代,形成一个新产业----信息产业,产生一个新科学----计算机科学与技术,开创一种新的科研方法----计算方法,开辟一种新文化----计算机文化,这一概括深刻影响了计算机对社会发展所产生的广泛而深远的影响。

数据结构和算法是计算机求解问题过程的两大基石。

著名的计算机科学家P.Wegner指出,“在工业革命中其核心作用的是能量,而在计算机革命中其核心作用的是信息”。

计算机科学就是“一种关于信息结构转换的科学”。

信息结构(数据结构)是计算机科学研究的基本课题,数据结构又是算法研究的基础。

2 方案与论证2.1 链表的概念和作用链表是一种链式存储结构,链表属于线性表,采用链式存储结构,也是常用的动态存储方法。

链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。

以“结点的序列”表示线性表称作线性链表(单链表)单链表是链式存取的结构,为找第 i 个数据元素,必须先找到第 i-1 个数据元素。

数据结构c++顺序表、单链表的基本操作,查找、排序代码

数据结构c++顺序表、单链表的基本操作,查找、排序代码

} return 0; }
实验三 查找
实验名称: 实验3 查找 实验目的:掌握顺序表和有序表的查找方法及算法实现;掌握二叉排序 树和哈希表的构造和查找方法。通过上机操作,理解如何科学地组织信 息存储,并选择高效的查找算法。 实验内容:(2选1)内容1: 基本查找算法;内容2: 哈希表设计。 实验要求:1)在C++系统中编程实现;2)选择合适的数据结构实现查 找算法;3)写出算法设计的基本原理或画出流程图;4)算法实现代码 简洁明了;关键语句要有注释;5)给出调试和测试结果;6)完成实验 报告。 实验步骤: (1)算法设计 a.构造哈希函数的方法很多,常用的有(1)直接定址法(2)数字分析法;(3) 平方取中法;(4)折叠法;( 5)除留余数法;(6)随机数法;本实验采用的是除 留余数法:取关键字被某个不大于哈希表表长m的数p除后所得余数为哈 希地址 (2)算法实现 hash hashlist[n]; void listname(){ char *f; int s0,r,i; NameList[0].py="baojie"; NameList[1].py="chengቤተ መጻሕፍቲ ባይዱoyang"; ……………………………… NameList[29].py="wurenke"; for(i=0;i<q;i++){s0=0;f=NameList[i].py; for(r=0;*(f+r)!='\0';r++) s0+=*(f+r);NameList[i].k=s0; }} void creathash(){int i;
v[k-1]=v[k]; nn=nn-1; return ; } int main() {sq_LList<double>s1(100); cout<<"第一次输出顺序表对象s1:"<<endl; s1.prt_sq_LList(); s1.ins_sq_LList(0,1.5); s1.ins_sq_LList(1,2.5); s1.ins_sq_LList(4,3.5); cout<<"第二次输出顺序表对象s1:"<<endl; s1.prt_sq_LList(); s1.del_sq_LList(0); s1.del_sq_LList(2); cout<<"第三次输出顺序表对象s1:"<<endl; s1.prt_sq_LList(); return 0; } 运行及结果:

数据结构实验报告-实验一顺序表、单链表基本操作的实现

数据结构实验报告-实验一顺序表、单链表基本操作的实现

数据结构实验报告-实验⼀顺序表、单链表基本操作的实现实验⼀顺序表、单链表基本操作的实现l 实验⽬的1、顺序表(1)掌握线性表的基本运算。

(2)掌握顺序存储的概念,学会对顺序存储数据结构进⾏操作。

(3)加深对顺序存储数据结构的理解,逐步培养解决实际问题的编程能⼒。

l 实验内容1、顺序表1、编写线性表基本操作函数:(1)InitList(LIST *L,int ms)初始化线性表;(2)InsertList(LIST *L,int item,int rc)向线性表的指定位置插⼊元素;(3)DeleteList1(LIST *L,int item)删除指定元素值的线性表记录;(4)DeleteList2(LIST *L,int rc)删除指定位置的线性表记录;(5)FindList(LIST *L,int item)查找线性表的元素;(6)OutputList(LIST *L)输出线性表元素;2、调⽤上述函数实现下列操作:(1)初始化线性表;(2)调⽤插⼊函数建⽴⼀个线性表;(3)在线性表中寻找指定的元素;(4)在线性表中删除指定值的元素;(5)在线性表中删除指定位置的元素;(6)遍历并输出线性表;l 实验结果1、顺序表(1)流程图(2)程序运⾏主要结果截图(3)程序源代码#include<stdio.h>#include<stdlib.h>#include<malloc.h>struct LinearList/*定义线性表结构*/{int *list; /*存线性表元素*/int size; /*存线性表长度*/int Maxsize; /*存list数组元素的个数*/};typedef struct LinearList LIST;void InitList(LIST *L,int ms)/*初始化线性表*/{if((L->list=(int*)malloc(ms*sizeof(int)))==NULL){printf("内存申请错误");exit(1);}L->size=0;L->Maxsize=ms;}int InsertList(LIST *L,int item,int rc)/*item记录值;rc插⼊位置*/ {int i;if(L->size==L->Maxsize)/*线性表已满*/return -1;if(rc<0)rc=0;if(rc>L->size)rc=L->size;for(i=L->size-1;i>=rc;i--)/*将线性表元素后移*/L->list[i+=1]=L->list[i];L->list[rc]=item;L->size++;return0;}void OutputList(LIST *L)/*输出线性表元素*/{int i;printf("%d",L->list[i]);printf("\n");}int FindList(LIST *L,int item)/*查找线性元素,返回值>=0为元素的位置,返回-1为没找到*/ {int i;for(i=0;i<L->size;i++)if(item==L->list[i])return i;return -1;}int DeleteList1(LIST *L,int item)/*删除指定元素值得线性表记录,返回值为>=0为删除成功*/ {int i,n;for(i=0;i<L->size;i++)if(item==L->list[i])break;if(i<L->size){for(n=i;n<L->size-1;n++)L->list[n]=L->list[n+1];L->size--;return i;}return -1;}int DeleteList2(LIST *L,int rc)/*删除指定位置的线性表记录*/{int i,n;if(rc<0||rc>=L->size)return -1;for(n=rc;n<L->size-1;n++)L->list[n]=L->list[n+1];L->size--;return0;}int main(){LIST LL;int i,r;printf("list addr=%p\tsize=%d\tMaxsize=%d\n",LL.list,LL.size,LL.Maxsize);printf("list addr=%p\tsize=%d\tMaxsize=%d\n",LL.list,LL.list,LL.Maxsize);while(1){printf("请输⼊元素值,输⼊0结束插⼊操作:");fflush(stdin);/*清空标准输⼊缓冲区*/scanf("%d",&i);if(i==0)break;printf("请输⼊插⼊位置:");scanf("%d",&r);InsertList(&LL,i,r-1);printf("线性表为:");OutputList(&LL);}while(1){printf("请输⼊查找元素值,输⼊0结束查找操作:");fflush(stdin);/*清空标准输⼊缓冲区*/scanf("%d ",&i);if(i==0)break;r=FindList(&LL,i);if(r<0)printf("没有找到\n");elseprintf("有符合条件的元素,位置为:%d\n",r+1);}while(1){printf("请输⼊删除元素值,输⼊0结束查找操作:");fflush(stdin);/*清楚标准缓存区*/scanf("%d",&i);if(i==0)break;r=DeleteList1(&LL,i);if(i<0)printf("没有找到\n");else{printf("有符合条件的元素,位置为:%d\n线性表为:",r+1);OutputList(&LL);}while(1){printf("请输⼊删除元素位置,输⼊0结束查找操作:");fflush(stdin);/*清楚标准输⼊缓冲区*/scanf("%d",&r);if(r==0)break;i=DeleteList2(&LL,r-1);if(i<0)printf("位置越界\n");else{printf("线性表为:");OutputList(&LL);}}}链表基本操作l 实验⽬的2、链表(1)掌握链表的概念,学会对链表进⾏操作。

数据结构实验报告之链表顺序表的操作

数据结构实验报告之链表顺序表的操作

数据结构实验报告之链表顺序表的操作1、编写程序实现顺序表的各种基本运算:初始化、插⼊、删除、取表元素、求表长、输出表、销毁、判断是否为空表、查找元素。

在此基础上设计⼀个主程序完成如下功能:(1)初始化顺序表L;(2)依次在表尾插⼊a,b,c,d,e五个元素;(3)输出顺序表L;(4)输出顺序表L的长度;(5)判断顺序表L是否为空;(6)输出顺序表L的第4个元素;(7)输出元素c的位置;(8)在第3个位置上插⼊元素f,之后输出顺序表L;(9)删除L的第2个元素,之后输出顺序表L;(10)销毁顺序表L。

2、编写程序实现单链表的各种基本运算:初始化、插⼊、删除、取表元素、求表长、输出表、销毁、判断是否为空表、查找元素。

在此基础上设计⼀个主程序完成如下功能:(1)初始化单链表L;(2)依次在表尾插⼊a,b,c,d,e五个元素;(3)输出单链表L;(4)输出单链表L的长度;(5)判断单链表L是否为空;(6)输出单链表L的第4个元素;(7)输出元素c的位置;(8)在第3个位置上插⼊元素f,之后输出单链表L;(9)删除L的第2个元素,之后输出单链表L;(10)销毁单链表L。

1顺序表2 #include<stdio.h>3 #include<malloc.h>4 #include<stdlib.h>56#define TRUE 17#define FALSE 08#define OK 19#define ERROR 010#define INFEASIBLE -111#define OVERFLOW -212 typedef int Status;13 typedef char ElemType;1415#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量16#define LISTINCREMENT 10 //线性表存储空间的分配增量17 typedef struct {18 ElemType *elem; //存储空间基地址19int length; //当前长度20int listsize; //当前分配的存储容量21 } SqList;2223 Status InitList_Sq(SqList &L) { //算法2.324 L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));25if (!L.elem) exit(OVERFLOW); //存储分配失败26 L.length = 0; //空表长度为027 L.listsize = LIST_INIT_SIZE; //初始存储容量28return OK;29 }//InitList_Sq3031 Status ListInsert_Sq(SqList &L, int i, ElemType e) { //算法2.432 ElemType *newbase, *p, *q;33if (i<1 || i>L.length + 1) return ERROR; //i值不合法34if (L.length >= L.listsize)35 { //当前存储空间已满,增加分配36 newbase = (ElemType*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));37if (!newbase) exit(OVERFLOW); //存储分配失败38 L.elem = newbase; //新基址39 L.listsize += LISTINCREMENT; //增加存储容量40 }41 q = &(L.elem[i - 1]); //q为插⼊位置42for (p = &(L.elem[L.length - 1]); p >= q; --p) *(p + 1) = *p; //元素右移43 *q = e; //插⼊e44 ++L.length; //表长增145return OK;46 }4748void DispSqList(SqList L)49 {50int i;51for (i = 0; i < L.length; i++)52 printf("%c ", L.elem[i]);53 }5455 Status ListDelete(SqList &L, int i, ElemType &e)56 {57 ElemType *p,*q;58if ((i < 1) || (i > L.length)) return ERROR;59 p = &(L.elem[i - 1]);60 e = *p;61 q = L.elem + L.length - 1;62for (++p; p <= q; ++p)63 *(p - 1) = *p;64 --L.length;65return OK;66 } //ListDelete_Sq6768 Status GetElem(SqList L, int i, ElemType &e)69 {70if (L.length == 0 || i<1 || i>L.length)71return ERROR;72 e = L.elem[i - 1];73return OK;74 }7576int ListLength(SqList L)77 {78return(L.length);79 }8081 Status DestroyList(SqList &L)82 {83 free(L.elem);84 L.length = 0;85return OK;86 }8788 Status ListEmpty(SqList L)89 {90return(L.length == 0);91 }9293int LocateElem(SqList L, ElemType e)94 {95int i = 0;96while (i < L.length && L.elem[i] != e) i++;97if (i >= L.length) return0;98else return i + 1;99 }100101void main()102 {103 SqList h;104 ElemType e;105 InitList_Sq(h);106 ListInsert_Sq(h, h.length + 1, 'a');107 ListInsert_Sq(h, h.length + 1, 'b');108 ListInsert_Sq(h, h.length + 1, 'c');109 ListInsert_Sq(h, h.length + 1, 'd');110 ListInsert_Sq(h, h.length + 1, 'e');111 DispSqList(h);112 printf("%d\n\n",ListLength(h));113 ListEmpty(h);114if (ListEmpty(h))116 printf("Empty\n\n");117 }118else119 {120 printf("Not empty\n\n");121 }122 GetElem(h, 4, e);123 printf("%c\n", e);124 printf("%d\n",LocateElem(h, 'c'));125 ListInsert_Sq(h,3,' f');126 DispSqList(h);127 ListDelete(h, 2, e);128 DispSqList(h);129 DestroyList(h);130 }131132133134135136单链表137138139140 #include<stdio.h>141 #include<malloc.h>142 #include<stdlib.h>143144#define TRUE 1145#define FALSE 0146#define OK 1147#define ERROR 0148#define INFEASIBLE -1149#define OVERFLOW -2150 typedef int Status;151152 typedef char ElemType;153154155 typedef struct LNode {156 ElemType data;157int length;158struct LNode *next;159 }LNode, *LinkList;160161162 Status InitList_L(LinkList &L) {163 L = (LinkList)malloc(sizeof(LNode));164 L->next = NULL;165return OK;166 }167168 Status ListInsert_L(LinkList L, int i, ElemType e) { 169 LinkList p = L,s;170int j = 0;171while (p && j < i - 1)172 {173 p = p->next;174 ++j;175 }176if (!p || j > i - 1)177 {178return ERROR;179 }180else181 {182 s = (LinkList)malloc(sizeof(LNode));183 s->data = e;184 s->next = p->next;185 p->next = s;186return OK;187 }188 }189190void DispList_L(LinkList L)191 {192 LinkList p = L->next;193while (p != NULL)194 {195 printf("%c\n", p->data);196 p = p->next;197 }198200201void DestoryList(LinkList &L)202 {203 LinkList p = L, q = p->next;204while (q != NULL)205 {206 free(p);207 p = q;208 q = p->next;209 }210 free(p);211 }212213 Status ListLength_L(LinkList L) {214 LinkList p = L; int n = 0;215while (p->next != NULL)216 {217 n++;218 p = p->next;219 }220return (n);221 }222223 Status ListDelete(LinkList L, int i, ElemType &e){ 224int j;225 LinkList p, q;226 p = L;227 j = 1;228while (p->next && j < i)229 {230 p = p->next;231 ++j;232 }233if (!(p->next) || j > i)234 {235return ERROR;236 }237 q = p->next;238 p->next = q->next;239 e = q->data;240 free(q);241return OK;242 }243244 Status ListEmpty_L(LinkList L)245 {246return(L->length == 0);247 }248249 Status GetElem(LinkList L, int i, ElemType &e) 250 {251int j;252 LinkList p;253 p = L->next;254 j = 1;255while (p&&j<i)256 {257 p = p->next;258 ++j;259 }260if (!p || j > i)261 {262return ERROR;263 }264 e = p->data;265return OK;266 }267268 Status LocateElem(LinkList L, int e)269 {270 LinkList p = L;271int n=0;272//p->length = 0;273while (p != NULL)274 {275if(p->data != e)276 {277 p = p->next;278 n++;279 }280else281 {282break;283 }284 }285if(p != NULL)286 {287return n;288 }289else290 {291return ERROR;292 }293 }294295void main()296 {297 LinkList h;298 ElemType e;299 InitList_L(h);300 ListInsert_L(h, 1, 'a');301 ListInsert_L(h, 2, 'b');302 ListInsert_L(h, 3, 'c');303 ListInsert_L(h, 4, 'd');304 ListInsert_L(h, 5, 'e');305 DispList_L(h);306 printf("%d\n", ListLength_L(h)); 307if (ListEmpty_L(h))308 {309 printf("Empty\n\n");310 }311else312 {313 printf("Not empty\n\n");314 }315 GetElem(h, 4, e);316 printf("%c\n", e);317 printf("%d\n", LocateElem(h, 'c')); 318 ListInsert_L(h, 3, 'f');319 DispList_L(h);320 ListDelete(h, 2, e);321 DispList_L(h);322 DestoryList(h);323 }。

数据结构实验报告 单链表基本操作

数据结构实验报告 单链表基本操作

printf("查找不到该元素!\n");
printf("---------------------------------------------\n"); return 0; } 二: 1. 编写头文件及各个函数。这里函数有 CreateList_L() 创建函数,MergeList_L() 是排序函 2. 数。MergeList_L 函数不改变存储,只改变指针。PrintList_L() 用来打印结果。 写主函数。在主函数里输入元素个数,调用函数创建链表输入各个元素值。在调用函数
五、实验结果与讨论
一:
二:
-5-
六、总结
在查找元素的函数中如果按照下面的写法则会产生如下的结果:
于是必须改成 while(p&&(p->data!=e))
-6-
原因:先判断 p 是因为如果先判断 p->data 有可能此时 p 已指向空,p->data 没有值
七、思考与提高
1.如果上面实验内容 2 中合并的表内不允许有重复的数据该如何操作? 2.如何将一个带头结点的单链表 La 分解成两个同样结构的单链表 Lb,Lc, 使得 Lb 中只含 La 表中奇数结点,Lc 中含有 La 表的偶数结点?
-3-
排序,改变指针。输出。 3. 完整代码如下: #include<stdio.h> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define ERROR 0 #define OK 1 typedef int Status; typedef int ElemType; typedef struct LNode { ElemType data; struct LNode *next; }LNode,*Linklist; Status CreateList_L(Linklist &L,int n) { Linklist p,q; int i=0; L=(Linklist)malloc(sizeof(LNode)); L->next=NULL; p=L; printf("请输入%d 个元素:\n",n); for(i=0;i<n;i++) { q=(Linklist)malloc(sizeof(LNode)); scanf("%d",&q->data); q->next=p->next; } return OK; } void MergeList_L(Linklist &La, Linklist &Lb, Linklist &Lc) { Linklist pa, pb, pc; pa = La->next; pb = Lb->next; while (pa && pb) { if(pa->data <= pb->data) { pc->next = pa; else { pc->next = pb; Lc = pc = La; p->next=q; p=q;

单链表的定义及基本操作

单链表的定义及基本操作

单链表的定义及基本操作一、实验目的、意义(1)理解线性表中带头结点单链表的定义和逻辑图表示方法。

(2)熟练掌握单链表的插入,删除和查询算法的设计与实现。

(3)根据具体问题的需要,设计出合理的表示数据的链表结构,并设计相关算法。

二、实验内容及要求说明1:本次实验中的链表结构均为带头结点的单链表。

说明2: 学生在上机实验时,需要自己设计出所涉及到的函数,同时设计多组输入数据并编写主程序分别调用这些函数,调试程序并对相应的输出作出分析;修改输入数据,预期输出并验证输出的结果,加深对有关算法的理解。

具体要求:建立单链表,完成链表(带表头结点)的基本操作:建立链表、插入、删除、查找、输出;其它基本操作还有销毁链表、将链表置为空表、求链表的长度、获取某位置结点的内容、搜索结点。

三、实验所涉及的知识点数据结构、C语言语法函数、结构体类型指针、单链表(建表、初始化链表、求表长、插入、删除、查询算法)等。

四、实验结果及分析(所输入的数据及相应的运行结果,运行结果要有提示信息,运行结果采用截图方式给出。

)五、总结与体会(调试程序的心得与体会,若实验课上未完成调试,要认真找出错误并分析原因等。

)调试程序时,出现了许多错误。

如:结构体类型指针出错,忽略了释放存储空间,对头插法建表、尾插法建表不熟悉等。

另外还有一些语法上的错误。

由于对所学知识点概念模糊,试验课上未能完成此次上机作业。

后来经过查阅教材,浏览网页等方式,才完成试验。

这次试验出现错误最重要的原因就是对课本知识点理解不深刻以及编写代码时的粗心。

以后要都去练习、实践,以完善自己的不足。

六、程序清单(包含注释)//单链表#include<stdio.h>#include<malloc.h>#define OK 1#define ERROR 0typedef char ElemType;typedef int Status;//线性表的单链表的存储结构typedef struct LNode{ElemType data;struct LNode *next;}LNode,*LinkList;//LinkList为结构体类型的指针,可以直接定义变量,比如LinkList p;//建表(头插法)void CreatListF(LinkList &L,ElemType a[],int n){//初始化线性表L=(LinkList)malloc(sizeof(LNode));//分配内存空间L->next=NULL;//在表中插入元素LinkList S;int i;//头插法for(i=0;i<n;i++){S=(LinkList)malloc(sizeof(LNode));//生成新结点S->data=a[i];//数据域L->next=S;}}//建表(尾插法)void CreatListR(LinkList &L,ElemType a[],int n) {L=(LinkList)malloc(sizeof(LNode));L->next=NULL;LinkList p;p=L;LinkList S;int i;//尾插法for(i=0;i<n;i++){S=(LinkList)malloc(sizeof(LNode));S->data=a[i];p->next=S;p=S;}p->next=NULL;}//初始化线性表void InitList(LinkList &L){L=(LinkList)malloc(sizeof(LNode));L->next=NULL;}//获得链表元素Status GetElem(LinkList L,int i,ElemType &e)//L为带头结点的单链表的头指针LinkList p;int j;//初始化,p指向第一个结点p=L->next;//j为计数器j=1;//顺指针往后查找,直到p指向第i个元素或p为空while(p && j<i){p=p->next;j++;}//第i个元素不存在if(!p || j>i)return ERROR;//取第i个元素e=p->data;return OK;}//插入Status ListInsert(LinkList &L,int i,ElemType e) {int j=0;LinkList p;p=L;while(p!=NULL && j<i-1)//找第i-1个结点{p=p->next;j++;if(!p || j>i-1)return ERROR;LinkList S;S=(LinkList)malloc(sizeof(LNode));//生成新结点S->data=e;S->next=p->next;p->next=S;return OK;}//删除Status ListDelete(LinkList &L,int i,ElemType &e){LinkList p;LinkList q;int j=0;p=L;while((p->next)!=NULL && j<i-1)//找第i个结点{p=p->next;j++;}//!(p->next) :指向第i个结点的指针为空(第i个元素不存在)if(!(p->next) || j>i-1)return ERROR;q=p->next;p->next=q->next;e=q->data;free(q);return OK;}int ListLength(LinkList L){LinkList p;p=L;int j=0;//线性链表最后一个结点的指针为空while((p->next)!=NULL){j++;p=p->next;}return j;}//输出void visit(LinkList L){LinkList p;p=L->next;while(p!=NULL){printf("%c ",p->data);p=p->next;}}//销毁:要销毁的话从头结点开始依次free 但要先得到下一个节点再free void DestroyList(LinkList &L){LinkList p;LinkList q;p=L;while(p!=NULL){free(p);p=q;q=p->next;}// free(p);}//判空int ListEmpty(LinkList L){//为空表则执行该语句,否则返回return 0;return (L->next==NULL);}//查找int ListSearch(LinkList L,ElemType e){LinkList p;p=L->next;int i=1;while(p!=NULL && p->data!=e){p=p->next;i++;}if(p==NULL)return 0;return i;}int main()ElemType e;ElemType a[6]={'a','b','c','d','e','f'};LinkList L;//链表的头指针printf("头插法建表:");CreatListF(L,a,6);visit(L);printf("\n\n");//初始化InitList(L);printf("初始化后的表:");visit(L);printf("\n\n");printf("尾插法建表:");CreatListR(L,a,6);visit(L);printf("\n\n");//初始化后表为空,此时不要调用GetElem()GetElem(L,3,e);printf("表中第3个元素为:");printf("%c\n\n",e);//在第5个位置插入字符'k'ListInsert(L,5,'k');printf("在表中第5个位置插入字符'k'后:");visit(L);printf("\n\n");printf("表的长度为:%d\n\n",ListLength(L));int z;z=ListSearch(L,'d');printf("d是第%d个元素\n\n",z);ListDelete(L,2,e);printf("删除第2个元素:%c\n\n",e);//销毁// DestroyList(L);return 0;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《数据结构课程设计》报告题目:单链表操作专业:计算机科学与技术班级:单链表操作针对带头结点的单循环链表,编写实现以下操作的算法函数。

实现要求:⑴单链表建立函数create:先输入数据到一维数组A[M]中,然后根据一维数组A[M]建立一个单循环链表,使链表中个元素的次序与A[M]中各元素的次序相同,要求该函数的时间复杂度为O(m);⑵定位查找函数Locate:在所建立的单循环链表中查找并返回值为key的第1个元素的结点指针;若找不到,则返回NULL;⑶求出该链表中值最大和次大的元素值,要求该算法的时间复杂度为O(m),最大和次大的元素值通过指针变量带回,函数不需要返回值;⑷将链表中所有值比key(值key通过形参传入)小的结点作为值为key的结点前驱,所有值比key大的结点作为值为key的结点后继,并尽量保持原有结点之间的顺序,要求该算法的时间复杂度为O(m);⑸设计一个菜单,具有上述处理要求和退出系统功能。

⒈本人完成的工作:一、定义结构体:LNode二、编写以下函数:(1)建立单循环链表(2)建立定位查找函数(3)求出链表中最大和次大值(4)将链表中的值和输入的Key比较,小的作为key前驱结点,大的作为key 的后继结点三、设计具有上述处理要求和退出系统菜单⒉所采用的数据结构:单链表数据结构的定义:typedef struct Node //定义结点的结构体{DataType data; //数据域struct Node *next; //指针域}LNode; //结点的类型⒊所设计的函数(1)Create(void)LNode *Create(void) //建立单循环链表,链表头结点head作为返回值{int i,j,n,A[M]; //建立数组A【M】LNode *head,*p,*move;head=(LNode*)malloc(sizeof(LNode)); //创建空单循环链表head->next=head;move=head;printf("请输入数组元素的个数:"); //输入数组scanf("%d",&n);printf("请输入数组:");for(i=0;i<n;i++) //保存数组元素scanf("%d",&A[i]);//勾链建表,使链表中元素的次序与数组A各元素次序相同for(j=0;j<n;j++) //根据一维数组A[M]建立一个单循环链表{p=(LNode*)malloc(sizeof(LNode));p->data=A[j];p->next=move->next;move->next=p;move=move->next;}return head; //返回头指针}(2)Locate(LNode *head,DataType key)LNode *Locate(LNode *head,DataType key) //建立定位查找函数Locate {LNode *q=head->next;//查找并返回值为key的第1个元素的结点指针;若找不到,则返回NULL while(q!=head && q->data!=key)q=q->next;if(q->data==key)return q;else{printf("查找的结点不存在!!\n");return NULL;}}(3)Search(LNode *head,DataType *a,DataType *b)//求链表的最大值和次大值,分别由*a和*b带回void Search(LNode *head,DataType *a,DataType *b){LNode *p,*Max,*Secmax;p=head->next->next;//*Max和*Secmax指第一个结点,*p指向第二个结点,Max=head->next;Secmax=head->next->next;;while(p!=head){if(Max->data > p->data) //*Max指向最大值{if(p->data > Secmax->data)Secmax=p;}else //*Sexmax指向次大值{Secmax=Max;Max=p;}p=p->next;}*a=Max->data; //把最大和次大值分别赋值给*a和*b *b=Secmax->data;}(4)Sort(LNode *head)//查找key,把链表中比key小的作为前驱结点,比key大的作为后继结点LNode *Sort(LNode *head){ //*front指向key前部分链表,*rear指向key后部分链表LNode *k,*p,*front,*rear,*L; DataType key;front=head;p=head->next;printf("请输入key:");scanf("%d",&key);L=Locate(head,key); //调用Locate()查找keyk=L;rear=k;while(p!=head){if(front->next!=k) //判断key前面链表是否已经比较完毕{if(p->data > k->data)//将key结点前驱比key大的插到key后面{front->next=front->next->next; //断开结点p->next=rear->next; //插入结点rear->next=p;rear=rear->next;p=front->next; //*p指回key的前驱结点}else{p=p->next; //移动指针front=front->next;}}else{p=rear->next;if(p->data < k->data)//将key结点后继比key小的插到key前面{rear->next=rear->next->next; //断开结点p->next=front->next; //插入结点front->next=p;front=front->next;p=rear->next; //*p指回key的后继结点}else{p=p->next; //移动指针rear=rear->next;}}}return head; //返回头指针}(5)主函数:void main() //主函数{LNode *L,*W,*H;DataType a,b;int key,choice; //choice记载操作,key为输入值printf("\n");H=Create(); //调用Create()建立单循环链表//界面美化printf("\n");printf("***************************************************************\n");printf("* *\n");printf("* 定位查找-------------------------------------------------1 *\n");printf("* 输出最大和次大值-----------------------------------------2 *\n");printf("* 输出比较值key后的结果------------------------------------3 *\n");printf("* 重新输入一个数组-----------------------------------------4 *\n");printf("* 退出系统-------------------------------------------------0 *\n");printf("* *\n");printf("***************************************************************\n");printf("\n");//功能选择printf("请选择系统功能:");scanf(" %d", &choice);printf("\n");while(choice != 0){switch (choice){case 1: //查找数值key并返回指针{printf("请输入要查找的值:");scanf("%d",&key);L=Locate(H,key);if(L!=NULL)printf("查找成功!!\n");}break;case 2: //求链表的最大和次大值{Search(H,&a,&b);printf("最大值:%d\n",a);printf("次大值:%d\n",b);}break;case 3: //将key插入链表中{H=Sort(H);W=H->next;printf("结果是:"); //输出结果while(W!=H){printf(" %d",W->data); //依次输出W=W->next;}printf("\n");}break;case 4:main();default:printf("请输入正确的选项!!\n"); //错误处理}//功能重复printf("********************************************************* ******\n");printf("* *\n");printf("* 定位查找-------------------------------------------------1 *\n");printf("* 输出最大和次大值-----------------------------------------2 *\n");printf("* 输出比较值key后的结果------------------------------------3 *\n");printf("* 重新输入一个数组-----------------------------------------4 *\n");printf("* 退出系统-------------------------------------------------0 *\n");printf("* *\n");printf("********************************************************* ******\n");printf("请选择系统功能:");scanf(" %d", &choice);}}⒋运行结果:⒌问题与总结(1)在编写Create()函数时,要根据一维数组A【M】建立单循环链表,一开始只是用for语句结合头结点创建单链表方法。

相关文档
最新文档