linklist
数据结构中linklist的理解
数据结构中linklist的理解LinkList(链表)的理解。
在数据结构中,链表(LinkList)是一种基本的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
链表是一种线性数据结构,它可以用来表示一系列元素的顺序。
与数组不同,链表中的元素在内存中不是连续存储的,而是通过指针相互连接起来的。
这种特性使得链表具有一些独特的优势和应用场景。
链表的基本结构。
链表由节点组成,每个节点包含两部分,数据和指针。
数据部分用来存储元素的值,指针部分用来指向下一个节点。
链表的第一个节点称为头节点,最后一个节点称为尾节点,尾节点的指针指向空值(NULL)。
链表的分类。
链表可以分为单向链表、双向链表和循环链表三种基本类型。
单向链表,每个节点只包含一个指针,指向下一个节点。
双向链表,每个节点包含两个指针,分别指向前一个节点和后一个节点。
循环链表,尾节点的指针指向头节点,形成一个闭环。
不同类型的链表适用于不同的场景,选择合适的链表类型可以提高数据操作的效率。
链表的优势。
链表相对于数组有一些明显的优势:插入和删除操作高效,由于链表中的元素不是连续存储的,插入和删除操作可以在常数时间内完成,而数组中的插入和删除操作需要移动大量元素,时间复杂度为O(n)。
动态扩展,链表的大小可以动态调整,不需要预先分配固定大小的内存空间。
链表的应用场景。
由于链表的优势,它在一些特定的应用场景中得到了广泛的应用:LRU缓存,链表可以用来实现LRU(Least Recently Used)缓存淘汰算法,当缓存空间不足时,链表可以高效地删除最久未使用的元素。
大整数运算,链表可以用来表示大整数,实现大整数的加减乘除运算。
图论算法,在图论算法中,链表常常用来表示图的邻接表,用于表示图中的顶点和边的关系。
链表的实现。
链表的实现可以使用指针或者引用来表示节点之间的关系。
在C语言中,可以使用指针来表示节点之间的连接关系;在Java等语言中,可以使用引用来表示节点之间的连接关系。
Python列表与链表的区别详解
Python列表与链表的区别详解⽬录python 列表和链表的区别列表的实现机制链表链表与列表的差异python 列表和链表的区别python 中的 list 并不是我们传统意义上的列表,传统列表——通常也叫作链表(linked list)是由⼀系列节点来实现的,其中每个节点都持有⼀个指向下⼀节点的引⽤。
class Node:def __init__(self, value, next=None):self.value = valueself.next = next接下来,我们就可以将所有的节点构造成⼀个列表了:>>> L = Node("a", Node("b", Node("c", Node("d"))))>>> L.next.next.value'c'这是⼀个所谓的单向链表,双向链表的各节点中还需要持有⼀个指向前⼀个节点的引⽤但 python 中的 list 则与此有所不同,它不是由若⼲个独⽴的节点相互引⽤⽽成的,⽽是⼀整块单⼀连续的内存区块,我们通常称之为“数组”(array),这直接导致了它与链表之间的⼀些重要区别。
例如如果我们要按既定的索引值对某⼀元素进⾏直接访问的话,显然使⽤数组会更有效率。
因为,在数组中,我们通常可以直接计算出⽬标元素在内存中的位置,并对其进⾏直接访问。
⽽对于链表来说,我们必须从头开始遍历整个链表。
但是具体到 insert 操作上,情况⼜会有所不同。
对于链表⽽⾔,只要知道了要在哪⾥执⾏ insert 操作,其操作成本是⾮常低的,⽆论该列表中有多少元素,其操作时间⼤致上是相同的。
⽽数组就不⼀样了,它每次执⾏ insert 操作都需要移动插⼊点右边的所有元素,甚⾄在必要的时候,我们可能还需要将这些列表元素整体搬到⼀个更⼤的数组中去。
也正因如此,append 操作通常会采取⼀种被称为动态数组或‘向量'的指定解决⽅案,其主要想法是将内存分配的过⼤⼀些,并且等到其溢出时,在线性时间内再次重新分配内存。
数据结构-单链表基本操作实现(含全部代码)
数据结构-单链表基本操作实现(含全部代码)今天是单链表的实现,主要实现函数如下: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),因为可以与后继结点交换数据域,然后删除后继结点。
实验四 链表
实验二链表的基本操作一、实验目的掌握链表的基本概念、结构的定义,通过设计程序掌握链表上的基本操作:建立、插入、删除、查找以及链表合并等,并理解线性表的两种存储结构:顺序表和链表的区别。
二、实验准备1. 复习C语言中指针的用法,特别是结构体的指针的用法。
2. 了解链表(含带头结点的链表、循环链表)的概念,链表的结构定义方法。
单链表是线性表的链式存储表示,是用一组任意的存储单元依次存储线性表的数据元素。
因此,为了表示每个数据元素a i与其直接后继元素a i+1之间的逻辑关系,对数据元素a i来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置),而这部分就是用指针来完成的。
3. 掌握线性表在链式存储结构上实现基本操作:建立、查找、插入、删除等算法。
在实现这些算法的时候,要注意判断输入数据的合法性,除此之外还要要注意以下内容:✧在实现查找的时候,首先要判断该顺序表是否为空,其次要判断查找后的结果(查到时输出查到的数据,未查到时给出相关提示)。
✧在实现插入的时候,由于是链式存储,它可以随机产生和回收存储空间,所以它不要判断线性表是否为满,但仍需判断要插入的位置是否合法,原因同实验一,其次要注意插入的时候语句的顺序不可颠倒,否则出错。
例如:ps所指向结点要插入在p所指向的结点之后,则:正确形式:s->next=p->next; p->next=s;错误形式:p->next=s;s->next=p->next(因为此时p->next已经指向s了)在实现删除的时候,首先要判断线性表是否为空,为空则不能删除;其次在删除后要回收空间。
例如:删除如上图所示s所指向的结点p->next=p->next->next;free(s);4. 链表部分相关操作代码:⑴单链表的结构定义:#include <stdio.h>typedef int elemtype;typedef struct lnode{ elemtype data;struct lnode *next;}*linklist;⑵建立单链表的算法int n; /*n作为整个程序的全局变量*/linklist *creat(void){ linklist *head, *p1, *p2;n=0;p1=p2=(linklist *)malloc(sizeof(linklist));scanf(“%d”,&p1->data);head=null;while(p1->data!=0){ n=n+1;if(n==1) head=p1;else p2->next=p1;p2=p1;p1=(linklist *)malloc(sizeof(linklist));scanf(“%d”,&p1->data);}p2->next=null;return(head);}⑶单链表的插入算法int insert(linklist *head, int i,elemtype e) { linklist *p, *s;int j;p=head; j=0;while(p && j<i-1){ p=p->next;++j;}if(!p||j>i-1){ printf(“无法插入”);return 0;}s=(linklist *)malloc(sizeof(lnode));s->data=e;s->next=p->next;p->next=s;return 1;}⑷单链表的删除算法int deltree(linklist *head,int i,elemtype e){ linklist *p, *q;int j;lp=head; j=0;while(p->next && j<i-1){ p=p->next;++j;}if(!(p->next)||j>i-1){ printf(“无法删除”);return 0;}q=p->next;p->next=q->next;e=q->data;free(q);return 1;}三、实验内容1. /*函数link()的功能是将带头结点的单链表l2链接到l1的后面,程序中存在几处错误,请改正并调试运行*/#include "linklist.h"void link(linklist l1,linklist l2){linklist p,q;p=l1;while (p->next)p=q->next;q=l2;p->next=q;free(l2);}void main(){ linklist l1,l2;l1=creat2(); /*生成带头结点的单链表l1*/print(l1); /*输出单链表l1*/l2=creat2(); /*生成带头结点的单链表l2*/print(l2); /*输出单链表l2*/link(l1,l2); /*将单链表l2链接到l1的后面*/print(l1); /*输出单链表l1*/}2./* 编写一个函数perm,将带头结点单链表中的所有值为奇数的结点集中到链表的左边,值为偶数的结点集中到链表的右边*/#include "linklist.h"linklist perm(linklist head){linklist pre,p;pre=head;p=head->next;while (p && p->data%2==1){ pre= p ;p= p->next ;}while (p){ if (p->data%2==1){ pre->next=p->next;p->next=head->next;head->next=p;p=pre->next;}else{ pre=p;p=p->next;}}}/*主函数,请勿改动,请将perm中的函数补充完整*/int main(){ linklist head;head=creat2(); /*尾插法建立单链表*/print(head); /*输出单链表head*/perm(head);print(head);delList(head);return 0;}3.设计程序:/*建立一个带头结点的单链表,然后将该链表进行倒置。
C语言学习-双链表(LinkList)数据结构类型
C语⾔学习-双链表(LinkList)数据结构类型双向链表是链表中的⼀种,双链表是操作系统中常⽤的数据结构,其特点就是,每个链表节点都具有两个指向同类型数据结构的指针变量成员。
双向链表的节点的数据结构类型模型代表:1struct p_list_node2 {3struct p_list_node *p_next; //指向后继节点4struct p_list_node *p_prev; //指向前置节点5 };给已有的结构体数据类型起⼀个容易理解识别的别名:1 typedef struct p_list_node p_list;###双向链表的初始化函数:1void rt_list_init(p_list *l)2 {3 l->p_next = l->p_prev = l;4 }双向链表的初始化,就是让链表节点的成员指针指向本节点⾃⼰。
###双向链表中,向指定节点后⾯插⼊节点⽅法:1void rt_list_insert_after(p_list *l,p_list *n)2 {3 l->p_next->p_prev = n; //先让指定节点的后继节点指向新插⼊的节点4 n->p_next = l->p_next; //再让新插⼊的节点指向它⾃⼰的后继节点56 l->p_next = n; //让指定节点指向新插⼊的节点7 n->p_prev = l; //让新插⼊的节点指向指定节点8 }思维⽅式:后插法,先让新节点和指定节点的后继节点建⽴指向关系,再让新插⼊节点和指定节点建⽴指向关系。
###双向链表中,向指定节点前⾯插⼊节点⽅法:1void rt_list_insert_before(p_list *l,p_list *n)2 {3 l->p_prev->p_next = n; //先让指定节点的前置节点指向新插⼊的节点4 n->p_prev = l->p_prev; //再让新插⼊的节点指向指定节点的前置节点56 l->p_prev = n; //让指定节点指向新插⼊的节点7 n->p_next = l; //在让新插⼊的节点指向指定节点8 }思维⽅式:前插法,先让新节点和指定节点的前置节点建⽴指向关系,再让新插⼊节点和指定节点建⽴指向关系。
c语言中linklist的作用
c语言中linklist的作用C语言中LinkList的作用什么是LinkListLinkList(链表)是C语言中用来存储和操作数据的一种数据结构。
它与数组相比,拥有更灵活的插入和删除操作。
链表由节点(Node)组成,每个节点包含一个数据项和一个指向下一个节点的指针。
链表的头节点是链表的起始点,尾节点则指向NULL。
LinkList的作用1.动态内存分配:链表的节点可以动态地分配和释放内存,因此链表可以根据实际需要进行动态的添加和删除操作,不受固定大小的限制。
2.插入和删除操作效率高:由于链表的特性,插入和删除操作只需要修改节点指针的指向,而不需要移动其他节点,因此链表在某些特定场景下可以比数组更高效。
3.实现高级数据结构:链表可以用来实现其他高级数据结构,比如栈(Stack)和队列(Queue),或者作为其他数据结构的底层实现。
4.提供灵活的数据结构设计:链表可以设计成单向链表、双向链表或循环链表,根据实际需求选择合适的链表结构。
LinkList的应用场景链表在许多编程问题中都有着广泛的应用,以下是一些常见的应用场景: - 线性表:链表可以实现线性表,可以用来存储和操作一组有序的数据。
- 多项式运算:链表可以用来存储和运算多项式,实现多项式的相加、相乘等操作。
- 图的表示:链表可以用来表示图的连接关系,比如邻接链表表示法。
- 高级数据结构:链表可以作为实现其他高级数据结构的基础,比如树(Tree)、图(Graph)等。
- 文件操作:链表可以用来实现文件的读取和写入操作,链表可以实现文件的增删改查等功能。
总结链表作为一种灵活和高效的数据结构,广泛应用于C语言的编程中。
通过链表,我们可以动态地分配内存,高效地进行插入和删除操作。
而且,链表还可以作为其他高级数据结构的基础实现,扩展了数据结构的功能和应用场景。
在C语言中,掌握链表的使用方法和原理,对于编写高效的程序和解决复杂的编程问题都有很大的帮助。
数据结构第二章作业及答案
8
解答(续):
(2) 插入操作基本步骤: 1) 若i不合法或表L已满,算法结束并返回 ERROR;否则转2) 2) 将第i个元素及之后的所有元素均后移一个位置 3) 将新元素写入空出的位置; 4) 表长+1
9
解答(续):
插入操作算法(算法2.4 ):
Status ListInsert_Sq(SqList &L, int i , ElemType e) { //在顺序线性表L中第i个位置之前插入新的元素e, // i的合法值为1≤i≤ListLength_Sq(L)+1 if (i<1||i>L.length+1)return ERROR; //i值不合法 if (L.length>=L.listsize) { //当前存储空间已满,重新分配空间 newbase=(ElemType*)realloc(L. elem, (L.listsize+LISTINCREMENT)*sizeof (ElemType)); if (!newbase)exit(OVERFLOW); //存储分配失败 L. elem=newbase; //新基址 L.listsize+=LISTINCREMENT; //增加存储容量 } q=&(L.elem[i-1]); //q为插入位置 for (p=&(L. elem[L.length-1]); p>=q ; --p) *(p+1) = *p; //插入位置及之后的元素右移 *q=e; //插入e ++L.length; //表长增1 return OK; }//ListInsert_Sq
15
4.若某线性表最常用的操作是存取任一指定序号的元素和在最 后进行插入和删除运算,则利用( )存储方式最节省时间。 A.顺序表 B.双向链表 C.带头结点的双向循环链表 1 D.循环链表
c语言中linklist类型
c语言中linklist类型LinkList类型是C语言中常用的数据结构之一,用于表示链表。
链表是一种动态数据结构,它可以根据需要动态地分配和释放内存空间,比较灵活。
在本文中,我们将深入探讨LinkList类型及其相关操作。
一、什么是链表链表是一种由节点组成的数据结构,每个节点包含数据和指向下一个节点的指针。
链表中的节点可以按照任意顺序存储,通过指针将它们连接起来。
与数组相比,链表的插入和删除操作更加高效,但是访问元素的效率较低。
链表分为单向链表和双向链表两种形式,本文主要介绍单向链表。
二、LinkList类型的定义在C语言中,我们通过结构体来定义链表节点的数据结构,具体定义如下:```ctypedef struct Node{int data;struct Node *next;}Node;typedef Node *LinkList;```其中,Node表示链表的节点类型,LinkList表示链表的类型。
三、LinkList类型的常用操作1. 初始化链表初始化链表主要是将链表的头指针置空,表示链表为空。
具体实现如下:```cvoid InitList(LinkList *L){*L = NULL;}```2. 判断链表是否为空判断链表是否为空可以通过判断链表的头指针是否为空来实现。
具体实现如下:```cint ListEmpty(LinkList L){return L == NULL;}```3. 求链表的长度求链表的长度即统计链表中节点的个数。
具体实现如下:```cint ListLength(LinkList L){int count = 0;Node *p = L;while(p != NULL){count++;p = p->next;}return count;}```4. 插入节点插入节点可以在链表的任意位置插入新的节点。
具体实现如下:```cint ListInsert(LinkList *L, int pos, int data){if(pos < 1 || pos > ListLength(*L) + 1){return 0;}Node *p = *L;Node *newNode = (Node*)malloc(sizeof(Node));newNode->data = data;newNode->next = NULL;if(pos == 1){newNode->next = *L;*L = newNode;}else{for(int i = 1; i < pos - 1; i++){p = p->next;}newNode->next = p->next;p->next = newNode;}return 1;}```5. 删除节点删除节点可以删除链表中指定位置的节点。
线性表 数据结构讲义
a1 a2 … ai-1 ai+1 … an
表的长度减1
演示
int ListDelete (SqList *&L,int i,ElemType &e)
{
int j;
if (i<1 || i>L->length) return 0; i--; /*将顺序表位序转化为elem下标*/
e=L->elem[i];
typedef struct {
存放元素
ElemType elem[MaxSize];
int length;
存放线性表的实 际长度
} SqList; /*顺序表类型*/
2 顺序表基本运算的实现
(1)初始化线性表 InitList(L) 只需将length成员设置为0即可。
void InitList (SqList *&L) //引用型指针 {
/*顺序表长度增1*/
return 1;
}
演示
元素移动的次数与两个因素有关: 表长L—>length(n); 插入位置i(有n+1个可能的插入位置)。
假设pi(=
)是在第i个位置上插入一个元素的
概率,则在长度为n的线性表中插入一个元素时所需
移动元素的平均次数为:
p n1
n1 1
n
(n i 1)
当n=0时,表示线性表是一个空表,即表中 不包含任何元素。
设序列中第i(i表示位序)个元素为ai(1≤i≤n), 则线性表的一般表示为:
(a1,a2,…,ai,ai+1,…,an)
例如,在线性表(1,4,3,2,8,10)中,1 为表头元素,10为表尾元素。
2 线性表的运算
链表的操作(3)
●循环链表判断空循环表的条件:Head == Head->next;NULL==head->next;//判断单链表是否为空仅设尾指针的单循环表(1)保存ha的位置(2)B表的第一个元素连到A表的最后一个元素之后(3)释放hb(4)B表的最后一个元素指向ha(5)返回新循环表尾指针LinkList ConnectList_L(LinkList A, LinkList B){LinkList p=A->next;A->next=B->next->next;free(B->next);B->next=p;Return B;}●双向链表1.定义typedef struct Lnode{int data;Struct Lnode *next;Struct Lnode *prior;}Lnode, *LinkList;2.插入结点(1)生成一个新结点s(2)把p->prior赋给s->prior(3) 使p->->next指向s(4)s->next指向p(5)p->prior 指向sStatus DulListInsert(DulLinklist L, int i, ElemType e){…//寻址If(!(s=(DulLinkList)malloc(sizeof(DulNode))))Return ERROR;s->data=e;s->prior=p->prior;p->prior->next=s;s->next=p;p->prior=s;return ok;}3.删除e=p->data;p->prior->next=p->next;p->next->prior=p->prior;free(p);作业双链表的创建并打印Input:1020 30 40 50Output10 20 30 40 50 50 40 30 20 10链表的初始化用法:#include <malloc.h>或#include<stdlib.h>功能:用于向内存申请空间,分配长度为num_bytes字节的内存块说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
LineList
SPPID
8/29/10
SPF 2009 Line List Authoring – Record汇总
按照相关属性汇总Segments
– – – Segment从Data Warehouse的PID域接收至SPF的LLA域 Record可以在SPF的LLA域进行手动创建或通过Segment汇总创建 合并PIDs及From/To属性
8/29/10
LLA的管理对象
LLA中几种可编辑对象的类型:
–
– –
Line lists
一组相互连接在一起的Line List Record的集合,可进行编辑及报告 Line List中的一行。可对line segment进行汇总操作而创建。 对Line List中的Record进行可浏览、可发布、可版本控制管理的文档对象。
© 2010 Intergraph Corporation. All Rights Reserved!
8/29/10
Line、Run
传统上,为了便于设计人员的方便,Line作为所有相连的管道元素的集合。通常由一些持续连 接在一起的管道元素及部件组成。举例,一个Line上的所有管道元素及组件都有相同的Fluid Code和Sequence Number。 一个Line可以有分支管道,可以包含多个管段、弯头、三通,可以有多个From、To及多个工程 属性(如通径、管道等级)
© 2010 Intergraph Corporation. All Rights Reserved!
8/29/10
配置汇总规则
汇总操作是将多个Line Segment合并成一个Line List Record,基于名为 LLASegmentRecordRollup的ENS规定的属性来合并
数据结构中链表及常见操作
链表1 定义链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。
由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O(1)。
使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。
但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。
在计算机科学中,链表作为一种基础的数据结构可以用来生成其它类型的数据结构。
链表通常由一连串节点组成,每个节点包含任意的实例数据(data fields)和一或两个用来指向明上一个或下一个节点的位置的链接("links")。
链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的访问往往要在不同的排列顺序中转换。
而链表是一种自我指示数据类型,因为它包含指向另一个相同类型的数据的指针(链接)。
链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。
链表有很多种不同的类型:单向链表,双向链表以及循环链表。
2 结构2.1 单向链表链表中最简单的一种是单向链表,它包含两个域,一个信息域和一个指针域。
这个链接指向列表中的下一个节点,而最后一个节点则指向一个空值。
一个单向链表的节点被分成两个部分。
第一个部分保存或者显示关于节点的信息,第二个部分存储下一个节点的地址。
单向链表只可向一个方向遍历。
链表最基本的结构是在每个节点保存数据和到下一个节点的地址,在最后一个节点保存一个特殊的结束标记,另外在一个固定的位置保存指向第一个节点的指针,有的时候也会同时储存指向最后一个节点的指针。
一般查找一个节点的时候需要从第一个节点开始每次访问下一个节点,一直访问到需要的位置。
LinkList(链式存储结构)
LinkList(链式存储结构)#include#define MAXSIZE 100typedef int ElemTypeusing namespace std;typedef struct LNode{ElemType data;struct LNode *next;}LinkList;bool InitLinkList(LinkList *L){L=(LinkList *)malloc(sizeof(LinkList));L->next=NULL;return true;}int Length_of_LinkList(LinkList *L){int i=0;LinkList *p=L;while(p->next!=NULL){p=p->next;i++;}return i;}bool EmptyLinkList(LinkList *L){if(L->next==NULL)return true;elsereturn false;}void OutputLinkList(LinkList *L){LinkList *p=L;cout<<"The linklist is "<<endl;while(p->next!=NULL){cout<data<<" ";p=p->next;}cout<<endl;}LinkList Create1LinkList(LinkList *L,ElemType a[MAXSIZE],int n){LinkList *s;L=(LinkList *)malloc(sizeof(LinkList));L->next=NULL;for(int i=0;i<n;i++){s=(LinkList *)malloc(sizeof(LinkList));s->data=a[i];s->next=L->next;L->next=s;}return L;}LinkList Create2LinkList(LinkList *L,ElemType a[MAXSIZE],int n){LinkList *s,*r;L=(LinkList *)malloc(sizeof(LinkList));r=L;for(int i=0;i<n;i++){s=(LinkList)malloc(sizeof(LinkList));s->data=a[i];r->next=s;r=s;}r->next=NULL;return L;}void GetElementFromLinkList(LinkList *L,int i){int j=0;LinkList *p=L;while(j<i&&p->next!=NULL){p=p->next;j++;}if(p->next==NULL)cout<<"Can't be found!"<<endl;elsecout<<"The element is "<data<<endl;}void LocateLinkList(LinkList *L,ElemType x){int i=0;LinkList *p=L;while(p->data!=x&&p->next!=NULL){p=p->next;i++;}if(p-next==NULL)cout<<"No this element!"<<endl;elsecout<<"The element is located on "i<<endl;}LinkList InsertLinkList(LinkList *L,ElemType x,int i) {LinkList *s,*p;p=L;int j=0;while(j<i-1&&p->next!=NULL){p=p->next;j++;}if(p->next==NULL)cout<<"Insert failed!"<<endl;else{s=(LinkList *)malloc(sizeof(LinkList)); s->data=x;s->next=p->next;p->next=s;}cout<<"Insert success!"<<endl; return L;}LinkList DeleteLinkList(LinkList *L,int i) {LinkList *p,*q;int j=0;p=L;while(j<i-1&&p->next!=NULL){p=p->next;j++;}if(p->next==NULL)cout<<"Delete failed!"<<endl;else{q=p->next;p-next=q->next;free(p);cout<<"Delete success!"<<endl; }return L;}LinkList DestoryLinkList(LinkList *L) {LinkList *p,*q;p=L; q=p->next;while(q!=NULL){free(p);p=q;q=p->next;</endl;</endl;</i-1&&p-></endl;</endl;</i-1&&p-></endl;</endl;</endl;</endl;</i&&p-></n;i++)</n;i++)</endl;}free(p);cout<<"Destory success!"<<endl;return L;}void Menu(){cout<<" Please choose "<<endl;cout<<"1. InitLinkList"<<endl;cout<<"2. Create1LinkList"<<endl;cout<<"3. Create2LinkList"<<endl;cout<<"4. Length_of_LinkList"<<endl; cout<<"5. EmptyLinkList"<<endl;cout<<"6. OutputLinkList"<<endl;cout<<"7. GetElementFromLinkList"<<endl; cout<<"8. LocateLinkList"<<endl;cout<<"9. InsertLinkList"<<endl;cout<<"10. DeleteLinkList"<<endl;cout<<"11. DestoryLinkList"<<endl;cout<<"others. exit"<<endl;}int main(){Menu()int i,n,x;ElemType a[MAXSIZE];cin>>i;switch(i){case 1: InitLinkList(L);break;case 2:cout<<"please input the number of the linklist "<<endl;cin>>n;cout<<"please input the element of the linklist "<<endl;for(int j=0;j<n;j++)cin>>a[j];Create1LinkList(L,a,n);break;case 3:cout<<"please input the number of the linklist "<<endl;cin>>n;cout<<"please input the element of the linklist "<<endl;for(int j=0;j<n;j++)cin>>a[j];Create2LinkList(L,a,n);break;case 4: cout<<"Length is "<<length_of_linklist(l)<<endl;break;case 5: if(EmptyLinkList(L))cout<<"The linklist is empty !"<<endl;elsecout<<"The linklist is not empty !"<<endl;;break;case 6: OutputLinkList(L);break;case 7:cout<<"please input the location "<<endl;cin>>i;GetElementFromLinkList(L,i);break;cout<<"please input the element you want to find "<<endl; cin>>x;LocateLinkList(L,x);break;case 9:cout<<"please input the element and its location "<<endl; cin>>x>>i;InsertLinkList(L,x,i);break;case 10: cout<<"please input the element's location "<<endl; cin>>i;DeleteLinkList(L,i);break;case 11: DestoryLinkList(L);break;default :exit(0);}return 0;}</endl;</endl;</endl;</endl;</endl;</endl;</length_of_linklist(l)<<endl;break;</n;j++)</endl;</endl;</n;j++)</endl;</endl;</endl; </endl; </endl; </endl; </endl; </endl; </endl; </endl; </endl; </endl; </endl; </endl; </endl;。
实验报告一
实验报告一班级:微软二班姓名:单玲使用尾插法建立带头结点的单链表(a->b->c->d->e),然后再b后插入f,删除c的后继结点d,显示单链表在各种操作之后的数据内容。
1、预编译命令#include <stdio.h>#include <malloc.h>2、定义结点结构体类型linklisttypedef struct node{ char data;struct node *next;}linklist;3、尾插法建立单链表creatlist()linklist *creatListR(){ linklist *h=(linklist*)malloc(sizeof(linklist));linklist *r=h;linklist *s;printf("请输入数据:");char ch=getchar();while (ch!='$'){ s=(linklist*)malloc(sizeof(linklist));s->data=ch;r->next=s;r=s;printf("请输入数据:");fflush(stdin);ch=getchar(); }r->next =NULL;return h; }4、查找关键字为ch的结点p=locate(head.ch)linklist *locate(linklist *h,char ch){ linklist *p=h->next ;while(p){ if(p->data !=ch)p=p->next ;elsebreak; }return p ; }5、将数据x插入结点*p之后insert(p , x)void insert(linklist *p,char x){ linklist *s=(linklist*)malloc(sizeof(linklist));s->data =x;s->next =p->next ;p->next =s; }6、查找单链表中第i结点q=get(head , i) linklist *get(linklist *head,int i){ linklist *q=head;int j=0;while(j<i&&q->next !=NULL){ q=q->next ;j++; }if(j==i)return q;elsereturn NULL; }7、删除结点*p的后继结点delete(q)void Delete(linklist *p){ linklist *q=p->next ;p->next =q->next ;free(q); }8、显示单链表show(h)void show(linklist *h){ linklist *p=h->next ;while(p){ printf("%c\t",p->data );p=p->next ; }printf("\n"); }9、使用main()函数进行函数调用void main(){ linklist *head=creatListR();printf("所创建的单链表为:");show(head);printf("请输入所要查找的结点:");fflush(stdin);char ch=getchar();linklist *p=locate(head,ch);if(p==NULL)printf("所查结点不存在!");else{ printf("请输入所要插入的数据x:");fflush(stdin);char x=getchar();insert(p,x);printf("经过插入后的单链表为:\n");show(head);Delete(p);printf("经过删除后的单链表为:\n");show(head); }printf("请输入要查找的第i个结点:");fflush(stdin);int i;scanf("%d",&i);linklist *q=get(head, i);if(q==NULL)printf("所查结点不存在!");elseprintf("查找到第%d结点值为:%c\n",i,q->data ); } 结果显示:。
1include
#include<stdio.h>#include<malloc.h>typedef struct Lnode{int data;struct Lnode *next;}Lnode,*LinkList;//定义单链表void Create_LinkList(LinkList &L) {L=(LinkList)malloc(sizeof(Lnode));L->next =NULL;int j=0;//记录单链表中元素个数printf("输入链表中的五个元素:");/* for(int i=1;i<=5;i++){LinkList p=(LinkList)malloc(sizeof(Lnode));p->next=L->next;L->next =p;scanf("%d",&p->data);j++;//记录单链表的长度}//(逆序实现)*/LinkList q=L;for(int i=1;i<=5;i++){LinkList p=(LinkList)malloc (sizeof(Lnode));q->next=p;p->next=NULL;q=q->next ;scanf("%d",&p->data);j++;//记录单链表的长度}//(正序实现)}//初始化单链表void Printf_LinkList(LinkList L){LinkList p;p=L->next;while(p){printf("%d ",p->data );p=p->next;}}//输出单链表void LinkList_Empty(LinkList L){if(L->next) printf("链表非空/n");else printf("链表为空表/n");}//判断单链表是不是空表void Clear_LinkList(LinkList L){L->next =NULL;}//将单链表置空void GetElem_LinkList(LinkList L,int i,int &e) {LinkList p=L->next;int j=1;//计数器while(p&&j<i){p=p->next;j++;}if(!p||j>i) printf("error/n");//第i个元素不存在 e=p->data;//取第i个元素}//取单链表中第i个元素void Delete_LinkList(LinkList &L,int i,int &e) {LinkList p=L;int j=0;//计数器while (p->next&&j<i-1){p=p->next;j++;}if(!p->next||j>i-1) printf("error1/n");LinkList q=p->next;p->next=q->next;e=q->data;//存储删除的元素free(q);//释放删除的空间}//删除单链表中第i个元素void Insert_LinkList(LinkList &L,int i,int e) {LinkList p=L;int j=0;while(p&&j<i-1){p=p->next;j++;}if(!p||j>i-1) printf("error2/n");LinkList s=(LinkList)malloc(sizeof(Lnode)); s->data=e;s->next =p->next ;p->next =s;}//在单链表的第i个元素前插入eint Length_LinkList(LinkList L){int j=0;//用来记录单链表中元素个数LinkList p=L;while (p->next){p=p->next;j++;}}//求单链表中元素个数void PriorElem(LinkList L,int cur_e,int &pre_e) {bool flag=0;LinkList p=L->next;if(!p) printf("链表为空表/n");else{for(p=L->next;p->next;p=p->next){if(p->next->data==cur_e){pre_e=p->data;flag=1;}}if(flag==0) printf("无前驱/n");}}//求前驱void NextElem(LinkList L,int cur_e,int &next_e) {bool flag=0;LinkList p=L->next;if(!p) printf("链表为空表1/n");else{for(p=L->next;p->next;p=p->next){if(p->data==cur_e){next_e=p->next-flag=1;}}if(flag==0) printf("无后继/n");}}//求后继int Locate_LinkList(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 0;}if(!p){printf("无当前元素/n");return 0;}}//定位main(){int a;//用a来存储单链表中的第三个元素int b;//用b来存储删除单链表中的第三个元素int c;//用来存储单链表长度int d;//用来存储前驱int f;//用来存储后继int g;//用来存储所找元素的位置LinkList La;//创建单链表LaCreate_LinkList(La);//初始化单链表LinkList_Empty(La);//判断表是不是空表GetElem_LinkList(La,3,a);//取单链表中第三个元素并用a存储Delete_LinkList(La,3,b);//删除单链表中第三个元素并用b存储Insert_LinkList(La,4,5);//在第4个元素前插入5c=Length_LinkList(La);//求单链表长度PriorElem(La,5,d);//求5的前驱NextElem(La,5,f);//求5的后继g=Locate_LinkList(La,5);//定位操作printf("g=%d",g);printf("f=%d",f);printf("d=%d",d);printf("a=%d/n",a);printf("b=%d/n",b);Printf_LinkList(La);//输出单链表return 0;}。
数据结构单链表PPT课件
算法的时间复杂度为: O(Listlength(L)) 第21页/共35页
顺序建立单链表
• 操作步骤
①建立一个带头结点的空单链表; ②输入数据元素ai,建立新结点,并把其插入 在尾结点p之后成为最后一个结点。
a1
p
p
③重复执行②步,直到完成单链表的建立。
a1 a2
单链表的应用
1.建立单链表
链表是一个动态结构,它不需要预分配空间,因此生成 链表的过程是一个结点“逐个插入” 的过程。
逆序建立单链表
新结点插入在头结点的 后面,作为重排链表后
的第一个结点
顺序建立单链表
新结点插入在尾结点的 后面,作为重排链表后
的最后一个结点
第19页/共35页
逆序建立单链表
• 操作步骤
p
ai-1
ai
s
e
第10页/共35页
单链表基本操作
4、删除(第i个元素)
有序对<ai-1, ai> 和 <ai, ai+1> 改变为 <ai-1, ai+1>
ai-1
ai
ai+1
在单链表中删除第 i 个结点时,要找到单链表中第(i-1)个结点, 修改其指向后继的指针。
第11页/共35页
q = p->next; p->next = q->next; e = q->data; free(q);
①建立一个带头结点的空单链表; ②输入数据元素ai,建立新结点p,并把p插入 在头结点之后成为第一个结点。
a1
③重复执行②步,直到完成单链表的建立。
a1 a2
第20页/共35页
C#数据结构之单链表(LinkList)实例详解
C#数据结构之单链表(LinkList)实例详解本⽂实例讲述了C#数据结构之单链表(LinkList)实现⽅法。
分享给⼤家供⼤家参考,具体如下:这⾥我们来看下“单链表(LinkList)”。
在上⼀篇《》的最后,我们指出了:顺序表要求开辟⼀组连续的内存空间,⽽且插⼊/删除元素时,为了保证元素的顺序性,必须对后⾯的元素进⾏移动。
如果你的应⽤中需要频繁对元素进⾏插⼊/删除,那么开销会很⼤。
⽽链表结构正好相反,先来看下结构:每个元素⾄少具有⼆个属性:data和next。
data⽤来存放数据,⽽next⽤来指出它后⾯的元素是谁(有点“指针”的意思)。
链表中的元素,通常也称为节点Node,下⾯是泛型版本的Node.csnamespace 线性表{public class Node<T>{private T data;private Node<T> next;public Node(T val, Node<T> p){data = val;next = p;}public Node(Node<T> p){next = p;}public Node(T val){data = val;next = null;}public Node(){data = default(T);next = null;}public T Data{get { return data; }set { data = value; }}public Node<T> Next{get { return next; }set { next = value; }}}}链表在存储上并不要求所有元素按顺序存储,因为⽤节点的next就能找到下⼀个节点,这好象⼀根“⽤珠⼦串成的链⼦”,要找到其中的某⼀颗珠⼦,只要从第⼀颗节点(通常称为Head节点)开始,不断根据next指向找到下⼀个,直到找到需要的节点为⽌。
实验二 链表操作实现
实验二链表操作实现实验日期:2017 年 3 月16 日实验目的及要求1. 熟练掌握线性表的基本操作在链式存储上的实现;2. 以线性表的各种操作(建立、插入、删除、遍历等)的实现为重点;3. 掌握线性表的链式存储结构的定义和基本操作的实现;4. 通过本实验加深对C语言的使用(特别是函数的参数调用、指针类型的应用)。
实验内容已知程序文件linklist.cpp已给出学生身高信息链表的类型定义和基本运算函数定义。
(1)链表类型定义typedef struct {int xh; /*学号*/float sg; /*身高*/int sex; /*性别,0为男生,1为女生*/} datatype;typedef struct node{datatype data; /*数据域*/struct node *next; /*指针域*/} LinkNode, *LinkList;(2)带头结点的单链表的基本运算函数原型LinkList initList();/*置一个空表(带头结点)*/void createList_1(LinkList head);/*创建单链表*/void createList_2(LinkList head);/* 创建单链表*/void sort_xh(LinkList head);/*单链表排序*/void reverse(LinkList head);/*对单链表进行结点倒置*/void Error(char *s);/*自定义错误处理函数*/void pntList(LinkList head);/*打印单链表*/void save(LinkList head,char strname[]);/*保存单链表到文件*/任务一创建程序文件linklist.cpp,其代码如下所示,理解LinkList类型和基本运算函数后回答下列问题。
#include <stdio.h>#include <stdlib.h>/*单链表结点类型*/typedef struct {int xh; /*学号*/float sg; /*身高*/int sex; /*性别,0为男生,1为女生*/} datatype;typedef struct node{datatype data; /*数据域*/struct node *next; /*指针域*/} LinkNode, *LinkList;/*带表头的单链表的基本运算函数*/LinkList initList();/*置一个空表(带头结点)*/void createList_1(LinkList head);/*创建单链表*/void createList_2(LinkList head);/*创建单链表*/void sort_xh(LinkList head);/*单链表排序*/void reverse(LinkList head);/*单链表倒置*/void Error(char *s);/*自定义错误处理函数*/void pntList(LinkList head);/*打印单链表*/void save(LinkList head,char strname[]);/*保存单链表到文件*//*置一个空表*/LinkList initList(){ LinkList p;p=(LinkList)malloc(sizeof(LinkNode));p->next=NULL;return p;}/*创建单链表*/void createList_1(LinkList head){ FILE *fp;int xh;float sg;int sex;LinkList p;if((fp=fopen("records.txt","r"))==NULL){ Error("can not open file !");return ;}while(!feof(fp)){ fscanf(fp,"%d%f%d",&xh,&sg,&sex);p=(LinkList)malloc(sizeof(LinkNode));p->data.xh=xh;p->data.sg=sg;p->data.sex=sex;p->next=head->next;head->next=p;}fclose(fp);}/*创建单链表*/void createList_2(LinkList head){ FILE *fp;int xh;float sg;int sex;LinkList p,rear;if((fp=fopen("records.txt","r"))==NULL){ Error("can not open file !");return ;}rear=head;while(!feof(fp)){ fscanf(fp,"%d%f%d",&xh,&sg,&sex);p=(LinkList)malloc(sizeof(LinkNode));p->data.xh=xh;p->data.sg=sg;p->data.sex=sex;p->next=NULL;rear->next=p;rear=p;}fclose(fp);}/*单链表排序*/void sort_xh(LinkList head){LinkList q,p,u;p=head->next;head->next=NULL;/*利用原表头结点建新的空表*/while(p){ q=p; /*q为被插入的结点*/p=p->next;/*用p记录后继结点*//*遍历新链表查找插入位置*/u=head;while(u->next!=NULL)/*查找插入位置*/{ if(u->next->data.xh>q->data.xh)break;u=u->next;}/*插入在u结点的后面*/q->next=u->next;u->next=q;}}/*单链表倒置*/void reverse(LinkList head){ LinkList p, r;p=head->next;head->next=NULL;while(p){ r=p;p=p->next;/*r指向结点头插到链表*/r->next=head->next;head->next=r;}}/*输出单链表*/void pntList(LinkList head){ LinkList p;p=head->next;while(p!=NULL){printf("%2d: %.2f %d\n",p->data.xh,p->data.sg,p->data .sex);p=p->next;}}/*自定义错误处理函数*/void Error(char *s){ printf("\n %s", s);exit(1); /*返回OS,该函数定义在stdlib.h中*/}/*保存单链表到文件*/void save(LinkList head,char strname[]){ FILE *fp;LinkList p;if((fp=fopen(strname,"w"))==NULL){ printf("can not open file !");return ;}p=head->next;while(p!=NULL){ fprintf(fp,"%2d %5.2f %2d\n",p->data.xh,p->data.sg,p->data.sex);p=p->next;}fclose(fp);}请回答下列问题:(1)由单链表结点类型定义可知,该链表结点类型名为 LinkNode ,结点的指针类型为 LinkList ,向系统申请一个学生结点空间并把起始地址存于上述结点指针变量new 中的语句是: p=(LinkList)malloc(sizeof(LinkNode)); 。
线性表的疑问
L.elem=(Elemtype*)malloc(LIST_INIT_SIZE*sizeof(Elemtype));1.将L.elem这个指针指向一块通过malloc函数分配的内存的地址这个内存的大小为Elemtype这个结构体的size*LIST_INIT_SIZE的乘积这么大malloc 是用于分配指定size的内存的库函数原型:extern void *malloc(unsigned int num_bytes);用法:#include <malloc.h>或#include<stdlib.h>功能:分配长度为num_bytes字节的内存块说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
当内存不再使用时,应使用free()函数将内存块释放。
malloc的语法是:指针名=(数据类型*)malloc(长度),(数据类型*)表示指针.2.malloc 向系统申请分配指定size个字节的内存空间。
然后把指向这块空间的指针返回给你,这个指针是void类型的。
C,C++规定,void* 类型可以强制转换为任何其它类型的指针。
malloc的原型:extern void *malloc(unsigned intnum_bytes);返回值:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
当内存不再使用时,应使用free()函数将内存块释放。
这是一个C库函数,所以不会像C++的new运算符一样返回特定类型的指针。
数据结构中if(!l.elem)是什么意思?只是判断l中的数据成员elem是否为0,为0即执行if下面语句追问l.elem的意思是不是“线性表l的基地址elem"?回答从字面上看elem是指“元素”,我没办法从你给的代码上下文中判断是否是“线性表l 的基地址elem”你多贴点代码出来看看追问status initlist_sq(sqlist&l){l.elem=(elemtype*)malloc(list_init_size*sizeof(elemtype));if(!l.elem)exit(overlow);l.length=0;l.listsize=list_init_size;return ok;}回答elem是elemtype类型数组的首地址,也可以说是基地址。
UBOOT:2.3malloc_simple、link_list
UBOOT:2.3malloc_simple、link_list1. malloc_simplemalloc,calloc等函数在include/malloc.h中定义,如下图所⽰。
当使⽤标准C编译器编译时__STD_C有定义,经过测试__STD_C有定义。
可以看到malloc和calloc等函数的定义⽐较奇怪,但是对于使⽤没有任何影响。
1.1 mALLOcmALLOc函数如下,GD_FLG_FULL_MALLOC_INIT表⽰是否使⽤使⽤全功能的malloc,显然此标志未使⽤,直接调⽤malloc_simple函数进⾏内存分配。
malloc_simple在common/malloc_simple.c中定义,如下图所⽰。
可以看到在gd->malloc_base指向的堆起始地址中,分配⼀块连续的内存。
gd->malloc_ptr指向分配后的堆空闲区域起始偏移。
1.2 cALLOccALLOc代码如下图所⽰,可以看出cALLOc调⽤mALLOc分配⼀块内存,并将此内存初始化为0。
2. linker_listlinker list在include/linker_list.h中定义,由⼀组链接输⼊段组成。
2.0 说明在u-boot.lds中定义了u_boot_list段,将所有.u_boot_list*属性的变量都放在此段中,并进⾏排序(SORT)。
u_boot_list中存放列表和条⽬,⼀个列表有许多的条⽬假定_list和_entry为列表和条⽬名,则相应的输⼊段名为:.u_boot_list_ + 2_ + @_list + _2_ + @_entry -----------------------c变量名为:_u_boot_list + _2_ + @_list + _2_ + @_entry -----------------------列表的start和end符号为:%u_boot_list_2_ + @_list + _1_...-----------------------%u_boot_list_2_ + @_list + _3_...-----------------------整个链接列表区域的start和end符号为:%u_boot_list_1_...-----------------------%u_boot_list_3_...-----------------------2.1 llsymllsym访问⼀个条⽬,定义如下。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <stdio.h>
#include <malloc.h>
#include <string.h>
struct stud_node{ /*链表结点类型*/ int num;
char name[20];
int score;
struct stud_node *next;
};
struct stud_node * Create_Stu_Doc()
{
int num,score;
char name[20];
struct stud_node *head, *tail, *p;
head = tail = NULL;
printf("input the num name score\n");
scanf("%d%s%d", &num,name, &score);
while(num != 0)
{
p = (struct stud_node *) malloc(sizeof(struct stud_node));
p->num = num;
strcpy(p->name, name);
p->score = score;
p->next = NULL;
if(head == NULL)
head = p;
else
tail->next = p;
tail = p;
printf("input the num name score\n");
scanf("%d%s%d", &num, name, &score);
}
return head;
} /* 新建链表*/
void InsertDoc(struct stud_node * head, struct stud_node *stud) {
stud->next=head;
head=stud;
} /* 插入*/
void DeleteDoc(struct stud_node * head, int num)
{
struct stud_node *p1,*p2;
p1=head;
p2=head->next;
if(p1->num==num)
{head=p1->next;
free(p1);}
else
{
while(p2->num!=num&&p2!=NULL)
{
p2=p2->next;
p1=p1->next;
}
p1->next=p2->next;
free(p2);
}
} /* 删除*/
void Print_Stu_Doc(struct stud_node * head)
{
struct stud_node * ptr;
if (head == NULL){
printf("\nNo Records\n");
return;
}
printf("\nThe Students' Records Are: \n");
printf(" Num Name Score\n");
for(ptr = head; ptr!=NULL; ptr = ptr->next)
printf("%8d %20s %6d \n", ptr->num, ptr->name, ptr->score); } /* 遍历*/
int main()
{
int num;
struct stud_node *head,*stud;
head=Create_Stu_Doc();
Print_Stu_Doc(head);
stud = (struct stud_node *) malloc(sizeof(struct stud_node));
printf("\nThe Students' Records Are: \n");
scanf("%d%s%d",&stud->num,stud->name,&stud->score);
InsertDoc(head,stud);
Print_Stu_Doc(head);
scanf("input the number:%d",&num);
DeleteDoc(head,num);
Print_Stu_Doc(head);
return 0;
}。