当前位置:文档之家› 头插法建立单链表

头插法建立单链表

头插法建立单链表
头插法建立单链表

#include

#include

typedefstruct node

{

int data;

struct node *next;

}lnode,*linklist;

\*定义头结点的函数*\

linklistInitlist_l();

\*定义头插法的函数*\

linklistCreatelist_f(linklistl,int n);

\*定义输出链表数据的函数*\ voidPrintlist(linklist);

\*主函数*\

int main(void)

{

inti,s,n;

linklist l;

l=Initlist_l();

printf("Please input number of datas:\n");

scanf("%d",&n);

Createlist_f(l,n);

Printlist(l);

return 0;

}

linklistInitlist_l()

{

linklist l;

l=(linklist)malloc(sizeof(lnode));

l->next=0;

return l;

}

linklistCreatelist_f(linklistl,int n)

{

int i;

linklist p;

for(i=0;i

{

p=(linklist)malloc(sizeof(lnode));

printf("Input Data:\n");

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

p->next=l->next;

l->next=p;

}

return l;

}

voidPrintlist(linklist l)

{

linklist p;

p=l->next;

while(p)

{

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

p=p->next;

}

printf("\n");

}

排列组合问题之捆绑法_插空法和插板法

“相邻问题”捆绑法,即在解决对于某几个元素要求相邻的问题时,先将其“捆绑”后整体考虑,也就是将相邻元素视作“一个”大元素进行排序,然后再考虑大元素内部各元素间排列顺序的解题策略。 例1.若有A、B、C、D、E五个人排队,要求A和B两个人必须站在相邻位置,则有多少排队方法? 【解析】:题目要求A和B两个人必须排在一起,首先将A和B两个人“捆绑”,视其为“一个人”,也即对“A,B”、C、D、E“四个人”进行排列,有种排法。又因为捆绑在一起的A、B两人也要排序,有种排法。根据分步乘法原理,总的排法有种。 例2.有8本不同的书,其中数学书3本,外语书2本,其它学科书3本。若将这些书排成一列放在书架上,让数学书排在一起,外语书也恰好排在一起的排法共有多少种? 【解析】:把3本数学书“捆绑”在一起看成一本大书,2本外语书也“捆绑”在一起看成一本大书,与其它3本书一起看作5个元素,共有种排法;又3本数学书有种排法,2本外语书有种排法;根据分步乘法原理共有排法种。 【王永恒提示】:运用捆绑法解决排列组合问题时,一定要注意“捆绑”起来的大元素内部的顺序问题。解题过程是“先捆绑,再排列”。 “不邻问题”插空法,即在解决对于某几个元素要求不相邻的问题时,先将其它元素排好,再将指定的不相邻的元素插入已排好元素的间隙或两端位置,从而将问题解决的策略。

例3.若有A、B、C、D、E五个人排队,要求A和B两个人必须不站在一起,则有多少排队方法? 【解析】:题目要求A和B两个人必须隔开。首先将C、D、E三个人排列,有种排法;若排成D C E,则D、C、E“中间”和“两端”共有四个空位置,也即是:︺ D ︺ C ︺ E ︺,此时可将A、B两人插到四个空位置中的任意两个位置,有种插法。由乘法原理,共有排队方法:。 例4.在一张节目单中原有6个节目,若保持这些节目相对顺序不变,再添加进去3个节目,则所有不同的添加方法共有多少种? 【解析】:直接解答较为麻烦,可根据插空法去解题,故可先用一个节目去插7个空位(原来的6个节目排好后,中间和两端共有7个空位),有种方法;再用另一个节目去插8个空位,有种方法;用最后一个节目去插9个空位,有方法,由乘法原理得:所有不同的添加方法为=504种。 例4.一条马路上有编号为1、2、……、9的九盏路灯,为了节约用电,可以把其中的三盏关掉,但不能同时关掉相邻的两盏或三盏,则所有不同的关灯方法有多少种? 【解析】:若直接解答须分类讨论,情况较复杂。故可把六盏亮着的灯看作六个元素,然后用不亮的三盏灯去插7个空位,共有种方法(请您想想为什么不是),因此所有不同的关灯方法有种。 【王永恒提示】:运用插空法解决排列组合问题时,一定要注意插空位置包括先排好元素“中间空位”和“两端空位”。解题过程是“先排列,再插空”。 练习:一张节目表上原有3个节目,如果保持这3个节目的相对顺序不变,再添加进去2个新节目,有多少种安排方法?(国考2008-57)

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

单链表的创建、插入和删除 (数据结构) ——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));

头插法建立单链表

#include #include typedefstruct node { int data; struct node *next; }lnode,*linklist; \*定义头结点的函数*\ linklistInitlist_l(); \*定义头插法的函数*\ linklistCreatelist_f(linklistl,int n); \*定义输出链表数据的函数*\ voidPrintlist(linklist); \*主函数*\ int main(void) { inti,s,n; linklist l; l=Initlist_l(); printf("Please input number of datas:\n"); scanf("%d",&n); Createlist_f(l,n); Printlist(l); return 0; } linklistInitlist_l() { linklist l; l=(linklist)malloc(sizeof(lnode)); l->next=0; return l; } linklistCreatelist_f(linklistl,int n) { int i; linklist p; for(i=0;idata); p->next=l->next; l->next=p; }

return l; } voidPrintlist(linklist l) { linklist p; p=l->next; while(p) { printf("%d\t",p->data); p=p->next; } printf("\n"); }

排列组合问题之捆绑法-插空法和插板法

行测答题技巧:排列组合问题之捆绑法,插空法和插板法 “相邻问题”捆绑法,即在解决对于某几个元素要求相邻的问题时,先将其“捆绑”后整体考虑,也就是将相邻元素视作“一个”大元素进行排序,然后再 考虑大元素内部各元素间排列顺序的解题策略。 例1 ?若有A、B、C、D E五个人排队,要求A和B两个人必须站在相邻位置,则有多少排队方法 【解析】:题目要求A和B两个人必须排在一起,首先将A和B两个人“捆绑”,视其为“一个人”,也即对“ A,B”、C D E “四个人”进行排列,有■< 种排法。又因为捆绑在一起的A、B两人也要排序,有I种排法。根据分步乘法原理,总的排法有I -种 例2.有8本不同的书,其中数学书3本,外语书2本,其它学科书3本。若 将这些书排成一列放在书架上,让数学书排在一起,外语书也恰好排在一起的排法 共有多少种 【解析】:把3本数学书“捆绑”在一起看成一本大书,2本外语书也“捆绑”在一起看成一本大书,与其它3本书一起看作5个元素,共有丄种排法;又3 本数学书有丄种排法,2本外语书有雹种排法;根据分步乘法原理共有排法.<■'I - -- I 种。 【王永恒提示】:运用捆绑法解决排列组合问题时,一定要注意“捆绑” 起来的大元素内部的顺序问题。解题过程是“先捆绑,再排列”。 “不邻问题”插空法,即在解决对于某几个元素要求不相邻的问题时,先将其它元素排好,再将指定的不相邻的元素插入已排好元素的间隙或两端位置,从而将 问题解决的策略。 例3.若有A、B、C、D E五个人排队,要求A和B两个人必须不站在一起,则有多少排队方法

【解析】:题目要求A和B两个人必须隔开。首先将C、D E三个人排列, 有「「种排法;若排成D C E,则D C E “中间”和“两端”共有四个空位置,也即是:?D C E ,此时可将 A B两人插到四个空位置中的任意两个位置,有q种插法。由乘法原理,共有排队方法:匚二 :-。 例4.在一张节目单中原有6个节目,若保持这些节目相对顺序不变,再添加进去3个节目,则所有不同的添加方法共有多少种 【解析】:直接解答较为麻烦,可根据插空法去解题,故可先用一个节目 去插7个空位(原来的6个节目排好后,中间和两端共有7个空位),有「种方法;再用另一个节目去插8个空位,有种方法;用最后一个节目去插9个空位,有」:.方法,由乘法原理得:所有不同的添加方法为匚-.,=504种。 例4.一条马路上有编号为1、2、……、9的九盏路灯,为了节约用电, 可以把其中的三盏关掉,但不能同时关掉相邻的两盏或三盏,则所有不同的关灯方法有多少种 【解析】:若直接解答须分类讨论,情况较复杂。故可把六盏亮着的灯看作六个元素,然后用不亮的三盏灯去插7个空位,共有'种方法(请您想想为什么不是八),因此所有不同的关灯方法有'_「种。 【王永恒提示】:运用插空法解决排列组合问题时,一定要注意插空位置包括先排好元素“中间空位”和“两端空位”。解题过程是“先排列,再插空”。 练习:一张节目表上原有3个节目,如果保持这3个节目的相对顺序不变,再添加进去2个新节目,有多少种安排方法(国考2008-57) A. 20 B . 12 C . 6 D . 4 插板法是用于解决“相同元素”分组问题,且要求每组均“非空”,即要求

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) 找到表头。

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 ( )函数向系统申请分配一个节点。

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

单链表的插入和删除实验日志 指导教师刘锐实验时间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(); //函数,按值查找结点

单链表的基本操作

上机实验报告 学院:计算机与信息技术学院 专业:计算机科学与技术(师范)课程名称:数据结构 实验题目:单链表建立及操作 班级序号:师范1班 学号:201421012731 学生姓名:邓雪 指导教师:杨红颖 完成时间:2015年12月25号

一、实验目的: (1)动态地建立单链表; (2)掌握线性表的基本操作:求长度、插入、删除、查找在链式存储结构上的实现; (3)熟悉单链表的应用,明确单链表和顺序表的不同。 二、实验环境: Windows 8.1 Microsoft Visual c++ 6.0 三、实验内容及要求: 建立单链表,实现如下功能: 1、建立单链表并输出(头插法建立单链表); 2、求表长; 3、按位置查找 4、按值查找结点; 5、后插结点; 6、前插结点 7、删除结点; 四、概要设计: 1、通过循环,由键盘输入一串数据。创建并初始化一个单链表。 2、编写实现相关功能函数,完成子函数模块。 3、调用子函数,实现菜单调用功能,完成顺序表的相关操作。

五、代码: #include #include typedef char datatype; typedef struct node { datatype data; struct node *next; }linklist; linklist *head,*p; //头插法建立单链表 linklist *Creatlistf() { char ch; linklist *head,*s; head=NULL; ch=getchar(); printf("请输入顺序表元素(数据以$结束):\n"); while(ch!='$') { s=(linklist *)malloc(sizeof(linklist)); s->data=ch; s->next=head; head=s; ch=getchar(); } return head; } //求单链表的长度 void get_length(struct node *head) { struct node *p=head->next; int length=0;

单链表基本操作实验

实验2 链表的操作 实验容: 1)基础题:编写链表基本操作函数,链表带有头结点 (1)CreatList_h()//用头插法建立链表 (2)CreateList_t()//用尾插法建立链表 (3)InsertList()向链表的指定位置插入元素 (4)DeleteList()删除链表中指定元素值 (5)FindList()查找链表中的元素 (6)OutputList()输出链表中元素 2)提高题: (1)将一个头节点指针为heada的单链表A分解成两个单链表A和B,其头结点指针分别为heada和headb,使得A表中含有原单链表A中序号为奇数的元素,B表中含有原链表A中序号为偶数的元素,且保持原来的相对顺序。 (2)将一个单链表就地逆置。 即原表(a1,a2,。。。。。。 an),逆置后新表(an,an-1,。。。。。。。a1) /* 程序功能 :单链表基本功能操作 编程者 :天啸 日期 :2016-04-14 版本号 :3.0 */ #include #include typedef struct List { int data; struct List *next; }List; void CreatList_h(List *L) //头插法 { int i = 0; int n = 0; int goal; List *p; printf("请输入数据的个数:\n"); scanf("%d",&n); L -> next = NULL; for(i=0;i

{ printf("请输入第%d个数:\n",i+1); scanf("%d",&goal); p = (struct List*)malloc(sizeof(struct List)); p -> data = goal; p -> next = L->next; //将L指向的地址赋值给p; L -> next = p; } } void CreateList_t(List *L) //尾插法 { int i; int n; int goal; List *p; List *q=L; printf("请输入数据的个数:\n"); scanf("%d",&n); for (i=0;i data = goal; q -> next = p; q = p; } q -> next = NULL; } void InsList(List *L,int i,int e) //插入 { List *s; List *p = L; int j = 0; while (p&&jnext; ++j; } s = (struct List*)malloc(sizeof(struct List)); s -> data = e; //插入L中

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

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

排列组合 插板法 插空法 捆绑法

排列组合问题——插板法(分组)、插空法(不相邻)、捆绑法(相邻) 插板法(m为空的数量) 【基本题型】 有n个相同的元素,要求分到不同的m组中,且每组至少有一个元素,问有多少种分法? 图中“”表示相同的名额,“”表示名额间形成的空隙,设想在这几个空隙中插入六块“挡板”,则将这10 个名额分割成七个部分,将第一、二、三、……七个部分所包含的名额数分给第一、二、三……七所学校,则“挡板”的一种插法恰好对应了10 个名额的一种分配方法,反之,名额的一种分配方法也决定了档板的一种插法,即挡板的插法种数与名额的分配方法种数是相等的, 【总结】 需满足条件:n个相同元素,不同个m组,每组至少有一个元素,则只需在n个元素的n-1个间隙中放置m-1块隔板把它隔成m份即可,共有种不同方法。 注意:这样对于很多的问题,是不能直接利用插板法解题的。但,可以通过一定的转变,将其变成符合上面3个条件的问题,这样就可以利用插板法解决,并且常常会产生意想不到的效果。 插板法就是在n个元素间的(n-1)个空中插入若干个(b)个板,可以把n 个元素分成(b+1)组的方法. 应用插板法必须满足三个条件:

(1)这n个元素必须互不相异? (2)所分成的每一组至少分得一个元素? (3) 分成的组别彼此相异? 举个很普通的例子来说明? 把10个相同的小球放入3个不同的箱子,每个箱子至少一个,问有几种情况? 问题的题干满足条件(1)(2),适用插板法,c9 2=36? 下面通过几道题目介绍下插板法的应用? e 二次插板法? 例8 :在一张节目单中原有6个节目,若保持这些节目相对次序不变,再添加3个节目,共有几种情况? -o - o - o - o - o - o - 三个节目abc? 可以用一个节目去插7个空位,再用第二个节目去插8个空位,用最后个节目去插9个空位? 所以一共是c7 1×c8 1×c9 1=504种 【基本解题思路】 将n个相同的元素排成一行,n个元素之间出现了(n-1)个空档,现在我们用(m-1)个“档板”插入(n-1)个空档中,就把n个元素隔成有序的m份,每个组依次按组序号分到对应位置的几个元素(可能是1个、2个、3个、4

单链表的插入和删除实验报告

. 实验一、单链表的插入和删除 一、目的 了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。 二、要求: 建立一个数据域定义为字符串的单链表,在链表中不允许有重复的字符串;根据输入的字符串,先找到相应的结点,后删除之。 三、程序源代码 #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(); //函数,按值查找结点 void DeleteList(); //函数,删除指定值的结点void printlist(); //函数,打印链表中的所有值 void DeleteAll(); //函数,删除所有结点,释放内存 //==========主函数============== void main() { char ch[10],num[10]; LinkList head; head=CreatListR1(); //用尾插入法建立单链表,返回头指针printlist(head); //遍历链表输出其值 printf(" Delete node (y/n):");//输入“y”或“n”去选择是否删除结点scanf("%s",num); if(strcmp(num,"y")==0 || strcmp(num,"Y")==0){ printf("Please input Delete_data:"); scanf("%s",ch); //输入要删除的字符串 DeleteList(head,ch); printlist(head); } DeleteAll(head); //删除所有结点,释放内存 } //==========用尾插入法建立带头结点的单链表

单链表完整算法

// 包含头文件 #include #include #include // 为结点数据类型和结构体类型起别名 typedefint datatype; typedefstructLinkNode { datatype data; // 数据域 structLinkNode *next; // 指针域存放下一个结点的地址}LNode,*LinkList; LinkList L; // 单链表的头指针 // 1.用头插法创建单链表 LinkListCreateListHead(int n) { // 创建头结点 LNode *L = (LNode *)malloc(sizeof(LNode)); L->next = NULL; // 设置指针域为空

LinkList p; // p指向新结点 for(inti=n;i>0;i--) // 先插入最后一个结点,插入次序与逻辑次序相反 { // 生成新结点 p = (LNode *)malloc(sizeof(LNode)); // 从键盘输入新结点的值 printf("请输入要插入第%d结点的值:\n",i); scanf("%d", &p->data); p->next = L->next; // 让L原来的后继结点成为p的后继结点 L->next = p; // p成为L新的后继结点 } return L; // 返回单链表的头指针 } // 2.用尾插法创建单链表 LinkListCreateListTail(int n) {

// 生成头结点 L = (LNode *)malloc(sizeof(LNode)); L->next = NULL;// 设置指针域为空 // p指向新结点,q指向尾结点 LinkList p, q = L; // 依次在末尾插入n个结点 for(inti=1;i<=n;i++) { // 生成新结点p p = (LNode *)malloc(sizeof(LNode)); // 从键盘输入新结点的值 printf("请输入第%d个结点的值:\n", i); scanf("%d",&p->data); p ->next = NULL; // 新结点(也是尾结点)的指针域为空 // 把新结点链接到单链表的末尾 q->next = p;

单链表插入新元素

数据结构作业: 计科1301 张睿算法目的:实现在一个线性单链表中插入一个新的元素 设计思路:构建一个线性单链表,获得头指针。输入想要插入新元素的位置,和想要插入的元素。通过头指针找到相应位置,插入元素,输出插入了新元素的链表。 设计方案: 1、单链表的类型定义: typedef int ElemType; typedef int Status; typedef struct LNode{ ElemType data; struct LNode *next; }LNode,*LinkList; 2、构建单链表: void creatlist(LinkList &L) { int x,k; LinkList p; printf("输入想要插入的链表的长度:\n"); scanf("%d",&x); L=(LinkList)malloc(sizeof(LNode));

L->next=NULL; printf("输入%d个元素:",x); for(k=x;k>0;--k) { p=(LinkList)malloc(sizeof(LNode)); scanf("%d",&p->data); p->next=L->next; L->next=p; } } 3、插入新元素: Status ListINsert_L(LinkList &L,int i,ElemType &e) {LinkList p,s; p=L; int j=0; while(p&&jnext;++j;} if(!p||j>i-1) 若没有第i个元素则输出错误 return ERROR; s=(LinkList)malloc(sizeof(LNode)); s->data=e;s->next=p->next;

创建链表并实现插入、删除、输出,查找等功能

创建链表并实现插入、删除、输出,查找等功能 一、实验目的及内容 1、目的:通过上级操作,进一步了解线性表的存储结构以及基本运算。 2、内容: (1)、题目要求 编写程序,创建一个链表,实现链表的插、删除、查找和输出等功能。(2)、分析算法 单链表的建立,使用动态建立链表,有头插法建表和尾插法建表。 头插法建表: input_font() { head=NULL; datatype ch; puts("请输入您的数据,想结束输入,请键入“#”"); fflush(stdin); ch=getchar(); while(ch!='#') { p=(linklist *)malloc(sizeof(linklist)); p->c=ch; p->next=head; head=p; length++; puts("恭喜,你的数据输入正确!请继续操作!"); fflush(stdin); ch=getchar(); }

尾插法建表: input_end() { head=(linklist *)malloc(sizeof(linklist)); r=head; datatype ch; puts("请输入您的数据,想结束输入,请键入“#”"); fflush(stdin); ch=getchar(); while(ch!='#') { p=(linklist *)malloc(sizeof(linklist)); p->c=ch; r->next=p; r=p; length++; puts("恭喜,你的数据输入正确!请继续操作!"); fflush(stdin); ch=getchar(); } r->next=NULL; } (3)、流程图: 函数层次:

头插法与尾插法

#include #include typedef char DataType; //假设节点的数据类型为字符 typedef struct node{ //节点类型定义 DataType data; //节点的数据域 struct node *next; //节点的指针域 }ListNode; typedef ListNode* LinkList; ListNode *p; //指向某一节点的指针LinkList head; //单链表的头指针 //头插法 LinkList createListF(void); LinkList createListF(void){ //返回单链表的头指针 char ch; LinkList head; //头指针 ListNode *s; //工作指针 head = NULL; //链表开始为空

while (ch != '\n') { s = (ListNode*)malloc(sizeof(ListNode)); //生成新节点 s->data = ch; //将读入的数据放入新节点的数据域中 s->next = head; head = s; ch = getchar(); //读入下一个字符} return head; } //尾插法 LinkList createListR(void); LinkList createListR(void){ //返回头指针 char ch; LinkList head; //头指针 ListNode *s,*r; //工作指针 head = NULL; //链表开始为空 r = NULL; //尾指针初始值为空

单链表的插入和删除实验报告

单链表的插入和删除实验报告 一、目的: 了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。 二、要求: 建立一个数据域定义为字符串的单链表,在链表中不允许有重复的字符串;根据输入的字符串,先找到相应的结点,后删除之。 三、实验内容: 1、分析、理解程序。

程序的主要功能是实现对数据域为字符串的单链表的建立、查找、删除、插入和浏览。 其中链表的建立为头插入法。 链表建立示意图: (a)、删除hat: (b)、插入charu: 2、修改程序: 1)增加插入结点的功能。 如在jat后插入charu,程序运行结果为:

2)将建立链表的方法改为头插入法。 程序源代码: ===================main.cpp===================== #include #include #include #include #include "linkList.h" void main() { char ch[10],num[10],ch1[10];

LinkList L; L=CreateList(); //用尾插入法建立单链表,返回头指针 PrintList(L); //遍历链表输出其值 printf(" Delete node (y/n):"); //输入"y"或"n"去选择是否删除结点 scanf("%s",num); if(strcmp(num,"y")==0 || strcmp(num,"Y")==0) { printf("Please input Delete_data:"); scanf("%s",ch); //输入要删除的字符串 DeleteList(L,ch); PrintList(L); } printf("the position after:"); scanf("%s",ch1); InsertList(L,ch1); PrintList(L); FreeAll(L); //删除所有结点,释放内存 } ===================linkList.cpp===================== #include "linkList.h" #include #include #include #include //==========用尾插入法建立带头结点的单链表============ LinkList CreateList()

数据结构头插法和尾插法建立单链表

#include #include typedef struct node { int data; struct node *next; }*Listlink; /*前插法创建单链表*/ void qian_create(Listlink *head,int n) { int i; Listlink p; *head=(Listlink )malloc(sizeof(struct node)); (*head)->next=NULL;/*建立头结点*/ printf("input %d numbers:\n",n); for(i=0;idata)); p->next=(*head)->next; (*head)->next=p; } } /*后插法创建单链表*/ void hou_create(Listlink *head,int n) { int i; Listlink p,q; *head=(Listlink )malloc(sizeof(struct node)); (*head)->next=NULL;/*建立头结点*/ q=*head; for(i=0;idata)); p->next=q->next; q->next=p; q=p; } }

void print_list(Listlink head) { Listlink p; p=head->next; while(p!=NULL) { printf(" %d",p->data); p=p->next; } } main() { Listlink la,lb,lc; puts("houcha:"); hou_create(&lb,10); puts("qiancha:"); qian_create(&la,10); print_list(la); print_list(lb); getchar(); }

头插法和尾插法建立单链表

#include "stdio.h" #include "stdlib.h" typedef struct List { int data; struct List *next; //指针域 }List; void HeadCreatList (List *L) //头插法建立链表 { List *s; L->next=NULL; for (int i=0;i<10;i++) { s=(struct List*)malloc(sizeof(struct List)); s->data=i; s->next=L->next; //将L指向的地址赋值给S; L->next=s; } } void TailCreatList(List *L) //尾插法建立链表 { List *s,*r; r=L;

for (int i=0;i<10;i++) { s=(struct List*)malloc(sizeof(struct List)); s->data=i; r->next=s; r=s; } r->next=NULL; } void DisPlay(List *L) { List *p=L->next; while(p!=NULL) { printf ("%d ",p->data); p=p->next; } printf("\n"); } int main () {

List *L1,*L2; L1=(struct List*)malloc(sizeof(struct List)); L2=(struct List*)malloc(sizeof(struct List)); HeadCreatList(L1); DisPlay(L1); TailCreatList(L2); DisPlay(L2); } //头插法创建链表 #include #include struct node { int data; struct node * next; }; //建立只含头结点的空链表 struct node * create_list() { struct node * head = NULL; head = (struct node *)malloc(sizeof(struct node)); if (NULL == head)

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