文档库 最新最全的文档下载
当前位置:文档库 › 二叉链表的创建

二叉链表的创建

二叉链表的创建
二叉链表的创建

本科学生设计性实验报告

项目组长__刘正军_学号__0123921___

成员刘正军,章成(0123925)

专业_软件工程班级_126 _

实验项目名称_二叉链表的创建________

指导教师及职称_严军勇讲师___

开课学期2013至2014年_第一学期

上课时间2013 年11月11日至12月20 日

C++链表的创建与操作

C++链表的创建与操作 我们知道,数组式计算机根据事先定义好的数组类型与长度自动为其分配一连续的存储单元,相同数组的位置和距离都是固定的,也就是说,任何一个数组元素的地址都可一个简单的公式计算出来,因此这种结构可以有效的对数组元素进行随机访问。但若对数组元素进行插入和删除操作,则会引起大量数据的移动,从而使简单的数据处理变得非常复杂,低效。 为了能有效地解决这些问题,一种称为“链表”的数据结构得到了广泛应用。 1.链表概述 链表是一种动态数据结构,他的特点是用一组任意的存储单元(可以是连续的,也可以是不连续的)存放数据元素。 链表中每一个元素成为“结点”,每一个结点都是由数据域和指针域组成的,每个结点中的指针域指向下一个结点。Head是“头指针”,表示链表的开始,用来指向第一个结点,而最后一个指针的指针域为NULL(空地址),表示链表的结束。 可以看出链表结构必须利用指针才能实现,即一个结点中必须包含一个指针变量,用来存放下一个结点的地址。 实际上,链表中的每个结点可以用若干个数据和若干个指针。结点中只有一个指针的链表称为单链表,这是最简单的链表结构。 再c++中实现一个单链表结构比较简单。例如,可定义单链表结构的最简单形式如下 struct Node{ int Data; Node *next; }; 这里用到了结构体类型。其中,*next是指针域,用来指向该结点的下一个结点;Data是一个整形变量,用来存放结点中的数据。当然,Data可以是任何数据类型,包括结构体类型或类类型。 在此基础上,我们在定义一个链表类list,其中包含链表结点的插入,删除,输出等功能的成员函数。class list{ Node *head; public: list(){head=NULL;} void insertlist(int aDate,int bDate); //链表结点的插入 void Deletelist(int aDate); //链表结点的删除 void Outputlist(); //链表结点的输出 Node*Gethead(){return head;} }; 2.链表结点的访问 由于链表中的各个结点是由指针链接在一起的,其存储单元文笔是连续的,因此,对其中任意结点的地址无法向数组一样,用一个简单的公式计算出来,进行随机访问。只能从链表的头指针(即head)开始,用一个指针p先指向第一个结点,然后根据结点p找到下一个结点。以此类推,直至找到所要访问的结点或到最后一个结点(指针为空)为止。 下面我们给出上述链表的输出函数; void list::Outputlist(){ Node *current = head; while(current != NULL){ cout << current->Data << " "; current = current->next;

单链表的创建、插入和删除

单链表的创建、插入和删除 (数据结构) ——SVS #include #include #include typedef int ElemType; typedef int Status; typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; void InitList_Link(LinkList L) //创建空链表 { L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; } Status InsertList_Link(LinkList L,int i,ElemType e) //插入链表 { LinkList s,p=L; int j=0; while(p&&jnext;j++;} if(!p||j>i-1)return -1; s=(LinkList)malloc(sizeof(LNode)); s->data=e; s->next=p->next; p->next=s; return 1; }

Status DeleteList_Link(LinkList L,int i,ElemType e) //删除链表{ LinkList q,p=L;int j=0; while(p->next&&jnext;j++;} if(!(p->next)||j>i-1)return -1; q=p->next; e=q->data; p->next=q->next; free(q); return 1; } void OutPutList_Link(LinkList L) //输出链表 { printf("表中值为:"); LinkList p=L->next; while(p) { printf("%d ",p->data); p=p->next; } printf("\n"); } void CreateList_Link(LinkList L,int len) //创建链表 { int i; LinkList s,p=L; for(i=0;idata); s->next=NULL; p->next=s; p=s; } } int main() { int len; LinkList L; ElemType e; L=(LinkList)malloc(sizeof(LNode));

C语言链表的建立、插入和删除

数组作为存放同类数据的集合,给我们在程序设计时带来很多的方便,增加了灵活性。但数组也同样存在一些弊病。如数组的大小在定义时要事先规定,不能在程序中进行调整,这样一来,在程序设计中针对不同问题有时需要3 0个大小的数组,有时需要5 0个数组的大小,难于统一。我们只能够根据可能的最大需求来定义数组,常常会造成一定存储空间的浪费。我们希望构造动态的数组,随时可以调整数组的大小,以满足不同问题的需要。链表就是我们需要的动态数组。它是在程序的执行过程中根据需要有数据存储就向系统要求申请存储空间,决不构成对存储区的浪费。 链表是一种复杂的数据结构,其数据之间的相互关系使链表分成三种:单链表、循环链表、双向链表,下面将逐一介绍。 7.4.1 单链表 图7 - 3是单链表的结构。 单链表有一个头节点h e a d,指向链表在内存的首地址。链表中的每一个节点的数据类型为结构体类型,节点有两个成员:整型成员(实际需要保存的数据)和指向下一个结构体类型节点的指针即下一个节点的地址(事实上,此单链表是用于存放整型数据的动态数组)。链表按此结构对各节点的访问需从链表的头找起,后续节点的地址由当前节点给出。无论在表中访问那一个节点,都需要从链表的头开始,顺序向后查找。链表的尾节点由于无后续节点,其指针域为空,写作为N U L L。 图7 - 3还给出这样一层含义,链表中的各节点在内存的存储地址不是连续的,其各节点的地址是在需要时向系统申请分配的,系统根据内存的当前情况,既可以连续分配地址,也可以跳跃式分配地址。 看一下链表节点的数据结构定义: struct node { int num; struct node *p; } ; 在链表节点的定义中,除一个整型的成员外,成员p是指向与节点类型完全相同的指针。在链表节点的数据结构中,非常特殊的一点就是结构体内的指针域的数据类型使用了未定义成功的数据类型。这是在C中唯一规定可以先使用后定义的数据结构。 ?单链表的创建过程有以下几步: 1 ) 定义链表的数据结构。 2 ) 创建一个空表。 3 ) 利用m a l l o c ( )函数向系统申请分配一个节点。 4 ) 将新节点的指针成员赋值为空。若是空表,将新节点连接到表头;若是非空表,将新 节点接到表尾。 5 ) 判断一下是否有后续节点要接入链表,若有转到3 ),否则结束。 ?单链表的输出过程有以下几步 1) 找到表头。

链表建立

#include /*这个头文件在动态的建立结点时要用到*/ /* * 这就是表示单链表的一个结点的结构体了, * 简单起见没有使用模板之类的复杂东西。 */ struct Node { /*这个表示结点的值,这里为了简单,就用int型的吧*/ int data; /* * 这是指向结点结构体的一个指针, * 这里用它指向该结点的下一个结点, * 以此使单个的结点形成链表 */ struct Node* next; };/*至此链表的结点就定义完了*/ int main() { /*下面展示如何建立成为一个带头结点的单链表:L={12,13,21,24}*/ struct Node* head = NULL; /*这是链表的头结点*/ struct Node* p = NULL, *q = NULL; /*临时指针,建立链表时会用到*/ /*链表很短,我不用循环,直接建立,可以让你看的更清楚*/ /*建立头结点*/ head = (struct Node*)malloc(sizeof(struct Node)); /*指定结点的值*/ head->data = 12; /*指定下一个结点,现在还没有先给NULL*/ head->next = NULL; /*用q保存刚生成的结点*/ q = head; /*第二个结点,建立的方法和第一个一样*/ p = (struct Node*)malloc(sizeof(struct Node)); p->data = 13; p->next = NULL; /*注意,此时需要调整一下上一个结点的next指针,使各结点可以连接起来*/ q->next = p; q = p; /*第三个结点*/

C语言链表专题复习

链表专题复习 数组作为存放同类数据的集合,给我们在程序设计时带来很多的方便,增加了灵活性。但数组也同样存在一些弊病。如数组的大小在定义时要事先规定,不能在程序中进行调整,这样一来,在程序设计中针对不同问题有时需要3 0个元素大小的数组,有时需要5 0个数组元素的大小,难于统一。我们只能够根据可能的最大需求来定义数组,常常会造成一定存储空间的浪费。 我们希望构造动态的数组,随时可以调整数组的大小,以满足不同问题的需要。链表就是我们需要的动态数组。它是在程序的执行过程中根据需要有数据存储就向系统要求申请存储空间,决不构成对存储区的浪费。 链表是一种复杂的数据结构,其数据之间的相互关系使链表分成三种:单链表、循环链表、双向链表,下面只介绍单向链表。 7.4.1 单链表 图7 - 3是单链表的结构。 单链表有一个头节点h e a d,指向链表在内存的首地址。链表中的每一个节点的数据类型为结构体类型,节点有两个成员:整型成员(实际需要保存的数据)和指向下一个结构体类型节点的指针即下一个节点的地址(事实上,此单链表是用于存放整型数据的动态数组)。链表按此结构对各节点的访问需从链表的头找起,后续节点的地址由当前节点给出。无论在表中访问那一个节点,都需要从链表的头开始,顺序向后查找。链表的尾节点由于无后续节点,其指针域为空,写作为N U L L。 图7 - 3还给出这样一层含义,链表中的各节点在内存的存储地址不是连续的,其各节点的地址是在需要时向系统申请分配的,系统根据内存的当前情况,既可以连续分配地址,也可以跳跃式分配地址。 看一下链表节点的数据结构定义: struct node { int num; struct node *p; } ; 在链表节点的定义中,除一个整型的成员外,成员p是指向与节点类型完全相同的指针。 在链表节点的数据结构中,非常特殊的一点就是结构体内的指针域的数据类型使用了未定义成功的数据类型。这是在C中唯一规定可以先使用后定义的数据结构。 ?单链表的创建过程有以下几步: 1 ) 定义链表的数据结构。 2 ) 创建一个空表。 3 ) 利用m a l l o c ( )函数向系统申请分配一个节点。

双向链表的创建

#include #include typedef struct LNode { int data; int length; struct LNode *next; struct LNode *prior; }DuLNode,*DuLinkList; void initlist(DuLNode **p){ *p=(DuLinkList)malloc(sizeof(DuLNode)); (*p)->next=(*p)->prior=NULL; } void create(DuLNode **p,int n){ DuLinkList q; printf("输入%d个双向链表的元素\n",n); for(int i=n;i>0;--i)//创建n个元素的双向链表。 { DuLinkList s; s=(DuLinkList)malloc(sizeof(DuLNode)); scanf("%d",&(s->data)); if(i==n) {*p=s; q=s; s->next=s->prior; s->prior=s->next; } else { q->next=s; s->next=*p; (*p)->prior=s; s->prior=q; q=s; } } (*p)->length=n; }

void Display(DuLinkList L,int n){ int i; for(i=0;inext; } } int main(int argc, char* argv[]) { DuLinkList L; initlist(&L); create(&L,3); Display(L,3); printf("双向链表的长度%d\t",L->length); return 0; }

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

#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 #include typedef char date; typedef struct node { date ch; struct node *next; }list; typedef list *linklist; linklist creat() { date ch; linklist head=(linklist)malloc(sizeof(list)); list *p,*r; r=head; ch=getchar(); while(ch!='\n') { p=(linklist)malloc(sizeof(list)); p->ch=ch; r->next=p; r=p; ch=getchar(); } r->next=NULL; return (head); } void insert(linklist head,int i,char x) { int j=0; linklist r,p; p=head->next; while(p&&jnext; j++; } if(!p||j>i-1) exit(1); r=(linklist)malloc(sizeof(list)); r->ch=x;

r->next=p->next; p->next=r; } void puter(linklist linker) { linklist p; p=linker->next; while(p!=NULL) { printf("%c ",p->ch); p=p->next; } } void delet(linklist head ,int i) { int j=0; linklist r,p; p=head->next; while(p&&jnext; j++; } if(!p||j>i-1) exit(1); r=p->next; p->next=r->next; free(r); } int main() { static int q,k; char w; printf("请输入字符穿,并以ENTER键结束\n"); linklist head,p,linker=creat(); puter(linker); printf("请输入插入位置和插入字母\n"); scanf("%d %c",&q,&w); insert(linker,q,w); puter(linker); printf("\n请输入删除位置的序号:\n"); scanf("%d",&k); delet(linker,k);

单链表的建立查找插入删除

单链表的建立查找插入删除

数学与计算机学院计算机系实验报告 课程名称:数据结 构 年级:2011 实验成绩: 指导教师:黄襄念姓名: abraham 实验教室:6A-412 实验名称:单链表的建立/查找/插入/删除学号:实验日期: 2012/12/16 实验序号:实验1 实验时间:6:40 —9:50 实验学时:4 撰写说明:填写上面相关栏目,须作相应修改。 仔细阅读:最后“六、提交文档要求”有关说明。 一、实验目的 1.熟悉掌握链表的创建、链表的常用算法:如查找节点,删除节点,插 入节点等等。 二、实验环境 1. 操作系统:Windows XP 2. 开发软件:VC++6.0 三、实验内容 ●程序功能 本程序完成了以下功能: 1.可以逐个添加英文字到链中。 2.可以删除链中的任意一元素而保持其他元素整体不变。 3.可以查找链表中的任意一个元素,只要输入该元素在链表中 的位置,就可以查找到该元素。 4.可以在该链表中插入任意一个元素不改变整体的顺序,输入 你要插入的位置即可。 ●数据结构 本程序中使用的数据结构(若有多个,逐个说明): 1.它的优缺点 1)能将物理地址散乱的链接在一起,更好的利用空间,可

以动态的申请空间,如使用数组未必能申请到连续的空间但是用链表就可以解决这个问题。 2)能快速的删除节点,和增添节点。 2.逻辑结构图 3.存储结构图Head m 开始 创建链插 入 节 删 除 节 查 找 节结束

Num Num 4.存储结构的C/C++ 语言描述 typedef struct node { char data; struct node *next; }link; ●算法描述(结合流程图或伪代码描述算法,若无可略) 本程序中采用的算法(若有多个,逐个说明) 1.算法名称:创建链表 2.算法原理或思想 通过申请一个结构体指针,在用结果体指针申请一个空间,在输入信息后用前一个节点的Next指针将增加的结点与前面的结点链接,如此重复操作,就形成一个链表。 3.算法特点(优缺点,与可选或同类算法作对比) 与数组相比较,是不连续的,它能随意的添加结点你需要多少就添加多少不会浪费多余的空间也不用提前去预测需要多少空间而其他的要考虑通用性,就必须申请较大的空间,而造成空间的浪费。 ●程序说明 1.系统流程图(各个函数或类的调用流程图)

创建单链表的几种方法

# include "stdio.h" # include "stdlib.h" # include "malloc.h" # define LEN sizeof(SLNode) typedef int DataType; typedef struct SLNode { DataType data; struct SLNode *next; }SLNode,*NODE; //通过return语句 SLNode *creat1() { SLNode *head,*p,*q; head=(SLNode *)malloc(LEN); q=p=head; scanf("%d",&p->data); while(p->data!=0) { p=(SLNode *)malloc(LEN); scanf("%d",&p->data); q->next=p; q=p; } q->next=NULL; return head; } //通过全局变量 SLNode *head; void creat2() { SLNode *p,*q; head=(SLNode *)malloc(LEN); q=p=head; scanf("%d",&p->data); while(p->data!=0) { p=(SLNode *)malloc(LEN); scanf("%d",&p->data); q->next=p; q=p; } q->next=NULL;

} //通过指针参数 void creat3(SLNode **head) { SLNode *p,*q; *head=(SLNode *)malloc(LEN); q=p=*head; scanf("%d",&p->data); while(p->data!=0) { p=(SLNode *)malloc(LEN); scanf("%d",&p->data); q->next=p; q=p; } q->next=NULL; } //通过引用型参数 void creat4(NODE &head) { SLNode *p,*q; head=(SLNode *)malloc(LEN); q=p=head; scanf("%d",&p->data); while(p->data!=0) { p=(SLNode *)malloc(LEN); scanf("%d",&p->data); q->next=p; q=p; } q->next=NULL; } void print(SLNode *head) { while(head!=NULL) { printf("%4d",head->data); head=head->next; } } void main() { SLNode *h1,*h3,*h4;

C语言中链表的创建

C语言数据类型的使用 struct student //这里struct是保留字,student是结构体名;它们合起来就是结构体类型名{ int num; char name[20]; char sex; int age; float score; char addr[30]; }; //{}之间是结构体成员表 struct student student1, student2; //用以上的结构体类型名定义两个变量 struct student stu[20]; //用以上的结构体类型名定义一个20个元素的数组 以上说明也可缩写成: struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }student1, student2, stu[20]; 使用typedef定义类型 typedef struct { int num; char name[20]; char sex; int age; float score; char addr[30]; }STUDENT; //定义一个结构类型名 STUDENT student1, student2, stu[20]; //用结构类型名定义变量 结构变量的引用 student1.num=12; https://www.wendangku.net/doc/654733284.html,=”马大哈”; stu[10].score=88; stu[1].sex=’M’; student1.addr=”北京市丰台区富丰路7号”; 看typedef的使用 typedef int INTEGER; typedef float REAL; typedef int ARR[10];

链表的C语言实现

链表的C语言实现 分类:计算机学习 2006.12.29 09:06 作者:ybxycy | 评论:0 | 阅读:652 数组作为存放同类数据的集合,给我们在程序设计时带来很多的方便,增加了灵活性。但数组也同样存在一些弊病。如数组的大小在定义时要事先规定,不能在程序中进行调整,这样一来,在程序设计中针对不同问题有时需要3 0个大小的数组,有时需要5 0个数组的大小,难于统一。我们只能够根据可能的最大需求来定义数组,常常会造成一定存储空间的浪费。 我们希望构造动态的数组,随时可以调整数组的大小,以满足不同问题的需要。链表就是我们需要的动态数组。它是在程序的执行过程中根据需要有数据存储就向系统要求申请存储空间,决不构成对存储区的浪费。 链表是一种复杂的数据结构,其数据之间的相互关系使链表分成三种:单链表、循环链表、双向链表,下面将逐一介绍。 7.4.1 单链表 图7 - 3是单链表的结构。 单链表有一个头节点h e a d,指向链表在内存的首地址。链表中的每一个节点的数据类型为结构体类型,节点有两个成员:整型成员(实际需要保存的数据)和指向下一个结构体类型节点的指针即下一个节点的地址(事实上,此单链表是用于存放整型数据的动态数组)。链表按此结构对各节点的访问需从链表的头找起,后续节点的地址由当前节点给出。无论在表中访问那一个节点,都需要从链表的头开始,顺序向后查找。链表的尾节点由于无后续节点,其指针域为空,写作为N U L L。 图7 - 3还给出这样一层含义,链表中的各节点在内存的存储地址不是连续的,其各节点的地址是在需要时向系统申请分配的,系统根据内存的当前情况,既可以连续分配地址,也可以跳跃式分配地址。

单链表的创建及功能实现(java编写)

2014-6-28 //任一类学生为例,建立动态结构—单链表的结构形式;完成学生单链表的建立、插入、删除、查询等功能。请用面向对象的思想分析问题及书写程序。 import java.util.Scanner; public class List { //定义一个内部类 public class Node { int data; Node next;//指向下一个节点的引用 public Node(int data,Node next) { this.data=data;this.next=next; } }//内部类结束 public Node header; public Node p; static int length; public void CreatList(int a[])//尾插法创建单链表 { Node q=new Node(0,null); header=q; for(int i=0;ilength-1) { System.out.println("链表索引越界"); } Node k=header.next; for(int i=0;i

return null; } public void insertList(int index,int data)//插入元素{ if(index<0||index>length) { System.out.println("链表索引越界"); } else { Node j=getNodebyindex(index-1); Node newnode=new Node(data,null); newnode.next=j.next; j.next=newnode; length++; } } public void Delete(int index)//删除节点 { if(index<0||index>length-1) { System.out.println("链表索引越界"); } Node j=getNodebyindex(index-1); Node del=j.next; j.next=del.next; length--; } public void Getelem(int index)//查询索引index处的元素{ if(index<0||index>length-1) { System.out.println("链表索引越界"); } Node k=getNodebyindex(index); System.out.println("查询得到的元素为:"+k.data); } public void print()//输出链表 { Node p=header.next;

带头结点的单链表的创建

带头结点的单链表的创建、求表长、输出、插入、删除、查找、逆置 //说明在VC6.0中不能把本代码保存为.c进行编译,应保存为.cpp,原因可能是里边注释是c++的风格,在codeblocks中不存在这个问题 #include #include #define DataType int #define FLAG -1 typedef struct Node { DataType data; struct Node *next; }Lnode,*LinkList; LinkList Creat_LinkList() { LinkList L; Lnode *s,*r; int x; printf("建立有表头结点的单链表,以%d作为创建链表完成的标志\n",FLAG); L=r=s=NULL; L=(Lnode *)malloc(sizeof(Lnode)); if(!L) { printf("表头结点开辟失败\n"); exit(-1); } L->next=NULL; scanf("%d",&x); while(x!=FLAG) { s=(Lnode *)malloc(sizeof(Lnode)); if(!s) { printf("结点开辟失败\n"); exit(-1); }

s->data=x; if(NULL==L->next)//第一个结点的处理 L->next=s; else r->next=s; r=s; scanf("%d",&x); } if(r!=NULL)//对于非空表,最后结点的指针域放空指针r->next=NULL; return L; } /*有头结点的链表,求表长算法*/ int Length_LinkList(LinkList L) { Lnode *p; int j; p=L; j=0; while(p->next) { p=p->next; j++; } return j; } int Print_LinkList(LinkList L) { printf("输出:\n"); Lnode *s; s=L; while(s->next!=NULL) { s=s->next; printf("%3d",s->data);

数据结构.单链表的创建

[数据结构实验题目三] 单链表的创建 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个结点

C语言 创建一个链表

C语言创建一个链表,并将数据倒序输出 代码如下: #include #include #include #define ok 1 #define Elemtype int typedef int status; typedef struct sql { Elemtype length; Elemtype data; struct sql *next; }SQL; SQL L; SQL *head; status create_head() //创建头结点 { head=(SQL *)malloc(sizeof(struct sql)); head->next=NULL; if(head) return ok; } status create_sql() //创建链表,并输入数据 { int a,i; SQL *p,*q; p=head; printf("\n请输入链表的长度:"); scanf("%d",&a); L.length=a; for(i=1;i<=L.length;i++) { q=(SQL *)malloc(sizeof(SQL)); if(q) { printf("第%d个节点创建成功,请输入数据:",i); scanf("%d",&q->data); p->next=q; p=q; q->next=NULL; } else

{ printf("节点未创建成功,程序正在退 出"); exit(0); } } return ok; } status output() //输出链表的数据 { SQL *p; p=head->next; while(p) { printf("%4d",p->data); p=p->next; } return ok; } status daoxu() //将链表的数据倒序 { SQL *k,*p,*q; int flag,i; //flag 标志位记录当前 *q 所在的节点 flag=0 为q指 向头结点 p=head->next; for(i=1;inext; } else { printf("链表为空!"); exit(0); } } k=p; //*k 保存了最后一个节点的地址 flag=--i; while(flag) {

如何创建一个单链表

①.如何创建一个单链表? 链表节点的定义: typedefstruct node { int data; //节点内容 node *next; //下一个节点 }node; 单链表的创建: 1 //创建单链表 2 node *create() 3 { 4 int i = 0; //链表中数据的个数 5 node *head, *p, *q; 6 int x = 0; 7 head = (node *)malloc(sizeof(node)); //创建头节点8 9 while(1) 10 { 11 printf("Please input the data: "); 12 scanf("%d", &x); 13 if (x == 0) //data为0时创建结束 14 break; 15 p = (node *)malloc(sizeof(node)); 16 p->data = x; 17 if (++i == 1) 18 { //链表只有一个元素 19 head->next = p; //连接到head的后面 20 } 21 else 22 { 23 q->next = p; //连接到链表尾端 24 } 25 q = p; //q指向末节点

26 } 27 q->next = NULL; //链表的最后一个指针为NULL 28 return head; 29 } 上面的代码中,使用while循环每次从终端读入一个整型数据,并调用malloc动态分配链表节点内存存储这个整型数据,然后再插入到单链表的末尾。最后当数据为0时表示插入数据结束,此时把末尾节点的next指针置为NULL。 ②.查找单链表中间元素? 解析: 这里使用一个只用一遍扫描的方法。描述如下: 假设mid指向当前已经扫描的子链表的中间元素,cur指向当前以扫描链表的尾节点,那么继续扫描即移动cur到cur->next,这时只需判断一下应不应移动mid到mid->next就行了。所以一遍扫描就能找到中间位置。代码如下: 1 node *search(node *head) 2 { 3 int i = 0; 4 int j = 0; 5 node *current = NULL; 6 node *middle = NULL; 7 8 current = middle = head->next; 9 while(current != NULL) 10 { 11 if( i / 2 > j) 12 { 13 j++; 14 middle = middle->next; 15 } 16 i++; 17 current = current->next; 18 } 19

建立一个学生信息链表

题目: 建立一个学生信息链表,每个结点包括:学号、姓名、成绩。实现链表的建立、显示和查询。查询是指输入一个学号,如果链表中存在该学号的的结点,则显示此结点的数据。 源代码: //科目:C++实验3 //题目:建立一个学生信息链表,每个结点包括:学号、姓名、成绩。 //语言:C++ //作者:武叶 //创作时间:2012年3月20日 #include using namespace std; static int N=0; //定义N记录学生人数 /****定义结构体类型****/ typedef struct Node { int num; char name[10]; float score; struct Node *next; }stNode; /******初始化链表*******/ stNode * initlist() { struct Node *head; //定义头指针 struct Node *p1,*p2;

p1=p2=new Node; //使p1,p2指向新的结点 cout<<"请按学号姓名成绩依次输入:"<<"\n"; cin>>p1->num;cin>>p1->name;cin>>p1->score; head=NULL; while(p1->num!=0) { //输入学号以0结束 N++; //学生记录加1 if(N==1) head=p1; else p2->next=p1; p2=p1; //使p1指向结点尾 p1=new Node; //申请新的结点,存放下个记录 cin>>p1->num; cin>>p1->name;cin>>p1->score; } p2->next=NULL; return(head); //返回头指针 } /************显示链表内容*********/ void dispStLink(struct Node *head) { struct Node *p; p=head; cout<<"学号"<<"\t"<<"姓名"<<"\t"<<"成绩"<<"\n"; for(int i=0;i<=20;i++) { cout<num<<"\t"<name<<"\t"<score<<"\t"<<"\n"; p=p->next; } } /*******查找结点*********/ stNode *search(struct Node *head,int number) {

相关文档