当前位置:文档之家› 数据结构单链表基本操作的实现

数据结构单链表基本操作的实现

数据结构单链表基本操作的实现
数据结构单链表基本操作的实现

线性表归并的链式表示实现(C++/VC环境)#define OK 1

#define ERROR 0

#include "stdio.h"

#include "stdlib.h"

#include "malloc.h"

#include "iostream.h"

typedef int status;

typedef int ElemType;

typedef struct LNode{

ElemType data;

struct LNode *next;

}LNode,*LinkList;

status InitList(LinkList &L){

L=(LinkList)malloc(sizeof(LNode));

if(!L) exit(-2);

L->next=NULL;

return OK;

}//InitList

void CreateList(LinkList &L,int n){

int i;LNode *p,*q;

L=(LinkList)malloc(sizeof(LNode));

L->next=NULL;

q=L;

for(i=0;i

p=(LinkList)malloc(sizeof(LNode));

cin>>p->data;

q->next=p;

q=p;

}

q->next=NULL;

}//CreateList

status Mergesort(LinkList &A,LinkList &B,LinkList &C){

LNode *Pa,*Pb;

Pa=A->next;Pb=B->next;

while(Pa&&Pb){

if(Pa->datadata){A->next=Pa->next; //把Pa结点从链表A中删除Pa->next=C->next; C->next=Pa;//把*Pa逆位序加入链表C

Pa=A->next; //取链表A的下一个结点

}

else {B->next=Pb->next; //把Pb结点从链表B中删除

Pb->next=C->next; C->next=Pb;//把*Pb逆位序加入链表C

Pb=B->next; //取链表B的下一个结点

}

}

while(Pa){ A->next=Pa->next; //把Pa结点从链表A中删除

Pa->next=C->next; C->next=Pa;//把*Pa逆位序加入链表C

Pa=A->next; //取链表A的下一个结点

}

while(Pb){B->next=Pb->next; //把Pb结点从链表B中删除

Pb->next=C->next; C->next=Pb;//把*Pb逆位序加入链表C

Pb=B->next; //取链表B的下一个结点

}

free(A);

free(B);

return OK;

}

void main(void){

LinkList La,Lb,Lc;

LNode *p;

InitList(La);

InitList(Lb);

InitList(Lc);

cout<<"Input List A:\n";

CreateList(La,5);

cout<<"Input List B:\n";

CreateList(Lb,3);

Mergesort(La,Lb,Lc);

p=Lc->next;

while(p){

cout<data<<' ';

p=p->next;

}

getchar(); //等待,查看结束敲任意键。

}

数据结构 单链表基本操作代码

实验一单链表 #include "stdio.h" #include "stdlib.h" typedef int ElemType; typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; void creatLNode(LinkList &head) { int i,n; LNode *p; head=(LNode*)malloc(sizeof(LNode)); head->next=NULL; printf("请输入链表的元素个数:"); scanf("%d",&n); for(i=n;i>0;i--) { p=(LNode*)malloc(sizeof(LNode)); printf("第%d个元素:",i); scanf("%d",&p->data); p->next=head->next; head->next=p; } } void InsertLNode(LinkList &L) { LNode *p=L; int i,j=0,e; printf("请输入你要插入的位置(超过链表长度的默认插在最后!):"); scanf("%d",&i); printf("请输入你要插入的元素:"); scanf("%d",&e); while (p->next&&jnext; ++j; }

LNode *s; s=(LNode*)malloc(sizeof(LNode)); s->data=e; s->next=p->next; p->next=s; } int DeleteLNode(LinkList &L,int i,int &e) { LNode *p; p=L; LNode *q; int j=0; while (p->next&&jnext; ++j; } if(!(p->next)||j>i-1) { printf("删除位置不合理!\n"); return 0; } q=p->next; p->next=q->next; e=q->data; free(q); return e; } void DeleteCF(LinkList &L) { LNode *p,*s,*r; p=L->next; while(p!=NULL) { r=p; s=r->next; while(s!=NULL) { if(p->data==s->data) { r->next=s->next; s=s->next;

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

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

实现要求: ⑴单链表建立函数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;idata=A[j]; p->next=move->next; move->next=p; move=move->next; } return head; //返回头指针

数据结构 单链表详解

数据结构的概念: 数据的逻辑结构+ 数据的存储结构+ 数据的操作; 数据的数值:=====》数据===》数值型数据整形浮点数ASCII 非数值型数据图片声音视频字符 =====》数据元素=====》基本项组成(字段,域,属性)的记录。 数据的结构: 逻辑结构 ----》线性结构(线性表,栈,队列) ----》顺序结构 ----》链式结构 ----》非线性结构(树,二叉树,图) ----》顺序结构 ----》链式结构 存储结构 -----》顺序存储 -----》链式存储 -----》索引存储 -----》哈希存储==散列存储 数据的操作: 增 删 改 查 DS ====》数据结构===》DS = (D,R); 数据结构中算法: 1、定义:有穷规则的有序集合。 2、特性: 有穷性 确定性

输入 输出 3、算法效率的衡量 时间复杂度计算===》算法中可执行依据的频度之和,记为:T(n)。 是时间的一种估计值不是准确值。 计算结果的分析:1 将最终结果的多项式中常数项去掉 2 只保留所有多项式中最高阶的项 3 最后的最高阶项要去掉其常数项 时间复杂度的量级关系: 常量阶====》对数阶===》线性阶===》线性对数阶====》平方阶===》立方阶===》指数阶 以上关系可以根据曲线图来判断算法对时间复杂度的要求 空间复杂度计算====》算法执行过程中所占用的存储空间的量级,记为:D(n)。 计算方法是在运行过程中申请的动态内存的量级计算。 ///////////////////////////////////////////////////////////////////////////////////////////////// 线性表 顺序存储====》顺序表(数组) 链式存储====》单链表 特征:对于非空表,a0是表头没有前驱。 an-1 是表尾没有后继 ai的每个元素都有一个直接前驱和直接后继 基本操作:创建表=====》增加元素====》删除元素====》改变元素值====》查询元素 1、顺序表的操作 1.1 创建顺序表=====》定义个指定类型的数组====》int a[100] ={0};

c数据结构单链表的建立与基本应用

#include"stdio.h" #include"stdlib.h" typedef struct node { int data; struct node *next; }Lnode,*Linklist; input(Lnode *p,int n)//实现用键盘顺序输入链表数据{ Lnode *s;int i,d; printf("请输入数据:"); for(i=1;i<=n;i++) { if(i==1) { scanf("%d",&d); p->data=d; continue; } if(n==1)break; scanf("%d",&d);

s=(Linklist)malloc(sizeof(Lnode)); s->data=d; p->next=s; s->next=NULL; p=s;//使当前指针指向链表尾部节点 } } output(Lnode *p,int n)//实现输出当前链表所有数据 { int i=1; printf("当前链表的值为:"); while(p->next!=NULL) { printf("%d ",p->data); p=p->next; i++; } if(i==n)//当是最后一个节点时,其next已经是空,所以最后一个节点数据无法用while循环写出,所以另用了一个计数器i printf("%d",p->data); }

insert(Lnode *p,int i,int e)//实现在第i个元素之后插入新元素{ int j=0;Lnode *s; while(p&&jnext;++j;}if(!p||j>i-1)return 0; s=(Linklist)malloc(sizeof(Lnode)); s->data=e;s->next=p->next;p->next=s; return 1; } delet(Lnode *p,int i)//实现删除链表中第i+1个元素 { int j=0;Lnode *q; while(p->next&&jnext;++j; } if(!(p->next)||j>i-1)return 0; q=p->next;p->next=q->next; free(q); return 1; } search(Lnode *p,int e,int n) {

数据结构课程设计单链表

目录 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 个数据元素。 因此,查找第 i 个数据元素的基本操作为:移动指针,比较 j 和 i 单链表 1、链接存储方法 链接方式存储的线性表简称为链表(Linked List)。 链表的具体存储表示为: ① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的) ② 链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息(称为指针(pointer)或链(link)) 注意: 链式存储是最常用的存储方式之一,它不仅可用来表示线性表,而且可用来表示各种非线性的数据结构。 2、链表的结点结构 ┌───┬───┐ │data │next │ └───┴───┘ data域--存放结点值的数据域 next域--存放结点的直接后继的地址(位置)的指针域(链域) 注意: ①链表通过每个结点的链域将线性表的n个结点按其逻辑顺序链接在一起的。 ②每个结点只有一个链域的链表称为单链表(Single Linked List)。

单链表的建立及其基本操作的实现(完整程序)

#include "stdio.h"/*单链表方式的实现*/ #include "malloc.h" typedef char ElemType ; typedef struct LNode/*定义链表结点类型*/ { ElemType data ; struct LNode *next; }LNode,*LinkList;/*注意与前面定义方式的异同*/ /*建立链表,输入元素,头插法建立带头结点的单链表(逆序),输入0结束*/ LinkList CreateList_L(LinkList head) { ElemType temp; LinkList p; printf("请输入结点值(输入0结束)"); fflush(stdin); scanf("%c",&temp); while(temp!='0') { if(('A'<=temp&&temp<='Z')||('a'<=temp&&temp<='z')) { p=(LinkList)malloc(sizeof(LNode));/*生成新的结点*/ p->data=temp; p->next=head->next; head->next=p;/*在链表头部插入结点,即头插法*/ } printf("请输入结点值(输入0结束):"); fflush(stdin); scanf("%c",&temp); } return head; } /*顺序输出链表的内容*/ void ListPint_L(LinkList head) { LinkList p; int i=0; p=head->next; while(p!=NULL) { i++; printf("单链表第%d个元素是:",i);

数据结构单链表输入输出(c++)

#include template class link { public: T date; link *next; link(const T info, link *nextvalue=NULL) { date=info; next=nextvalue; } link(link *nextvalue) { next=nextvalue; } }; templateclass inklist{ private: link *head,*tail; link *setpos(const int p); public: inklist(); ~inklist(); bool append(const T value); bool insert(const int p,const T value); bool remove(const int p); void print(); }; template inklist::inklist() { head=tail=new link(NULL); } template inklist::~inklist() { link *tmp; while(head!=NULL) { tmp=head; head=head->next; delete tmp; }

} template link *inklist::setpos(int i) { int count=0; if(i==-1) return head; link *p=new link(head->next); while( p!=NULL && countnext; count++; } return p; } template bool inklist::insert(const int i,const T value) { link *p,*q; if((p=setpos(i-1))==NULL){ cout<<"非法插入点"<(value,p->next); p->next=q; if(p==tail) tail=q; return true;} template bool inklist::remove(const int i) { link *p,*q; if((p=setpos(i-1))==NULL||p==tail) { cout<<"非法删除点"; return false; } q=p->next; if(q==tail) { tail=p; p->next=NULL; delete q; }

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

单链表实验报告 一、实验目的 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便是删除的结点的个数。

《数据结构Java版》线性表之单链表的建立及操作

《数据结构Java》线性表之单链表的建立及操作 package sjjg3; //单链表结点类,T指定结点的元素类型 public class Node { public T data;//数据域,存储数据元素 public Node next;//地址域,引用后继结点 public Node(T data,Node next) {//构造结点,data指定数据元素,next指定后继结点 this.data=data;//T对象引用赋值 this.next=next;//Node对象引用赋值 } public Node() { this(null, null); } public String toString() {//返回结点数据域的描述字符串 return this.data.toString(); } } package sjjg3; //单链表类,实现ADT List声明方法,T表示数据元素的数据类型 public class SinglyList extends Object{ public Node head;//头指针,指向单链表的头结点 //(1)构造方法 public SinglyList() {//构造空单链表 this.head=new Node();//创建头结点,data和next值均为null } public SinglyList(T[] values) {//构造单链表,由values数组提供元素this();//创建空单链表,只有头结点 Node rear=this.head;//rear指向单链表最后一个结点 for(int i=0;i(values[i],null);//尾插入,创建结点链入rear结点之后 rear=rear.next;//rear指向新的链尾结点 } } public boolean isEmpty() {//判断单链表是否空,O(1) return this.head.next==null; } //(2)存取 public T get(int i) {//返回第i个元素,0<=i<表长度。若i越界,则返回null。O(n) Node p=this.head.next; for(int j=0;p!=null && j

用Excel 2000做图表

用Excel 2000做图表 2007-04-23 16:34 Microsoft Excel 2000在企业办公、数据处理等方面具有强大的功能。但是,对于如何根据Excel工作表中的数据来创建图表及生成链接,许多人却知之甚少。下面我们以某工厂1990年至1995年的工业年生产总值为例,来说明柱形图表的生成与链接过程。 制作图表 Microsoft Excel 2000的图表模板很多,在生产和销售中,经常用柱形图来描述,这样,有利于看出并分析其变化趋势。制作图表的步骤如下: 1、选定年份和生产总值两行数值,单击[图表向导],如图1。在图表向导对话框中图表类型选择柱形图,子图表类型选择簇状柱形图,单击[下一步]。 图1 2、在图表源数据的数据区域中出现“=Sheet1!$A$3:$G$4”,“系列产生在”选择“行” ,在系列中的分类X轴标志中填入“=Sh eet1!$B$3:$G$3”,系列对话框中删除“年份”,单击[下一步],如图2。

图2 3、在图表选项中填入图表标题,X轴和Y轴的名称,单击[下一步]。 4、在图表位置的“作为其中的对象插入”中填入“Sheet1”,单击[完成]即可生成图表,如图3所示。 图3 为图表美容

图表生成以后,中间的图形太小,周围的文字又太大,看起来很不舒服,我们可以加以修饰,使其美观大方。具体做法如下: 1、单击鼠标右键,弹出对话框,选中[图表区格式],弹出图表区格式对话框,首先显示的是图案选项卡,选中[阴影(D)]。单击[填充效果]按钮,在填充效果对话框中您可以选择您喜欢的背景效果,我们在过渡选项卡中选择“单色”、“浅绿色”,将颜色调到合适的深度,如图4,再选择默认的底纹样式“横向”,单击[确定]。 图4 2、以同样的方式修饰绘图区和数据系列区。 3、现在,图表中的文字有些大,绘图区又小。单击图表的纵轴,在字号栏中选择小一点的字体,或双击纵轴对其进行多项修饰如字体、字号、加粗、刻度等。然后以同样的方法修饰横轴。 4、对图表标题和图例进行修饰,修改字体、字号以及填充效果等,基本和以上方法相同。 5、下面,我们对横轴和纵轴的标题说明加以修饰,如果图表中已经有标题说明,可以用以上的方法,如果没有的话,在绘图区单击鼠标右键,从快捷菜单选择[图表选项],在图表选项中填入图表标题和横坐标、纵坐标的标题,单击[确定]即可。 6、最后,我们调整各部分的大小位置,使之协调美观。这一步用鼠标即可办到,作好的图表如图5所示。是不是效果不错? 图5 图表与工作表的链接

数据结构单链表实验报告

数据结构单链表实验报告

一、设计人员相关信息 1.设计者姓名、学号和班号:12地信李晓婧12012242983 2.设计日期:2014. 3.上机环境:VC++6.0 二、程序设计相关信息 1.实验题目:编写一个程序,实现单链表的各种基本运算(假设单链表的元素类型为 char),并在此基础上设计一个程序,完成如下功能: (1)初始化单链表; (2)采用尾插法依次插入元素a,b,c,d,e; (3)输出单链表 (4)输出单链表长度 (5)判断单链表是否为空 (6)输出单链表第3个元素 (7)输出元素a的位置 (8)在第4个元素位置上插入元素f (9)输出单链表 (10)删除第三个元素 (11)输出单链表 (12)释放单链表 2.实验项目组成: (1)插入和删除节点操作 (2)建立单链表 尾插法建表 (3)线性表基本运算在单链表中的实现 初始化线性表 销毁线性表 判断线性表是否为空表 求线性表的长度

3.实验项目的程序结构(程序中的函数调用关系图): Main LinkList InitList CreateListR DispList ListLength ListEmpty GetElem LocateElem ListInsert ListDelete DestroyList 4.实验项目包含的各个文件中的函数的功能描述: ●尾插法建表CreateListR:将新节点插到当前链表的表尾上,为此必须增加一个尾指针 r,使其始终指向当前链表的尾节点。 ●初始化线性表InitList:该运算建立一个空的单链表,即创建一个头节点; ●销毁线性表DestroyList:释放单链表占用的内存空间,即逐一释放全部节点的空间; ●判断线性表是否为空表ListEmpty:若单链表没有数据节点,则返回真,否则返回假; ●求线性表的长度ListLength:返回单链表中数据节点的个数; ●输出线性表DispList:逐一扫描单链表的每个数据节点,并显示各节点的data域值;

实验二 SQL Server 数据表的基本操作与查询

实验二SQL Server数据表的基本操作 一、实验目的 1.掌握创建数据库和表的操作。 2.熟悉SQL Server查询分析器环境。 3.掌握基本的SELECT查询及其相关子句的使用。 4.掌握复杂的SELECT查询,如多表查询、子查询、连接和联合查询。 二、实验内容 1.创建XSCJ数据库。 2.在XSCJ数据库中创建学生情况表XSQK,课程表KC,学生成绩表XS_KC。 3.在XSQK、KC、XS_KC表中输入数据。 4.启动SQL Server 2000 查询分析器环境。 5.涉及多表的简单查询。 6.涉及多表的复杂查询。 三、实验步骤 1.创建SQL SERVER数据库与数据表 1) 创建XSCJ数据库。 2) 打开创建的 XSCJ数据库,并在“SQL Server Enterprise Mananger” 窗口的右边窗口中选择“表”对象。 3) 选择“操作”菜单中的“新建表”命令,打开SQL Server的表编辑器 窗口。 4) 根据表2-1所示的表结构增加新列。 5) 点击快捷工具栏上的保存快捷按钮,在弹出的“选择名称”对话框中 输入表名XSQK,然后单击“确定”按钮,关闭表编辑器窗口,完成新 表的创建。 6) 打开“表”对象,在“SQL Server Enterprise Manager”窗口的右边 窗口中选择刚才创建的“XSQK”表。 7) 选择“操作”菜单中的“打开表”子菜单下的“返回所有行”命令, 打开表的数据记录窗口。

8) 输入的学生情况数据记录见表2-2。 表2-2 学生情况记录 9) 用同样方法创建课程表KC,表的结构见表2-3所示,表的内容见表2-4 所示。 表2-4 课程表记录 10)创建成绩表XS_KC,表的结构见表2-5所示,表的内容见表2-6所 示。

数据结构与算法单链表的实现

单链表的实现 实现单链表的基本操作,必须包括初始化链表(元素为空)、销毁链表、求表长、查找、插入、删除、遍历(打印)等操作。请编写程序,实现上述单链表的基本操作。 注意:1.元素类型可以自定义 2.可以是带头结点的单链表或不带头结点的单链表 #include #include #include typedef int datatype; typedef struct node { datatype data; struct node *next; }LNode,*LinkList; /* //创建不带头结点的单链表 Linklist Create_LinkList() { return NULL; } */ //创建带头结点的单链表 LinkList Create_LinkList() { LinkList L=NULL; L=(LinkList)malloc(sizeof(LNode)); if(L) L->next=NULL; return L; } //打印单链表

void Print_LinkList(LinkList H) { if(H == NULL) { printf("?????????\n"); } else { printf("head-->"); LinkList p=H->next; while(p!=NULL) { printf("%d",p->data); printf("-->"); p=p->next; } printf("\n"); } } //销毁单链表 void Destroy_LinkList(LinkList *H) { LinkList p, q; p = *H; while(p) { q = p; p = p->next; free(q); } *H = NULL; if(*H==NULL) printf("销毁成功,请退出\n"); else printf("销毁失败\n"); }

数据结构___头插法和尾插法建立链表(各分有无头结点)

实验一链表的建立及基本操作方法实现 一、【实验目的】 1、理解和掌握单链表的类型定义方法和结点生成方法。 2、掌握利用头插法和尾插法建立单链表和显示单链表元素的算法。 3、掌握单链表的查找(按序号)算法。 4、掌握单链表的插入、删除算法。 二、【实验内容】 1、利用头插法和尾插法建立一个无头结点单链表,并从屏幕显示单链表元素列表。 2、利用头插法和尾插法建立一个有头结点单链表,并从屏幕显示单链表元素列表。 3、将测试数据结果用截图的方式粘贴在程序代码后面。 重点和难点: 尾插法和头插法建立单链表的区别。 建立带头结点和无头结点单链表的区别。 带头结点和无头结点单链表元素显示方法的区别 三、【算法思想】 1) 利用头插法和尾插法建立一个无头结点单链表 链表无头结点,则在创建链表时,初始化链表指针L=NULL。 当用头插法插入元素时,首先要判断头指针是否为空,若为空,则直接将新结点赋给L,新结点next指向空,即L=p,p->next=NULL,若表中已经有元素了,则将新结点的next指向首结点,然后将新结点赋给L即(p->next=L,L=p)。 当用尾插法插入元素时,首先设置一个尾指针tailPointer以便随时指向最后一个结点,初始化tailPointer和头指针一样即tailPointer=L。插入元素时,首先判断链表是否为空,若为空,则直接将新结点赋给L即L=p,若不为空,else将最后一个元素的next指向新结点即tailPointer->next=p,然后跳出这个if,else语句,将新结点next指向空,并且将tailPointer指向新结点即p->next=NULL,tailPointer=p。 2) 利用头插法和尾插法建立一个有头结点单链表 链表有头结点,则在创建链表时,初始化链表指针L->next = NULL。与无头结点区别在于,判断链表为空是根据L->next是否为空。 用头插法插入元素时,要判断链表是否为空,若为空则将新结点next指向空,作为表尾,若不为空,则直接插入,将新结点next指向头结点next的指向,再将头结点next指向新结点即p->next=L->next,L->next=p。 用尾插法插入元素时,首先也要设置一个尾指针tailPointer以便随时指向最后一个结点,初始化tailPointer=L,与无头结点区别就只是插入第一个元素时有区别。插入元素时,不需要判断链表是否为空,直接进行插入,代码tailPointer->next=p,p->next=NULL,tailPointer=p。 3)带头结点和无头结点单链表元素显示方法的区别: 区别在于,显示时带头结点是从头结点next开始即p=L->next,而无头结点链表是直接从L开始即p=L。

数据结构课程设计单链表

目录 1 选题背景 (1) 2 方案与论证 (2) 2.1 链表的概念和作用 (2) 2.3 算法的设计思想 (3) 2.4 相关图例 (4) 2.4.1 单链表的结点结构 (4) 2.4.2 算法流程图 (4) 3 实验结果 (5) 3.1 链表的建立 (5) 3.2 单链表的插入 (5) 3.3 单链表的输出 (6) 3.4 查找元素 (6) 3.5 单链表的删除 (7) 3.6 显示链表中的元素个数(计数) (8) 4 结果分析 (9) 4.1 单链表的结构 (9) 4.2 单链表的操作特点 (9) 4.2.1 顺链操作技术 (9) 4.2.2 指针保留技术 (9) 4.3 链表处理中的相关技术 (9) 5 设计体会及今后的改进意见 (10) 参考文献 (11) 附录代码: (12)

1 选题背景 陈火旺院士把计算机60多年的发展成就概括为五个“一”:开辟一个新时代----信息时代,形成一个新产业----信息产业,产生一个新科学----计算机科学与技术,开创一种新的科研方法----计算方法,开辟一种新文化----计算机文化,这一概括深刻影响了计算机对社会发展所产生的广泛而深远的影响。 数据结构和算法是计算机求解问题过程的两大基石。著名的计算机科学家P.Wegner指出,“在工业革命中其核心作用的是能量,而在计算机革命中其核心作用的是信息”。计算机科学就是“一种关于信息结构转换的科学”。信息结构(数据结构)是计算机科学研究的基本课题,数据结构又是算法研究的基础。

2 方案与论证 2.1 链表的概念和作用 链表是一种链式存储结构,链表属于线性表,采用链式存储结构,也是常用的动态存储方法。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。 以“结点的序列”表示线性表称作线性链表(单链表) 单链表是链式存取的结构,为找第 i 个数据元素,必须先找到第 i-1 个数据元素。 因此,查找第 i 个数据元素的基本操作为:移动指针,比较 j 和 i 单链表 1、链接存储方法 链接方式存储的线性表简称为链表(Linked List)。 链表的具体存储表示为: ① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的) ② 链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息(称为指针(pointer)或链(link)) 注意: 链式存储是最常用的存储方式之一,它不仅可用来表示线性表,而且可用来表示各种非线性的数据结构。 2、链表的结点结构 ┌───┬───┐ │data │next │ └───┴───┘ data域--存放结点值的数据域 next域--存放结点的直接后继的地址(位置)的指针域(链域) 注意: ①链表通过每个结点的链域将线性表的n个结点按其逻辑顺序链接在一起的。 ②每个结点只有一个链域的链表称为单链表(Single Linked List)。

Excel表格的基本操作[精心整理]

Excel表格的基本操作 1、Excel表格的基本操作:Excel单元格的合并 2、Excel表格的基本操作:Excel字符格式设置 3、Excel表格的基本操作:给Excel中的数据添加单位 4、Excel表格的基本操作:Excel大写数字设置 5、Excel表格的基本操作:Excel中文日期格式 6、Excel表格的基本操作:Excel中行列隐藏操作 7、Excel表格的基本操作:Excel表格列宽行高设置 8、Excel表格的基本操作:Excel标题跨列居中 9、Excel表格的基本操作:Excel表格标题重复打印 10、Excel表格的基本操作:给Excel数据表添加页眉页脚 11、Excel表格的基本操作:Excel表格边框设置 12、Excel表格的基本操作:Excel单元格的合并 13、Excel表格的基本操作:Excel字符格式设置 14、Excel表格的基本操作:给Excel中的数据添加单位 15、Excel表格的基本操作:添加数据说明文字 16、Excel表格的基本操作教程:拆分窗口 17、Excel表格的基本操作教程:冻结行列标题 18、Excel表格的基本操作教程:添加多个视图 19、Excel表格的基本操作教程:打印指定页面 20、Excel表格的基本操作教程:设置打印区域

21、ExcelExcel表格的基本操作:“高级筛选” 22、Excel表格的基本操作:Excel 加密文件 23、Excel表格的基本操作:Excel分区域锁定 24、Excel表格的基本操作:共享Excel工作簿 25、Excel表格的基本操作:保护Excel 工作簿 26、Excel表格的基本操作:Excel工作表的移动 27、Excel表格的基本操作:Excel工作表的复制 28、Excel表格的基本操作:锁定和隐藏Excel公式 29、Excel表格的基本操作教程:加载“宏” 30、Excel表格的基本操作教程:保存“加载宏” 31、Excel表格的基本操作教程:按钮调用“宏” 32、Excel表格的基本操作教程:用窗体调用“宏” 33、Excel表格的基本操作教程:直接编辑“宏” 34、Excel表格的基本操作教程:运行“宏” 35、Excel表格的基本操作:在Excel中录制“宏” 36、Excel表格的基本操作:Excel中设置数据对齐方式 37、Excel表格的基本操作:Excel中特殊符号的输入 38、Excel表格的基本操作:Excel自定输入数据下拉列表 39、Excel表格的基本操作:Excel数据输入范围控制 40、Excel表格的基本操作:Excel正确输入身份证号码 41、Excel表格的基本操作:Excel自定义自动填充序列 42、Excel表格的基本操作:Excel内置序列批量填充

数据结构上机报告:编写一个程序,实现单链表的各种基本运算

《数据结构》上机报告 _2011_年_ 3 _月_ 9 _日姓名_____ 学号_ _ 同组成员 __ _无_ __ 1.实验题目及要求 编写一个程序,实现单链表的各种基本运算 2.需求分析 建立一个单链表,实现单链表的初始化,插入、删除节点等功能,以及确定某一元素在单链表中的位置。 (1)初始化单链表; (2)依次采用尾插入法插入a,b,c,d,e元素; (3)输出单链表L; (4)输出单链表L的长度; (5)判断单链表L是否为空; (6)输出单链表L的第三个元素; (7)输出元素a的位置; (8)在第4个元素位置上插入f元素; (9)输出单链表L; (10)删除L的第3个元素; (11)输出单链表L; (12)释放单链表。

3.概要设计 (1)为了实现上述程序功能,需要定义一个简化的线性表抽象数据类型:ADT LinearList { 数据对象:D={ a i|a i∈IntegerSet,i=0,1,2,…,n,n≥0} 结构关系:R={|a i,a i+1 ∈D} 基本操作: InitList_L(L) 操作前提:L是一个未初始化的线性表 操作结果:将L初始化为一个空的线性表 CreateList_L(L) 操作前提:L是一个已初始化的空表 操作结果:建立一个非空的线性表L ListInsert_L(L,pos,e) 操作前提:线性表L已存在 操作结果:将元素e插入到线性表L的pos位置 ListDelete_L(L,pos,e) 操作前提:线性表L已存在 操作结果:将线性表L中pos位置的元素删除, 删除的元素值通过e返回 LocateList_L(L,e) 操作前提:线性表L已存在 操作结果:在线性表L中查找元素e, 若存在,返回元素在表中的序号位置;

数据结构(第二版)习题答案第3章教程文件

数据结构(第二版)习题答案第3章

3.1 选择题 第3章线性表的链式存储 (1)两个有序线性表分别具有n个元素与m个元素且n≤m,现将其归并成一个有序表,其最少的比较次数是( A )。 A.n B.m C.n? 1D.m + n (2)非空的循环单链表 head 的尾结点(由 p 所指向)满足( C )。 A.p->next==NULL B.p==NULL C.p->next==head D.p==head (3)在带头结点的单链表中查找x应选择的程序体是( C )。 A.node *p=head->next; while (p && p->info!=x) p=p->next; if (p->info==x) return p else return NULL; B.node *p=head; while (p&& p->info!=x) p=p->next; return p; C.node *p=head->next; while (p&&p->info!=x) p=p->next; return p; D.node *p=head; while (p->info!=x) p=p->next ; return p; (4)线性表若采用链式存储结构时,要求内存中可用存储单元的地址( D )。 A.必须是连续的C.一定是不连续的B.部分地址必须是连续的D.连续不连续都可以 (5)在一个具有n个结点的有序单链表中插入一个新结点并保持单链表仍然有序的时间复杂度是( B )。 A.O(1) B.O(n) C.O(n2) D.O(n log 2n)(6)用不带头结点的单链表存储队列时,其队头指针指向队头结点,其队尾指针指向队尾结点,则在进行删除操作时( D )。 A.仅修改队头指针 C.队头、队尾指针都要修改B.仅修改队尾指针 D.队头,队尾指针都可能要修改 (7)若从键盘输入n个元素,则建立一个有序单向链表的时间复杂度为( B )。 A.O(n) B.O(n2) C.O(n3) D.O(n × log2n) (8)下面哪个术语与数据的存储结构无关(D)。 A.顺序表B.链表C.散列表D.队列 (9)在一个单链表中,若删除 p 所指结点的后续结点,则执行( A )。 A.p->next=p->next->next; B.p=p->next; p->next=p->next->next; C.p->next=p->next; D.p =p->next->next; (10)在一个单链表中,若 p 所指结点不是最后结点,在 p 之后插入 s 所指结点,则执行( B )。 A.s->next=p;p->next=s; B.s->next=p->next;p->next=s; C.s->next=p->next;p=s; D.p->next=s;s->next=p; 3.2 设计一个算法,求一个单链表中的结点个数。 【答】:单链表存储结构定义如下(相关文件:linklist.h) 仅供学习与交流,如有侵权请联系网站删除谢谢2

相关主题
文本预览
相关文档 最新文档