单链表原地逆置(头插法)

单链表原地逆置(头插法)
单链表原地逆置(头插法)

原地逆置单链表(头插法)

/*

原地逆置头插法伪算法

本函数使用的是带头节点的链表

1.将p指针指向有效数据的第二个节点

2.将p指针始终插入到phead后面,第一个有效节点前面,即插入到它俩中间位置,不论第一个有效节点是否被更改,这样就可以完全逆置单链表

3.p和q指针后移,直至移动到最后一个节点,完成插入操作

*/

#include

#include

#include

typedefstruct node

{

int data;

struct node * next;

}NODE,*PNODE;

PNODE create_list(); //创建单链表函数声明

void traverse_list(PNODE phead); //输出单链表函数声明

PNODE reverse_list(PNODE phead); //逆置单链表函数声明

int main(void)

{

PNODE phead;

phead = create_list();

traverse_list(phead);

phead = reverse_list(phead);

traverse_list(phead);

return 0;

}

PNODE create_list()

{

intval;

PNODE phead,ptail,s;

phead = (PNODE)malloc(sizeof(NODE));

if(phead == NULL)

{

printf("分配失败,程序终止\n");

exit(-1);

}

ptail=phead;

printf("请输入每个节点的值,以-1结束\n");

scanf("%d",&val);

while(val!=-1)

{

s=(PNODE)malloc(sizeof(NODE)); //新建一个节点

if(s == NULL)

{

printf("分配失败,程序终止\n");

exit(-1);

}

s->data = val;

//s->next = NULL;

ptail->next = s; //链接到节点后面

ptail = ptail->next; //使ptail永远指向最后一个节点

scanf("%d",&val);

}

ptail->next = NULL;

printf("创建成功!\n");

returnphead;

}

voidtraverse_list(PNODE phead)

{

PNODE p;

if(phead == NULL)

{

printf("链表为空,请创建链表!\n");

}

else

{

p = phead->next;

printf("依次输出链表的值为:\n");

while(p!=NULL)

{

printf("%d\t",p->data); //依次输出链表的值

p = p->next;

}

}

printf("\n");

}

PNODE reverse_list(PNODE phead) //头插法,第一个有效节点不需要移动{

PNODE p=NULL,q=NULL;

//p = (PNODE)malloc(sizeof(NODE));

//q = (PNODE)malloc(sizeof(NODE));

p = phead->next->next; //将p指向有效数据的第二个节点,第一个节点不需要插

q = p->next; //q指向p后面的节点,防止后面的节点丢失phead->next->next = NULL; //把第一个节点的指针域置为空,因为逆置结束后此节点将会是最后一个节点

while(p != NULL)

{

p->next = phead->next;

phead->next = p; //前两步将p指向的节点插入到头节点的后面

p = q; //p向后移

if(q != NULL)

{

q = q->next; //如果q不为空,q也继续后移,直到完成所有的头插操作

}

//system("PAUSE");

}

returnphead;

}

程序执行结果:

头插法建立单链表

#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"); }

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

倒置单链表的算法

倒置单链表的算法 void pur_LinkList(LinkList H) { LNode *p,*q,*r; p=H->next; /*p指向第一个结点*/ if(p==NULL) return; while (p->next) { q=p; while (q->next) /* 从*p的后继开始找重复结点*/ { if (q->next->data==p->data) { r=q->next; /*找到重复结点,用r指向,删除*r */ q->next=r->next; free(r); } /*if*/ else q=q->next; } /*while(q->next)*/ p=p->next; /*p指向下一个,继续*/ } /*while(p->next)*/ } ―――――――――――――――――――――――――――――――――――――status LinkListReverse(LinkList L) /*对单链表中的元素倒置*/ { int a[N] ,i=0,count=0; LinkList Lb; Node *p,*q; p=L->next; while(p!=NULL) { a[i++]=p->data; p=p->next; count++; } ―――――――――――――――――――――――――――――――― 2.21 void reverse(SqList &A)//顺序表的就地逆置 { for(i=1,j=A.length;iA.elem[j]; }//reverse 2.22 void LinkList_reverse(Linklist &L)//链表的就地逆置;为简化算法,假设表长大于2 {

单链表的基本操作

上机实验报告 学院:计算机与信息技术学院 专业:计算机科学与技术(师范)课程名称:数据结构 实验题目:单链表建立及操作 班级序号:师范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;

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

#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);

单链表基本操作实验

实验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中

单链表原地逆置(头插法)

原地逆置单链表(头插法) /* 原地逆置头插法伪算法 本函数使用的是带头节点的链表 1.将p指针指向有效数据的第二个节点 2.将p指针始终插入到phead后面,第一个有效节点前面,即插入到它俩中间位置,不论第一个有效节点是否被更改,这样就可以完全逆置单链表 3.p和q指针后移,直至移动到最后一个节点,完成插入操作 */ #include #include #include typedefstruct node { int data; struct node * next; }NODE,*PNODE; PNODE create_list(); //创建单链表函数声明 void traverse_list(PNODE phead); //输出单链表函数声明 PNODE reverse_list(PNODE phead); //逆置单链表函数声明 int main(void) { PNODE phead; phead = create_list(); traverse_list(phead); phead = reverse_list(phead); traverse_list(phead); return 0; }

PNODE create_list() { intval; PNODE phead,ptail,s; phead = (PNODE)malloc(sizeof(NODE)); if(phead == NULL) { printf("分配失败,程序终止\n"); exit(-1); } ptail=phead; printf("请输入每个节点的值,以-1结束\n"); scanf("%d",&val); while(val!=-1) { s=(PNODE)malloc(sizeof(NODE)); //新建一个节点 if(s == NULL) { printf("分配失败,程序终止\n"); exit(-1); } s->data = val; //s->next = NULL; ptail->next = s; //链接到节点后面 ptail = ptail->next; //使ptail永远指向最后一个节点 scanf("%d",&val); } ptail->next = NULL; printf("创建成功!\n"); returnphead; } voidtraverse_list(PNODE phead) { PNODE p; if(phead == NULL) { printf("链表为空,请创建链表!\n"); } else { p = phead->next;

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

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

数据结构C语言版顺序表和单链表的逆置

数据结构C语言版顺序表和单链表的逆置 公司标准化编码 [QQX96QT-XQQB89Q8-NQQJ6Q8-MQM9N]

实验1-1 顺序表的逆置操作 程序原码 #include<> // 创建顺序表,确定元素个数,插入各个元素,逆置列表。#include<> #include<> #define max_list_size 100 //定义给顺序表分配空间大小 typedef struct{ int *elem; int length; }list_node; //指向顺序表首地址的结构体单元 list_node L; //这里使用了全局变量,在所有的函数里可以随意修改其值int list[max_list_size]; void init(); // 初始化操作 void inversion(); // 倒置部分

void creat(); // 建表部分 void display(); // 显示部分 //*************主函数****************** int main() { init(); creat(); printf("\n您输入的顺序表的结点数: \n"); display(); inversion(); printf("\n倒置顺序表的结点数: \n"); display(); } //*************初始化操作分配空间******************

void init() { = (int *) malloc (max_list_size * sizeof(int) ); if (! { printf("顺序表已满"); exit(-1); } = 0; } //*************以下为建表部分****************** void creat(){ int a, b, i; printf("请输入顺序表的结点数: "); scanf("%d", &a); if(a<=0){

单链表完整算法

// 包含头文件 #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;

单链表算法

1.已知非空带表头结点的线性链表由list指出,链结点的结构为(data,next), 请写一算法,将链表中数据域值最小的那个链结点移到链表的最前面。要求:不得额外申请新的链结点。 delinsert(LinkList list) { p=list->next; //工作指针 pre=list; //最小元素结点前驱 q=p; //最小元素结点 while(p->next!=NULL) { if(p->next->datadata) { q=p->next; pre=p; } p=p->next; } //查找最小元素结点 if(q!=list->next) //最小元素结点不是第一个结点 { pre->next=q->next; //从原位置删除 q->next=list->next; list->next=q; //在头结点后插入,使最小元素结点成为第一个结点} } 2.在带头结点的单链表中,设计算法dellist_maxmin,删除所有数据域大于 min,而小于max的所有元素。 dellist_maxmin(linklist*head,int min,int max) { pre=head; //工作指针前驱 p=head->next; //工作指针 while(p!=NULL) if (p->data<=min || p->data>=max) //不满足删除条件 { pre=p; p=p->next; } else //满足删除条件 { pre->next=p->next; free(p); p=pre->next; //删除 } } 3.编写一个将带头结点单链表逆置的算法。 void reverse_list(linklist head)

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

创建链表并实现插入、删除、输出,查找等功能 一、实验目的及内容 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)、流程图: 函数层次:

数据结构单链表、双链表的逆置算法

数据结构与算法 的课程设计 课程设计题目:数据结构的逆置算法 院系名称:信息技术学院 专业(班级):计算机2班 姓名: 学号: 指导教师:

实验内容:分别用一维数组,单链表,双链表实现逆置 (一)使用一维数组实现逆置 1.需求分析:定义一个一维数组(整型),用for语句实现循环,给数组元素赋值,并将 数组元素逆序输出。 2.详细设计: main() { int a[3],i; /*定义元素个数为3的一维数组*/ for(i=0;i<3;i++) scanf("%d",&a[i]); for(i=2;i>=0;i--) printf("%d ",a[i]); getch(); } 3.运行及调试: 4.附录: #include void main() { int a[3],i; /*定义一维数组*/ for(i=0;i<3;i++) scanf("%d",&a[i]); for(i=2;i>=0;i--) printf("%d ",a[i]); getch(); } (二)单链表实现逆置 1.需求分析:创建一个单链表并实现逆序输出 2.详细设计:定义的所有数据类型,对每个操作写出伪码算法;对主程序和其他模块也都写出伪码算法。 (1)单链表的定义 typedef struct node

{ int data;/*数据域为整型*/ struct node* next; /*定义结点的指针域*/ }LinkList;/*数据结点*/ (2)头插法建立单链表 Tnode *CreatList() { Tnode *head; /*头指针*/ LinkList *p;/*工作指针/ int ip; head=(Tnode *)malloc(sizeof(Tnode)); head->next=NULL;/*链表开始为空*/ printf("please input the number:\n"); scanf("%d",&ip); /*向链表中添加元素*/ while(ip!=000) { p=(LinkList *)malloc(sizeof(LinkList));/*生成新结点*/ p->data=ip; /*将值赋给新生结点*/ p->next=head->next; head->next=p; scanf("%d",&ip); } if(ip==000) /*当输入的数值为000时结束*/ printf("\nthe ip is end!\n\n"); return head; } (3)读取链表中的数据 void ReadList(Tnode *head) { LinkList *p; p=head->next; while(p) { printf("%d ",p->data); p=p->next; } printf("\n"); } (4)链表的倒置 void ExchangeList(Tnode *head) { LinkList *r,*s; r=head->next; head->next=NULL; while(r) { s=r->next; r->next=head->next; head->next=r; r=s;

单链表的定义及其基本操作技巧

单链表的定义及基本操作 一、实验目的、意义 (1)理解线性表中带头结点单链表的定义和逻辑图表示方法。 (2)熟练掌握单链表的插入,删除和查询算法的设计与实现。 (3)根据具体问题的需要,设计出合理的表示数据的链表结构,并设计相关算法。 二、实验内容及要求 说明1:本次实验中的链表结构均为带头结点的单链表。 说明2: 学生在上机实验时,需要自己设计出所涉及到的函数,同时设计多组输入数据并编写主程序分别调用这些函数,调试程序并对相应的输出作出分析;修改输入数据,预期输出并验证输出的结果,加深对有关算法的理解。 具体要求: 建立单链表,完成链表(带表头结点)的基本操作:建立链表、插入、删除、查找、输出;其它基本操作还有销毁链表、将链表置为空表、求链表的长度、获取某位置结点的内容、搜索结点。 三、实验所涉及的知识点 数据结构、C语言语法函数、结构体类型指针、单链表(建表、初始化链表、求表长、插入、删除、查询算法)等。 四、实验结果及分析 (所输入的数据及相应的运行结果,运行结果要有提示信息,运行结果采用截图方式给出。)

五、总结与体会 (调试程序的心得与体会,若实验课上未完成调试,要认真找出错误并分析原因等。) 调试程序时,出现了许多错误。如:结构体类型指针出错,忽略了释放存储空间,对头插法建表、尾插法建表不熟悉等。另外还有一些语法上的错误。由于对所学知识点概念模糊,试验课上未能完成此次上机作业。后来经过查阅教材,浏览网页等方式,才完成试验。这次试验出现错误最重要的原因就是对课本知识点理解不深刻以及编写代码时的粗心。以后要都去练习、实践,以完善自己的不足。 六、程序清单(包含注释) //单链表

头插法与尾插法

#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; //尾指针初始值为空

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

#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(); }

单链表实验报告

数据结构 课程设计 设计题目:单链表 专业班级:11软会四班 指导教师:吉宝玉 日期:2012 目录 一、实验目的 (2) 1、 (2) 2、 (2) 二、实验内容 (3)

三、实验基本要求(软、硬件) (3) 四、算法设计思想 (3) 1、 (3) 2、 (3) 3、 (3) 4、 (3) 5、 (3) 6、 (3) 7、 (3) 8、 (3) 五、算法流程图 (4) 六、算法源代码 (4) 七、运行结果 (9) 1、 (9) 2、 (10) 3、 (11) 4、 (11) 5、 (11) 6、 (12) 7、 (12) 8、 (13) 9、 (13) 八、收获及体会 (14) 一、实验目的 1、理解并掌握单链表的结构特点和相关概念; 2、学会单链表的基本操作:建立、插入、删除、查找、 输入、撤销、逆置、求前驱和后继等并实现其算法。

二、实验内容 利用头插建立一个带头结点的单链表,并用算法实现该单链表的插入、删除查找、输出、求前驱和后继、再把此单链表逆置,然后在屏幕上显示每次操作的结果当所有操作完成后能撤销该单链表。 三、实验基本要求(软、硬件) 用VC++6.0软件平台,操作系统:Windows XP 硬件:内存要求:内存大小在256MB,其他配置一般就行。 四、算法设计思想 1、定义一个创建链表的函数,通过该函数可以创建一个链表,并为下面的函数应用做 好准备。 2、定义输出链表的算法,通过对第一步已经定义好的创建链表函数的调用,在这一步 通过调用输出链表的函数算法来实现对链表的输出操作。 3、定义一个遍历查找的算法,通过此算法可以查找到链表中的每一个节点是否存在。 4、定义查找链表的每一个前驱和后继,通过定义这个算法,可以很容易的实现对链表 的前驱和后继的查找工作。 5、定义插入节点的算法,通过定义这个算法,并结合这查找前驱和后继的算法便可以 在连链表的任意位置进行插入一个新节点。 6、定义删除节点的操作,这个算法用于对链表中某个多余节点的删除工作。 7、定义一个逆置单链表的操作,通过定义这个算法,可以逆置输出单链表。 8、定义一个撤销链表的算法,这个算法用于删除单链表中的所有节点,使链表为空。

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

#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)

带头结点单链表中数据就地逆置

实验3 :带头结点单链表中数据就地逆置 一、实验目的: 1. 会定义单链表的结点类型; 2. 熟悉对单链表的一些基本操作和具体的函数定义; 3. 了解和掌握单链表的调用格式。 二、实验要求: 1. 认真阅读和掌握实验内容所给的程序,并上机运行; 2. 保存程序运行结果,并结合程序进行分析; 3. 尝试自己调试修改程序并试运行。 三、实验内容: 编写算法实现带头结点单链表的就地逆置,即利用原带头结点单链表的结点空间把数据元素序列逆置。 四、实验程序: #include #include #include typedef int datatype; typedef struct snode { datatype data; struct snode*next; }slnode; sllinitiate(slnode**head); linlistsort(slnode*head); int sllinsert(slnode*head,int i,datatype x); int slldelete(slnode*head,int i,datatype x); int sllget(slnode*head,int i,datatype*x); int sllnotempty(slnode*head); linlistsurt(slnode*head); linlistinsert(slnode*head,datatype x);

converse(slnode*head); main(void) { datatype test[6]={64,6,7,89,12,24}; slnode*head,*p; int n=6,i; sllinitiate(&head); for(i=1;i<=n;i++) sllinsert(head,i,test[i-1]); linlistsort(head); linlistinsert(head,25); converse(head); p=head->next; while(p!=NULL) { printf("%d",p->data); p=p->next; } } sllinitiate(slnode**head) { if((*head=(slnode*)malloc(sizeof(slnode)))==NULL)exit(1); (*head)->next=NULL; } int sllinsert(slnode*head,int i,datatype x) { slnode*p,*q; int j;

单链表实验

实验1 单链表 专业班级学号姓名报告日期 实验类型:●验证性实验○综合性实验○设计性实验 一、实验目的或任务 通过指导学生上机实践,对常用数据结构的基本概念及其不同的实现方法的理论得到进一步的掌握,并对在不同存储结构上实现不同的运算方式和技巧有所体会。 二、实验教学基本要求 1.了解实验目的及实验原理; 2.编写程序,并附上程序代码和结果图; 3.总结在编程过程中遇到的问题、解决办法和收获。 三、实验教学的内容或要求 1.编写函数,实现随机产生或键盘输入一组元素,建立一个带头结点的单链表(无序) 2.编写函数,实现遍历单链表 3.编写函数,实现把单向链表中元素逆置 4.编写函数,建立一个非递减有序单链表 5.编写函数,利用以上算法,建立两个非递减有序单链表,然后合并成一个非递减链表。 6.编写函数,在非递减有序单链表中插入一个元素使链表仍然有序 7.编写函数,实现在非递减有序链表中删除值为x的结点 8.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法 四、实验总结

1.主菜单 2.编写函数,实现随机产生或键盘输入一组元素,建立一个带头结点的单链表(无序) 3.编写函数,实现遍历单链表 4.编写函数,实现把单向链表中元素逆置 5.编写函数,建立一个非递减有序单链表 6.编写函数,利用以上算法,建立两个非递减有序单链表,然后合并成一个非递减链表。

7.编写函数,在非递减有序单链表中插入一个元素使链表仍然有序。 8.编写函数,实现在非递减有序链表中删除值为x的结点 9.退出程序 实验总结: 1.调试时出现的问题及解决的方法 在编写按值查找函数时,由于没有处理好指针类型的原因,导致指针无法正常返回,

相关文档
最新文档