数据结构.单链表的创建

数据结构.单链表的创建
数据结构.单链表的创建

[数据结构实验题目三] 单链表的创建

14 辽宁大学宋文龙

一、实验内容:

1、建立并输出两个递增单链表La和Lb。

A、首先要定义单链表的数据结构

B、编写一个函数使用“头插法”或“尾插法”创建一个单链表,例如:

LinkList CreateList(LinkList L,int n){

………

}

C、编写主函数(main) ,调用函数CreateList(La,n), CreateList(Lb,n)

分别录入单链表La和Lb,注意手动录入时要保证La和Lb是递增的(如果是头插法,那么录入时要按从大到小录入,如:5 4 3 2 1)

D、编写一个函数能够显示一个单链表中各结点的值,设La和Lb如下:

La:1 3 7 8 15 20

Lb:2 4 8 15 17 24 90

二,实验完整代码:

#include

#include //malloch函数头文件

#include //getch函数头文件

typedef struct LNode{

int data;

struct LNode *next;

}LNode,*LinkList;

LinkList creatlist(LinkList L,int n){

LinkList p,q;

int i;

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

L->next=NULL;

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

printf("第1个节点值:");

scanf("%d",&(p->data));

p->next=L->next;

L->next=p;

q=p;//插入第一个结点,for语句插入剩余结点

for(i=n-1;i>0;i--){

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

printf("第%d个节点值:",n+1-i);

scanf("%d",&(p->data));

p->next=q->next;

q->next=p;

q=p;

}

//使用尾插法,创建一个含有n个结点的带头结点的单链表

//也可以使用头插法来创建L

return L;

//因为链表是动态分配内存,所以创建后头指针需返回,在调用时接收}

void show(LinkList L){

//能够输出带头结点的单链表L中的各个结点的值

LinkList p;

for(p=L->next;p!=NULL;p=p->next){

printf("%d\t",p->data);

}

}

main() {

LinkList La,Lb;//定义两个结点指针

La=creatlist(La,6); //创建带头结点单链表La含6个结点

printf("输出单链表La:\n");

show(La);

printf("\n");

Lb=creatlist(Lb,7);

printf("输出单链表Lb:\n");

show(Lb);

getch();

}//如果环境是Win-Tc,getch()起到暂停作用以看程序输出结果}三,实验结果

数据库表结构设计参考

数据库表结构设计参考

表名外部单位表(DeptOut) 列名数据类型(精度范围)空/非空约束条件 外部单位ID 变长字符串(50) N 主键 类型变长字符串(50) N 单位名称变长字符串(255) N 单位简称变长字符串(50) 单位全称变长字符串(255) 交换类型变长字符串(50) N 交换、市机、直送、邮局单位邮编变长字符串(6) 单位标识(英文) 变长字符串(50) 排序号整型(4) 交换号变长字符串(50) 单位领导变长字符串(50) 单位电话变长字符串(50) 所属城市变长字符串(50) 单位地址变长字符串(255) 备注变长字符串(255) 补充说明该表记录数约3000条左右,一般不做修改。初始化记录。 表名外部单位子表(DeptOutSub) 列名数据类型(精度范围)空/非空约束条件 外部子单位ID 变长字符串(50) N 父ID 变长字符串(50) N 外键 单位名称变长字符串(255) N 单位编码变长字符串(50) 补充说明该表记录数一般很少 表名内部单位表(DeptIn) 列名数据类型(精度范围)空/非空约束条件 内部单位ID 变长字符串(50) N 主键 类型变长字符串(50) N 单位名称变长字符串(255) N 单位简称变长字符串(50) 单位全称变长字符串(255) 工作职责 排序号整型(4) 单位领导变长字符串(50) 单位电话(分机)变长字符串(50) 备注变长字符串(255)

补充说明该表记录数较小(100条以内),一般不做修改。维护一次后很少修改 表名内部单位子表(DeptInSub) 列名数据类型(精度范围)空/非空约束条件内部子单位ID 变长字符串(50) N 父ID 变长字符串(50) N 外键 单位名称变长字符串(255) N 单位编码变长字符串(50) 单位类型变长字符串(50) 领导、部门 排序号Int 补充说明该表记录数一般很少 表名省、直辖市表(Province) 列名数据类型(精度范围)空/非空约束条件ID 变长字符串(50) N 名称变长字符串(50) N 外键 投递号变长字符串(255) N 补充说明该表记录数固定 表名急件电话语音记录表(TelCall) 列名数据类型(精度范围)空/非空约束条件ID 变长字符串(50) N 发送部门变长字符串(50) N 接收部门变长字符串(50) N 拨打电话号码变长字符串(50) 拨打内容变长字符串(50) 呼叫次数Int 呼叫时间Datetime 补充说明该表对应功能不完善,最后考虑此表 表名摄像头图像记录表(ScreenShot) 列名数据类型(精度范围)空/非空约束条件ID 变长字符串(50) N 拍照时间Datetime N 取件人所属部门变长字符串(50) N 取件人用户名变长字符串(50) 取件人卡号变长字符串(50) 图片文件BLOB/Image

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

实验一单链表 #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};

数据结构--单链表的插入和删除

单链表的插入和删除实验日志 指导教师刘锐实验时间2010 年10 月11 日 学院数理专业数学与应用数学 班级学号姓名实验室S331-A 实验题目:单链表的插入和删除 实验目的:了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。 实验要求:建立一个数据域定义为字符串的单链表,在链表中不允许有重复的字符串;根据输入的字符串,先找到相应的结点,后删除之。 实验主要步骤: 1、分析、理解程序(相关程序见附录) 。 2、调试程序,并设计输入字符串数据(如:aa, bb , cc , dd, ee,#),测试程序的如下功能: 不允许重复字符串的插入;根据输入的字符串,找到相应的结点并删除。 3、修改程序: (1)增加插入结点的功能。 (2)将建立链表的方法改为头插入法。 实验结果: 1、不允许重复字符串的插入功能结果如下:

3、删除和插入结点的功能如下:

心得体会: 通过这次实验我学会了单链表的建立和删除,基本了解了线性表的逻辑结构和链式存储结构,掌握了单链表的基本算法,使我受益匪浅。在调试程序的过程中,遇见了一系列的问题,后来在同学的帮助下,修改了几个语句后,终于把它给调试出来了。有时候一个标点符号的问题就可能导致程序无法运行。所以在分析调试程序的时候一定要仔细。 附加程序代码: 1、调试之后的程序如下(其中蓝色字体部分为修改过的): #include"stdio.h" #include"string.h" #include"stdlib.h" #include"ctype.h" typedef struct node //定义结点 { char data[10]; //结点的数据域为字符串 struct node *next; //结点的指针域 }ListNode; typedef ListNode * LinkList; // 自定义LinkList单链表类型 LinkList CreatListR1(); //函数,用尾插入法建立带头结点的单链表ListNode *LocateNode(); //函数,按值查找结点

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.帐类表(KIND) 无索引 序号中文名称英文名称类型备注 1 帐类编号K_SERIAL byte 2 帐类名称K_NAME text*10 本表系统自动建立,共划分为15种帐类,不可增删 帐类编号帐类名称备注 0 上期结存进货,不参加进货统计 1 购入进货,购入时必需输入供货单位名称 2 自制进货 3 投资转入进货 4 盘盈进货 5 领料出库,领料必需输入领料部门名称 6 调拨出库 7 报损出库 8 盘亏出库 9 退库对低值易耗品,在用品退为在用库存 10 直接报废对于低值易耗品,在用品转报废 11 领用对于低值易耗品,在用库存转在用 12 调拨对于低值易耗品,在用库存减少 13 报废对于低值易耗品,在用库存报废 14 直进直出进出库,购入与领料对库存无影响 2.物品表(GOODS) 序号索引名称索引域唯一? 主索引? 1 G_CODING +G_CODING Y N 2 G_SERIAL +G_SERIAL Y Y 序号中文名称英文名称类型备注 1 物品内部编号G_SERIAL INT->long 系统内部唯一标识该物品 2 物品编号G_CODING TEXT * 10 用户使用此编号访问物品 &3 物品名称G_NAME TEXT*40 非空 &4 物品单位G_UNIT TEXT*8 非空 &5 物品规格G_STATE TEXT*20

6 物品类别G_CLASS INT 取自表CLASS 7 备注G_REMARKS MEMO 8 最小库存量G_MIN CURRENCY 为零,即无最小库存 9 最大库存量G_MAX CURRENCY 为零,即无最大库存 10 库存数量G_QUANT CURRENCY 控制出库数量 11 虚拟库存数量G_VQUANT CURRENCY 出库时用 12 库存金额G_AMOUNT CURRENCY 3.类别表(CLASS) 序号索引名称索引域唯一? 主索引? 1 C_CODING +C_CODING Y N 2 C_SERIAL +C_SERIAL Y Y 序号中文名称英文名称类型备注 1 类别内部序号C_SERIAL INT 系统内部唯一标识该物品 2 类别编号C_CODING TEXT *10 用户使用该编号访问类别信息 3 类别名称C_NAME TEXT*20 非空 4 出库类型C_KIND BYTE 1.移动平均 2..先进先出 3.后进先出 4.实际计价 *5.月末平均 5 备注C_REMARKS MEMO *6 底标志C_BOTTOM BOOLEAN *7 类别级别C_LEVEL BYTE 4.供货单位、使用部门(DEPART) 序号索引名称索引域唯一? 主索引? 1 D_CODING +D_CODING Y N 2 D_SERIAL +D_SERIAL Y Y 序号中文名称英文名称类型备注 1 内部序号D_SERIAL INT 系统内部唯一标识该部门 >0 供货单位 =0 库房 <0 使用部门 2 单位编号D_CODING TEXT*10

数据结构课程设计单链表

目录 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.了解组织、人员的构成 子系统的划分常常以现有组织系统为基础,再进行整合,而新系统首先必须达到的目的是尽可能地完成当前系统中有关信息方面的工作,在原有系统中,信息处理总是由具体人来实施的。我们要了解组织结构情况、相互之间信息沟通关系、数据(包括各种报告、报表、凭证、单据)往来联系情况。 具体弄清各个数据的名称,产生的时间与传递所需时间与周期,数据量的大小,所涉及(传送)的范围,使用数据的权限要求,数据处理过程中容易发生的问题及其影响,各个部门所希望获得的数据的情况等。 然后了解每个人对每一具体数据处理的过程,基本数据元素来源于哪些地方、获取的途径、处理的要求、数据的用途,进而弄清数据的构成、数据元素的类型、性质、算法、取值范围、相互关系。 在上述调查基础上,首先画出组织机构及工作职能图。我们以一个学校的基层单位——某大学一个系的管理为例来简要说明。 系的组织机构及工作职能如图7.1所示。

图7.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便是删除的结点的个数。

数据库表结构设计参考

数据库表结构设计参考. )表名外部单位表(DeptOut 约束条件非空空数据类型(精度范围) /列名外部单位ID N 变长字符串(50) 主键 N 变长字符串类型 (50)

N 单位名称(255) 变长字符串 (50) 单位简称变长字符变长字符(255)单位全交换类交换、市机、直送、邮变长字符(50)N (6)单位邮变长字符 变长字符(50))单位标英整排序(4) (50)交换变长字符变长字符(50)单位领 变长字符单位电(50) 变长字符所属城(50) 变长字符(255)单位地 备(255) 变长字符 补充说300条左右,一般不做修改。初始化记录该表记录数 表外部单位子表DeptOutSu 数据类型(精度范围列非约束条 变长字符(50)外部子单IDN 外ID变长字符(50)N单位名N变长字符(255) 变长字符单位编(50) 该表记录数一般很补充说 表内部单位表DeptI

数据类型(精度范围非列约束条IDN(50)变长字符主内部单类N变长字符(50) (255)变长字符N单位名 (50)变长字符单位简 变长字符单位全(255) 工作职 排序整(4) 单位领导(50) 变长字符串 (50) 单位电话(分机)变长字符串 (255) 变长字符串备注. 条以内),一般不做修改。维护一次后很少修改补充说明该表记录数较小(100 内部单位子表(DeptInSub)表名 约束条件数据类型(精度范围)空列名/非空 (50) N 变长字符串内部子单位ID 变长字符串(50) 父ID N 外键 (255) 单位名称 N 变长字符变长字符(50)单位编领导、部变长字符(50)单位类 Int 排序 该表记录数一般很补充说 省、直辖市表Provinc表

《数据结构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

数据结构单链表实验报告

数据结构单链表实验报告

一、设计人员相关信息 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域值;

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

单链表的实现 实现单链表的基本操作,必须包括初始化链表(元素为空)、销毁链表、求表长、查找、插入、删除、遍历(打印)等操作。请编写程序,实现上述单链表的基本操作。 注意: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"); }

找两条单链表的公共结点

题目:两个单向链表,找出它们的第一个公共结点。 链表的结点定义为: struct ListNode { int m_nKey; ListNode* m_pNext; }; 分析:这是一道微软的面试题。微软非常喜欢与链表相关的题目,因此在微软的面试题中,链表出现的概率相当高。 如果两个单向链表有公共的结点,也就是说两个链表从某一结点开始,它们的m_pNext 都指向同一个结点。但由于是单向链表的结点,每个结点只有一个m_pNext,因此从第一个公共结点开始,之后它们所有结点都是重合的,不可能再出现分叉。所以,两个有公共结点而部分重合的链表,拓扑形状看起来像一个Y,而不可能像X。 看到这个题目,第一反应就是蛮力法:在第一链表上顺序遍历每个结点。每遍历一个结点的时候,在第二个链表上顺序遍历每个结点。如果此时两个链表上的结点是一样的,说明此时两个链表重合,于是找到了它们的公共结点。如果第一个链表的长度为m,第二个链表的长度为n,显然,该方法的时间复杂度为O(mn)。 接下来我们试着去寻找一个线性时间复杂度的算法。我们先把问题简化:如何判断两个单向链表有没有公共结点?前面已经提到,如果两个链表有一个公共结点,那么该公共结点之后的所有结点都是重合的。那么,它们的最后一个结点必然是重合的。因此,我们判断两个链表是不是有重合的部分,只要分别遍历两个链表到最后一个结点。如果两个尾结点是一样的,说明它们用重合;否则两个链表没有公共的结点。 在上面的思路中,顺序遍历两个链表到尾结点的时候,我们不能保证在两个链表上同时到达尾结点。这是因为两个链表不一定长度一样。但如果假设一个链表比另一个长l个结点,我们先在长的链表上遍历l个结点,之后再同步遍历,这个时候我们就能保证同时到达最后一个结点了。由于两个链表从第一个公共结点考试到链表的尾结点,这一部分是重合的。因此,它们肯定也是同时到达第一公共结点的。于是在遍历中,第一个相同的结点就是第一个公共的结点。 在这个思路中,我们先要分别遍历两个链表得到它们的长度,并求出两个长度之差。在长的链表上先遍历若干次之后,再同步遍历两个链表,知道找到相同的结点,或者一直到链表结束。此时,如果第一个链表的长度为m,第二个链表的长度为n,该方法的时间复杂度为O(m+n)。 基于这个思路,我们不难写出如下的代码: 1.template 2.struct ListNode

相关文档
最新文档