数据结构8581线性链表逆置

合集下载

c语言链表逆序的问题

c语言链表逆序的问题

c语⾔链表逆序的问题去⾯试被问到⼀个问题,怎么把⼀个链表反转(⽤原链表),⾃⼰在⽹上找了到了⼀篇⽂章,/sicofield/article/details/8850269,原作者给出了三种⽅法,⽅法⼀:将链表数据全部读到数组中,然后在倒序输出。

⽅法⼆:就是我下⾯要讲的。

⽅法三:从第⼆个结点开始,把之后的每个结点都插⼊到第⼀个结点之后,最后在把第⼀个结点挪到表尾。

第⼆种⽅法的思路是:从第⼆个结点开始,记录它的下个结点,把它挪到第⼀个结点之前,成为新表头,然后下个结点继续这个过程。

1struct stu *reserve(struct stu *head)2 {3struct stu *p1,*p2,*p3; 4 p1=head;5 p2=p1->next; // 这个结点为要移动的结点6while(p2)7 {8 p3=p2->next; //记录的为要移动的结点的下⼀个结点9 p2->next=p1; //移动结点到最前10 p1=p2; //移动的结点变为新表头11 p2=p3; //下个结点变为要移动的结点12 }13 head->next=NULL; //移动完毕后head变为表尾,让它指向为空14 head=p1; 15return head;16 }⽅法三的贴下原作者的代码加上⾃⼰的思路:1struct stu *reserve(struct stu *head)2 {3struct stu *p,*q;4 p=head->next; //记录第⼆个结点5while(p->next!=NULL)6 {7 q=p->next; //记录要移动的结点8 p->next=q->next; //把该结点从原链表中移除9 q->next=head->next; //把该结点连接到head之后10 head->next=q;11 }12 p->next=head; //把head移动到新表尾,此时链表成环13 head=p->next->next; //找到移动完之后的新head14 p->next->next=NULL; //断开环15return head;1617 }。

C语言链表逆序的方法

C语言链表逆序的方法

个指针指向断开处的一前一后。 上面两个程序都是这样,不同在于指针移动的位置。 希望大家学我们为大家收集整理了关于 C 语言链表逆序,以方便大家参考。将一个 链表逆序并输出。我用了两种方法来实现,第一种是借助了一个新的空链 表;第二种是在原来链表的基础上直接实现逆序。 简洁的做法是 遍历链表, 元素进栈, 遍历的同时销毁原来的链表。 元素出栈, 建立新链表。 高效的是, 用指向链表结点指针的指针操作 直接首尾交换指针值(两两进行) 一般的是前插法 实际上根本就不用插入,一次遍历就可以完成了。 链表的逆序,必将涉及到两个以上指针,一般用三个指针, 下面是一个人的程序: struct List1 *reverse(List1 *h) //h 为链表的头指针 { struct List1 *p,*v1,*v2; v2=h; v1=NULL; while( v2!=NULL ){
p=v2->;pNext; v2->;pNext=v1; v1=v2; v2=p; } return v1; } 另一个人的: struct IntNode* res(struct IntNode* h) { struct IntNode *s, *s1; s = h; h = NULL; while (s) { s1 = s; s = s->;next; s1->;next = h; h = s1; } return h; } 算法都是一致,但顺序不一样,这直接点明了链表操作的核心——顺序, 链表的算法主要难在顺序上。 逆序操作中,要将一个指针指向前一个节点,中间必然断开,这就需要两

c语言编程acm链表的逆置

c语言编程acm链表的逆置

标题:C语言编程ACM:链表的逆置一、概述ACM(Advanced Computing Machinery)竞赛是计算机科学领域最负盛名的竞赛之一,要在ACM竞赛中获得优异的成绩,熟练掌握C 语言编程技术是必不可少的。

本文将讨论C语言编程中常见的ACM题目之一:链表的逆置。

二、链表的基本概念1.链表的定义链表是一种线性表的物理存储单位,由一个个节点组成,每个节点包含数据元素和下一个节点的指针。

链表中的数据元素可以是任意类型。

2.链表的基本操作在C语言中,链表的基本操作包括插入节点、删除节点、查找节点等。

而链表的逆置就是将链表中的节点顺序颠倒。

三、链表的逆置方法在C语言中,链表的逆置可以采用多种方法实现。

1.迭代法迭代法是最直接的方法,具体步骤如下:(1)初始化三个指针,分别指向当前节点、前一节点、后一节点。

(2)遍历链表,将当前节点的指针指向前一节点。

(3)更新前一节点和当前节点的位置。

(4)遍历结束后,前一节点指向NULL,表示逆置完成。

2.递归法递归法是一种更为巧妙的方法,具体步骤如下:(1)递归遍历链表,直至到达链表尾部。

(2)从链表尾部开始,逐一修改每个节点的指针指向。

(3)递归结束后,链表即被逆置。

四、链表逆置的C语言实现以下是链表逆置的C语言实现代码,以迭代法为例:```ctypedef struct Node {int data;struct Node* next;} Node;Node* reverseList(Node* head) {Node *prev = NULL, *curr = head, *next = NULL; while (curr) {next = curr->next;curr->next = prev;prev = curr;curr = next;}return prev;}```五、实例分析假设有一个链表的头指针为head,包含数据元素1、2、3、4、5。

编写算法:实现带头结点单链表的逆置算法

编写算法:实现带头结点单链表的逆置算法

编写算法:实现带头结点单链表的逆置算法标题:探讨带头结点单链表的逆置算法实现及其应用在计算机科学和算法领域,链表是一种非常重要的数据结构,它能够以一种灵活的方式存储和组织数据。

在链表的操作中,逆置算法是一种常见且有用的操作,它能够将链表的顺序颠倒,为问题的解决提供便利。

本文将从简到繁,由浅入深地探讨带头结点单链表的逆置算法的实现及其应用。

1. 带头结点单链表的定义和特点带头结点单链表是一种特殊的链表结构,它在链表的头部增加了一个额外的结点,这个结点并不存储实际的数据,而是作为头结点来方便链表的操作。

带头结点单链表的特点是可以方便地插入和删除操作,同时也更容易处理空链表的情况。

2. 逆置算法的基本思路在带头结点单链表中,逆置算法的基本思路是从链表的第一个结点开始,依次改变每个结点的指针指向,将整个链表的方向颠倒过来。

在实现逆置算法时,需要注意处理好结点指针的指向关系,以免出现指针丢失或者内存泄露的情况。

3. 逆置算法的具体实现(1)需要判断链表是否为空或只有一个结点,如果是的话,则无需进行逆置操作。

(2)使用三个指针分别表示当前结点、前驱结点和后继结点,通过改变指针的指向来逆置链表。

(3)循环迭代链表,直到当前结点为空,完成链表的逆置操作。

4. 逆置算法的应用带头结点单链表的逆置算法在实际应用中有着广泛的使用场景,例如在字符串操作、图论算法、树算法等方面都能够发挥重要作用。

通过逆置算法,可以方便地实现字符串逆置、图的拓扑排序、二叉树镜像等复杂的数据操作。

带头结点单链表的逆置算法是一种非常重要的链表操作,它能够为问题的解决提供便利。

通过对逆置算法的深入理解和应用,可以为算法的设计和问题的解决提供更多的灵感和思路。

希望本文的内容能够帮助读者更深入地理解带头结点单链表的逆置算法,并在实际应用中发挥重要作用。

个人观点:带头结点单链表的逆置算法是一种非常有趣且实用的算法操作,它能够为链表操作和数据处理提供更多的灵活性和便利性。

数据结构课后习题答案详解(C语言版_严蔚敏) 2

数据结构课后习题答案详解(C语言版_严蔚敏) 2

数据结构习题集答案(C语言版严蔚敏)第2章线性表2.1 描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点)。

解:头指针是指向链表中第一个结点的指针。

首元结点是指链表中存储第一个数据元素的结点。

头结点是在首元结点之前附设的一个结点,该结点不存储数据元素,其指针域指向首元结点,其作用主要是为了方便对链表的操作。

它可以对空表、非空表以及首元结点的操作进行统一处理。

2.2 填空题。

解:(1) 在顺序表中插入或删除一个元素,需要平均移动表中一半元素,具体移动的元素个数与元素在表中的位置有关。

(2) 顺序表中逻辑上相邻的元素的物理位置必定紧邻。

单链表中逻辑上相邻的元素的物理位置不一定紧邻。

(3) 在单链表中,除了首元结点外,任一结点的存储位置由其前驱结点的链域的值指示。

(4) 在单链表中设置头结点的作用是插入和删除首元结点时不用进行特殊处理。

2.3 在什么情况下用顺序表比链表好?解:当线性表的数据元素在物理位置上是连续存储的时候,用顺序表比用链表好,其特点是可以进行随机存取。

2.4 对以下单链表分别执行下列各程序段,并画出结果示意图。

解:2.5 画出执行下列各行语句后各指针及链表的示意图。

L=(LinkList)malloc(sizeof(LNode)); P=L;for(i=1;i<=4;i++){P->next=(LinkList)malloc(sizeof(LNode));P=P->next; P->data=i*2-1;}P->next=NULL;for(i=4;i>=1;i--) Ins_LinkList(L,i+1,i*2);for(i=1;i<=3;i++) Del_LinkList(L,i);解:2.6 已知L是无表头结点的单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。

a. 在P结点后插入S结点的语句序列是__________________。

线性表逆置(顺序表)实验报告

线性表逆置(顺序表)实验报告
vi()的形参加'&',表明可通过调用vi()改变元素的值*/
ElemType *p;
int i;
p=L.elem;
for(i=1;i<=L.length;i++)
vi(p++);
printf("\n");
return OK;
}
/*逆置链表的程序*/
void change(SqList *L) /*逆置算法*/
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
/* #define OVERFLOW -2因为在math.h中已定义OVERFLOW的值为3,故去掉此行*/
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等*/
{
scanf("%d",&e);
i=ListInsert(&L,j,e);
}
}prLeabharlann ntf("逆置前的表:L= "); /*输出表L的内容*/
ListTraverse(L,print);
change(&L);
printf("逆置后的表:L= "); /*输出新表L的内容*/
ListTraverse(L,print);
{
ElemType e;
int L_len;
int i;
L_len=ListLength(*L); /*求线性表的长度*/
for(i=0;i<=L_len/2;i++)

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

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

数据结构与算法的课程设计课程设计题目:数据结构的逆置算法院系名称:信息技术学院专业(班级):计算机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<stdio.h>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;}3.运行及调试5.附录:/*带头结点的链表建立*/#include<stdio.h>#include<malloc.h>#include<conio.h>typedef struct node /*结点类型定义*/{ int data; /*结点的数据域*/struct node* next; /*结点的指针域*/}LinkList;/*数据结点*/typedef struct{ int length; /**链表的长度/struct node*next; /*结点的指针域*/}Tnode; /*头结点*/Tnode *CreatList()/*头插法建立单链表*/{ Tnode *head;LinkList *p;/*工作指针*/int ip;head=(Tnode *)malloc(sizeof(Tnode));head->next=NULL; /*链表开始为空*/printf("please ip the number:\n");scanf("%d",&ip);while(ip!=000){ p=(LinkList *)malloc(sizeof(LinkList)); /*生成新结点*/ p->data=ip; /*将元素值赋给新生结点p*/p->next=head->next;head->next=p; /*head指向p结点*/scanf("%d",&ip);if(ip==000)printf("\nthe ip is end!\n\n");return head;}void ReadList(Tnode *head) /*读取链表中的数据*/{ LinkList *p;p=head->next;while(p){printf("%d ",p->data);p=p->next;}printf("\n");}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;}}void Readme(){ printf("press 1 to set libiao\n");printf("press 0 to exit\n");printf("-------------------------------------------------------------------------------\n"); }void main(){ Tnode *head;int choice;while(choice){ Readme();scanf("%d",&choice);switch(choice){ case 1:head=CreatList(); /*创建单链表*/printf("the number are:\n\n");ReadList(head);printf("\n");ExchangeList(head); /**逆置后的单链表/printf("the exchange number are:\n\n"); /*打印逆置后的单链表*/ReadList(head); /*读取单链表中的数据*/getch();break;}}}(三)双链表实现逆置1.需求分析:创建一个双链表并实现逆序输出2.详细设计:定义的所有数据类型,对每个操作写出伪码算法;对主程序和其他模块也都写出伪码算法。

链表逆置算法

链表逆置算法

链表逆置算法链表是一种常用的数据结构,它由一系列的节点组成,每个节点包含一个数据元素和一个指针,用于指向下一个节点。

在实际应用中,经常需要将链表进行逆置操作,即将链表中的元素反序排列。

本文将介绍链表逆置算法的实现原理和具体步骤。

链表逆置算法的实现原理是通过改变节点之间的指针指向关系,将原来的链表转换为一个逆序的链表。

具体步骤如下:1. 定义三个指针:prev、cur和next。

其中prev用于指向当前节点的前一个节点,cur用于指向当前节点,next用于保存当前节点的下一个节点。

2. 将cur指针指向链表的头节点。

3. 在循环中,依次对cur指针指向的节点进行操作,直到cur指向链表的最后一个节点。

循环条件可设为cur不为空。

4. 在循环中,将next指针指向cur的下一个节点。

5. 将cur的指针指向prev,实现节点指针的反向。

6. 将prev指针指向cur,cur指针指向next。

7. 遍历完所有节点后,将链表的头节点指向prev,即可得到逆序的链表。

下面通过一个具体例子来说明链表逆置算法的实现过程:假设有一个链表,包含5个节点,数据分别为1、2、3、4、5。

初始状态下,链表的指针指向关系如下:1 ->2 ->3 ->4 -> 5按照上述步骤进行逆置操作:1. 初始化prev、cur和next指针。

2. cur指向链表的头节点,即1。

3. 在循环中,将next指向cur的下一个节点,即2。

4. 将cur的指针指向prev,实现节点指针的反向,此时第一个节点指向null。

5. 将prev指向cur,cur指向next。

6. 继续循环,next指向cur的下一个节点,即3。

7. 将cur的指针指向prev,实现节点指针的反向,此时第二个节点指向第一个节点。

8. 将prev指向cur,cur指向next。

9. 继续循环,重复上述步骤,直到遍历完所有节点。

最终得到的逆序链表的指针指向关系如下:5 -> 4 -> 3 -> 2 -> 1通过链表逆置算法,我们可以将链表中的元素反序排列,实现了链表的逆置操作。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
#define ElemType int
typedef struct LNode
{
int data;
struct LNode *next;
} LNode,*LinkList;
int CreateLink_LA(LinkList &L,int n)
{
LinkList p,q;
int i;
ElemType e;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
q = (LinkList)malloc(sizeof(LNode));
q = L;
for (i=0; i<n; i++)
{
scanf("%d", &e);
p = (LinkList)malloc(sizeof(LNode));
p->next=NULL;
q->next=p;
p->data=e;
q=p;
}
return OK;
}
int LoadLink_L1(LinkList &L)
{
LinkList p=L->next;
if(p==NULL)printf("The List is empty!");
else
{
printf("The List is:");
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
printf("\n");
return OK;
}
int LoadLink_L2(LinkList &L)
{
LinkList p=L->next,t,q;
q=p;
if(p==NULL)printf("The List is empty!");
else
{
printf("The turned List is:");
while(p->next!=NULL)
{
t=p;
p=p->next;
}
printf("%d ",p->data);
while(q!=NULL)
{
p=L->next;
while(p->next!=NULL)
{
if(p->next==t)
{
printf("%d ",t->data);
t=p;
break;
}
p=p->next;
}
q=q->next;
}
printf("%d ",L->next->data);
}
printf("\n");
return OK;
}
int main()
{
LinkList T1;
int n;
scanf("%d",&n);
if(!CreateLink_LA(T1,n)) printf("ERROR\n");
if(!LoadLink_L1(T1)) printf("ERROR\n");
if(!LoadLink_L2(T1)) printf("ERROR\n");
return OK;
}。

相关文档
最新文档