单链表逆置

1、实现单链表逆置

无头结点:

1 #include

2 #include

3

4 typedef struct node{

5 int data;

6 struct node *next;

7 }Node;

8

9 //创建链表

10 Node *CreateList(void){

11 int val,i,n;

12 Node *head,*p,*q;

13

14 head=NULL;

15 printf("请输入您要建立的链表长度:\n");

16 scanf("%d",&n);

17 printf("请输入您要输入的数据:\n");

18 for(i=0;i

19 scanf("%d",&val);

20 p=(Node*)malloc(sizeof(Node));

21 p->data=val;

22 if(head==NULL)

23 head=q=p;

24 else

25 q->next=p;

26 q=p;

27 }

28 p->next=NULL;

29 return head;

30 }

31

32 /*链表的逆置 p为当前位置,q为下一位置,r为上一位置。当翻转链表第一个结点时,先把p指向下一个结点赋给q,然后改变p的指向,给它赋值为r,因为这时r为NULL,这就把翻转的链表尾搞好了。中间结点的翻转,就不解释了,很easy。翻转最后一个结点时,由于q为NULL,所以这时我们要记住p,这个p就是新链表的头结点了,所以它赋值给pHead,最后跳出循环。

我这里的链表是头结点指向而不是头指针指向的,并且r初始赋值为NULL,也是很重要的。*/ 33 Node *ReverseList(Node *head){

34 Node *p,*q,*r;

35 p=head;

36 q=r=NULL; 37 while(p){

38 q=p->next;

39 p->next=r;

40 r=p;

41 p=q;

42 }

43 return r;

44 }

45

46 //输出链表

47 void ShowList(Node *head){ 48 Node *p;

49 p=head;

50 while(p){

51 printf("%d ",p->data); 52 p=p->next;

53 }

54 printf("\n");

55 }

56

57 void main(){

58 Node *head;

59

60 head=CreateList();

61 printf("链表逆置前的数据:\n"); 62 ShowList(head);

63

64 head=ReverseList(head);

65 printf("链表逆置后的数据:\n"); 66 ShowList(head);

67 }

运行演示:

1、实现单链表逆置

无头结点:

1 #include

2 #include

3

4 typedef struct node{

5 int data;

6 struct node *next;

7 }Node;

8

9 //创建链表

10 Node *CreateList(void){

11 int val,i,n;

12 Node *head,*p,*q;

13

14 head=NULL;

15 printf("请输入您要建立的链表长度:\n");

16 scanf("%d",&n);

17 printf("请输入您要输入的数据:\n");

18 for(i=0;i

19 scanf("%d",&val);

20 p=(Node*)malloc(sizeof(Node));

21 p->data=val;

22 if(head==NULL)

23 head=q=p;

24 else

25 q->next=p;

26 q=p;

27 }

28 p->next=NULL;

29 return head;

30 }

31

32 /*链表的逆置 p为当前位置,q为下一位置,r为上一位置。当翻转链表第一个结点时,先把p指向下一个结点赋给q,然后改变p的指向,给它赋值为r,因为这时r为NULL,这就把翻转的链表尾搞好了。中间结点的翻转,就不解释了,很easy。翻转最后一个结点时,由于q为NULL,所以这时我们要记住p,这个p就是新链表的头结点了,所以它赋值给pHead,最后跳出循环。

我这里的链表是头结点指向而不是头指针指向的,并且r初始赋值为NULL,也是很重要的。*/ 33 Node *ReverseList(Node *head){

34 Node *p,*q,*r;

35 p=head;

36 q=r=NULL; 37 while(p){

38 q=p->next;

39 p->next=r;

40 r=p;

41 p=q;

42 }

43 return r;

44 }

45

46 //输出链表

47 void ShowList(Node *head){ 48 Node *p;

49 p=head;

50 while(p){

51 printf("%d ",p->data); 52 p=p->next;

53 }

54 printf("\n");

55 }

56

57 void main(){

58 Node *head;

59

60 head=CreateList();

61 printf("链表逆置前的数据:\n"); 62 ShowList(head);

63

64 head=ReverseList(head);

65 printf("链表逆置后的数据:\n"); 66 ShowList(head);

67 }

运行演示:


相关内容

  • 单链表.双链表.循环链表和静态链表的习题
  • 单链表.双链表.循环链表和静态链表的习题 一.单项选择题 1. 关于线性表的顺序存储结构和链式存储结构的描述中,正确的是( ). Ⅰ. 线性表的顺序存储结构优于其链式存储结构 Ⅱ. 链式存储结构比顺序存储结构能更方便地表示各种逻辑结构 Ⅲ. 如频繁使用插入和删除结点操作,顺序存储结构更优于链式存储结 ...

  • 数据结构实验报告一
  • 数据结构 实验报告 实验题目: 班 级: 学 号: 姓 名: 完成日期: 一.需求分析 1. 问题描述(Problem Description): 给定两个不超过10000位的非负整数A 和B, 计算出A+B的值.要求计算并输出A+B的值. 2. 根据实验任务的要求分析: 大整数要利用两个顺序表存储 ...

  • 1单链表的定义及应用
  • 单链表的定义及基本操作(构造 销毁 插入 删除 取值) #include #include #include typedef char ElemType; typedef struct LNode /*定义单链表结点类型*/ { ElemType data; struct LNode *next; ...

  • 单链表的查找
  • <数据结构>实验报告一 题目:单链表的查找.插入与删除 班级: 电子0802 学号: 日期: 2011.03.08 姓名: 程序名: cqq1.c 一.上机实验的问题和要求: 单链表的查找.插入与删除.设计算法,实现线性结构上的单链表的产生以及元素的查找.插入与删除.具体实现要求: 1. ...

  • 单链表的初始化,建立,插入,查找,删除.
  • #include #include typedef int ElemType; //定义结点类型 typedef struct Node { ElemTypedata;             //单链表中的数据域 struct Node*next;         //单链表的指针域 }Node, ...

  • 2011年澳门特别行政区C++答案 数据结构试卷及答案考试重点和考试技巧
  • 1.深度为k的完全二叉树所含叶结点的个数最多为( B). A)2k B) 2k-1 C)k D) 2k 2.在数据结构中,与所使用的计算机无关的是数据的 A 结构. A.逻辑 B.存储 C.逻辑和存储 D.物理 3.广义表A=(x,((y),((a)),A))的深度是 A.2 B.3 C.4 D.∞ ...

  • 线性表习题
  • 线性表习题 一 判断题 1.线性表的逻辑顺序与存储顺序总是一致的.× 2.顺序存储的线性表可以按序号随机存取. 3.顺序表的插入和删除操作不需要付出很大的时间代价,因为每次操作平均只有近一半的元素需要移动. × 4.线性表中的元素可以是各种各样的,但同一线性表中的数据元素具有相同的特性,因此是属于同 ...

  • 单链表的建立(C语言完整程序)
  • 有了动态内存分配的基础,要实现链表就不难了. 所谓链表,就是用一组任意的存储单元存储线性表元素的一种数据结构.链表又分为单链表.双向链表和循环链表等.我们先讲讲单链表.所谓单链表,是指数据接点是单向排列的.一个单链表结点,其结构类型分为两部分: 1.数据域:用来存储本身数据 2.链域或称为指针域:用 ...

  • 创建单链表
  • 开辟一个空间,赋上一个值,连到前面节点,就形成链表喽 code如下: #include "stdio.h" #include"malloc.h" typedef struct node { int data; struct node *next; }link; ...

  • 基因工程酶与载体
  • <基因工程原理>作业 1. 同裂酶和同尾酶有何区别? 同尾酶:切割不同的DNA 片段但产生相同的粘性末端的一类限制性内切酶. 同裂酶:识别相同序列的限制酶称同裂酶,但它们的切割位点可能不同. 不同的地方:同裂酶识别相同的核苷酸序列,可能切割产生不同的末端:同尾酶识别不相同得核苷酸序列但产 ...