C语言数据结构实现链表逆序并输出

C语言数据结构实现链表逆序并输出

将一个链表逆序并输出。我用了两种方法来实现,第一种是借助了一个新的空链表;第二种是在原来链表的基础上直接实现逆序。

实例代码:

头文件:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h> 

typedef int ElemType;
typedef struct Node
{//结点结构
 ElemType value;    //值域
 struct Node *next;//指针域
}Node,*ptr_Node; 

typedef struct LinkList
{//链表结构
 ptr_Node head; //链表头结点指针
 ptr_Node tail;//链表尾结点指针
 int length;  //链表长度
}LinkList,*ptr_LinkList; 

ptr_LinkList CreateList(void)
{//创建一个空链表
 ptr_LinkList linklist;
 linklist=(LinkList *)malloc(sizeof(LinkList));
 if(!linklist)
 {
  printf("allocation failed.\n");
 }
 linklist->head=NULL;
 linklist->tail=NULL;
 linklist->length=0;
 return linklist;
} 

bool IsListEmpty(ptr_LinkList linklist)
{//判断链表是否为空
 if(linklist->length==0)
 {
  return true;
 }
 return false;
} 

void InsertListHead(ptr_LinkList linklist,ElemType element)
{//在表头插入值为element的结点作为新的表头
 ptr_Node ptr_node;
 ptr_node=(Node *)malloc(sizeof(Node)); //生成插入结点
 if(!ptr_node)
 {
  printf("allocation failed.\n");
 }
 else
 {
  ptr_node->value=element;
  if(linklist->length==0)
  {
   linklist->head=ptr_node;
   linklist->tail=linklist->head;
   linklist->tail->next=NULL;
  }
  else
  {
   ptr_node->next=linklist->head;
   linklist->head=ptr_node; //链表头
  }
  linklist->length++; //链表长度加1
 }
} 

void InsertListTail(ptr_LinkList linklist,ElemType element)
{
 ptr_Node ptr_node;
 ptr_node=(Node *)malloc(sizeof(Node)); //生成插入结点
 if(!ptr_node)
 {
  printf("allocation failed.\n");
 }
 else
 {
  ptr_node->value=element;
  if(linklist->length==0)
  {
   linklist->head=ptr_node;
   linklist->tail=linklist->head;
   linklist->tail->next=NULL;
  }
  else
  {
   linklist->tail->next=ptr_node;
   linklist->tail=ptr_node; //链表尾
  }
  linklist->length++; //链表长度加1
 }
} 

void InsertListPosition(ptr_LinkList linklist,int pos,ElemType element)
{
 int i;
 ptr_Node ptr_node;
 ptr_Node temp_ptr_node;
 if(pos<1 || pos>linklist->length)
 {
  printf("The insert position is invalidate.\n");
 }
 else
 {
  ptr_node=(Node *)malloc(sizeof(Node)); //生成插入结点
  if(!ptr_node)
  {
   printf("allocation failed.\n");
  }
  ptr_node->value=element;
  if(pos==1)
  {
   InsertListHead(linklist,element);
  }
  else if(pos==linklist->length)
  {
   InsertListTail(linklist,element);
  }
  else
  {
   temp_ptr_node=linklist->head;
   for(i=1;i<pos-1;i++)
   {//找到第pos-1个结点
    temp_ptr_node=temp_ptr_node->next;
   }
   ptr_node->next=temp_ptr_node->next;
   temp_ptr_node->next=ptr_node;
   linklist->length++;
  }
 }
} 

void Destroy(ptr_LinkList linklist)
{//销毁链表
 ptr_Node p=linklist->head;
 ptr_Node q;
 while(p)
 {//释放每个结点空间
  q=p->next;
  free(p);
  p=NULL;
  p=q;
 }
} 

void Traverse(ptr_LinkList linklist)
{//输出整个链表
 ptr_Node p;
 p=linklist->head;
 while(p)
 {
  printf("%4d",p->value);
  p=p->next;
 }
}

头文件中实现了链表的几个基本的操作,有的是必须的,有些是非必须的。

实现代码:

#include "stdafx.h"
#include "LinkList.h"
#include <conio.h> 

ptr_LinkList InvertList(ptr_LinkList list)
{//该方法借助一个新的空链表来实现链表逆序
 ptr_LinkList inverted_linklist;
 ptr_Node p;
 p=list->head;
 inverted_linklist=CreateList();//创建一个空链表
 while(p)
 {//将list链表中的结点值逆序输入新创建的链表中,实现链表反转
  InsertListHead(inverted_linklist,p->value);
  p=p->next;
 }
 return inverted_linklist;
} 

void InvertLinkList(ptr_LinkList linklist)
{//该方法直接对原有链表实现逆序,不借助其他链表
 ptr_Node p,q,r,m;
 m=p=linklist->head;
 q=p->next;
 r=q->next;
 while(r)
 {//依次对链表中的结点进行反转
  q->next=p;
  p=q;
  q=r;
  r=r->next;
 }
 q->next=p; //最后一个结点反转
 linklist->head=q;
 linklist->tail=m;
 linklist->tail->next=NULL;
} 

int _tmain(int argc, _TCHAR* argv[])
{
 ptr_LinkList linklist;
 ptr_LinkList list;
 linklist=CreateList();
 if(linklist)
 {
  printf("We have created a new linklist.\n");
 }
 InsertListHead(linklist,12);
 InsertListHead(linklist,35);
 InsertListHead(linklist,66);
 InsertListHead(linklist,06);
 InsertListHead(linklist,11);
 InsertListHead(linklist,54);
 InsertListHead(linklist,79);
 Traverse(linklist);
 printf("\n");
 printf("The first method:\n");
 list=InvertList(linklist);
 Traverse(list);
 printf("\n");
 printf("The second method:\n");
 InvertLinkList(linklist);
 Traverse(linklist);
 printf("\n");
 getch();
 return 0;
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • C语言创建和操作单链表数据结构的实例教程

    1,为什么要用到链表 数组作为存放同类数据的集合,给我们在程序设计时带来很多的方便,增加了灵活性.但数组也同样存在一些弊病.如数组的大小在定义时要事先规定,不能在程序中进行调整,这样一来,在程序设计中针对不同问题有时需要3 0个大小的数组,有时需要5 0个数组的大小,难于统一.我们只能够根据可能的最大需求来定义数组,常常会造成一定存储空间的浪费. 我们希望构造动态的数组,随时可以调整数组的大小,以满足不同问题的需要.链表就是我们需要的动态数组.它是在程序的执行过程中根据需要有数据存储就向系统要求

  • C语言数据结构 链表与归并排序实例详解

    C语言数据结构 链表与归并排序实例详解 归并排序适合于对链表进行原址排序,即只改变指针的连接方式,不交换链表结点的内容. 归并排序的基本思想是分治法:先把一个链表分割成只有一个节点的链表,然后按照一定顺序.自底向上合并相邻的两个链表. 只要保证各种大小的子链表是有序的,那么最后返回的链表就一定是有序的. 归并排序分为分割和合并两个子过程.分割是用递归的方法,把链表对半分割成两个子链表:合并是在递归返回(回朔)的时候,把两个有序链表合并成一个有序链表. (注意:只有一个节点的链表一定是有序的) 这

  • C语言 数据结构之链表实现代码

    前言 最近在复习数据结构的相关知识,感觉在初学的时候还是有很多东西没有掌握,不过现在终于算是搞得比较有头绪了,所以就在写出来和大家一起分享! 什么是链表 简单的说,链表就是由多个结点离散分配,彼此通过指针相连,每个结点只有一个前驱结点和后继结点.首节点无前驱结点,为结点无后继结点的一种存储结构. 链表的结构 头结点:链表的第一个有效结点前面的结点,头结点并不存放有效数据,也就是数据域为空,加头结点的主要目的是为了方便链表的操作. 首节点:链表的第一个有效结点,结点包含数据域和指针域. 尾结点:尾

  • C语言 数据结构双向链表简单实例

    双向链表的基本操作 1.利用尾插法建立一个双向链表. 2.遍历双向链表. 3.实现双向链表中删除一个指定元素. 4.在非递减有序双向链表中实现插入元素e仍有序算法. 5.判断双向链表中元素是否对称若对称返回1否则返回0. 6.设元素为正整型,实现算法把所有奇数排列在偶数之前. 7.在主函数中设计一个简单的菜单调试上述算法. 实例代码: //排序的时候因为没有说明奇数和偶数需不需要各自再排序,我就没有排序,只是将奇数放在偶数后面. //创建链表的时候,因为这个实验没有要求输出链表的长度,所以我就输

  • C语言 数据结构链表的实例(十九种操作)

    C语言 数据结构链表的实例(十九种操作) #include <stdio.h> #include <string.h> #include <stdlib.h> /*************************************************************************************/ /* 第一版博主 原文地址 http://www.cnblogs.com/renyuan/archive/2013/05/21/30915

  • 数据结构 C语言实现循环单链表的实例

    数据结构 C语言实现循环单链表的实例 实例代码: //=========杨鑫========================// //循环单链表的实现 #include <stdio.h> #include <stdlib.h> typedef int ElemType; //定义结点类型 typedef struct Node { ElemType data; struct Node *next; }Node,*LinkedList; int count = 0; //1.单循环

  • C语言数据结构实现链表逆序并输出

    C语言数据结构实现链表逆序并输出 将一个链表逆序并输出.我用了两种方法来实现,第一种是借助了一个新的空链表:第二种是在原来链表的基础上直接实现逆序. 实例代码: 头文件: #include <stdio.h> #include <stdlib.h> #include <malloc.h> typedef int ElemType; typedef struct Node {//结点结构 ElemType value; //值域 struct Node *next;//指

  • C语言实现单链表逆序与逆序输出实例

    单链表的逆序输出分为两种情况,一种是只逆序输出,实际上不逆序:另一种是把链表逆序.本文就分别实例讲述一下两种方法.具体如下: 1.逆序输出 实例代码如下: #include<iostream> #include<stack> #include<assert.h> using namespace std; typedef struct node{ int data; node * next; }node; //尾部添加 node * add(int n, node * h

  • C语言解字符串逆序和单向链表逆序问题的代码示例

    字符串逆序 上次面试碰到一个单向链表逆序的题目,幸好对字符串逆序比较熟悉,类比做出来了.字符串逆序比较简单,直接上代码: void stringReverse(char* p1,char* p2) { if(p1==p2)return; //swap the value of p1 ,p2 *p1=(*p1)+(*p2); *p2=(*p1)-(*p2); *p1=(*p1)-(*p2); if(p1==p2-1)return; else stringReverse(++p1,--p2); }

  • C语言数据结构实现链表去重的实例

    C语言数据结构实现链表去重的实例 题目及分析 链表去重 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 给定一个带整数键值的单链表L,本题要求你编写程序,删除那些键值的绝对值有重复的结点.即对任意键值K,只有键值或其绝对值等于K的第一个结点可以被保留.同时,所有被删除的结点必须被保存在另外一个链表中.例如:另L为21→-15→-15→-7→15,则你必须输出去重后的链表21→-15→-7.以及被删除的链表-15→15. 输入格式: 输入

  • java单链表逆序用法代码示例

    本篇博客,比较简单.对单链表逆序不理解的看看就可以了. 逆序思想 现假设有一链表,有待逆序操作.我们首先想到的就是将那个指针关系逆序了就行了呗. 事实上,就是这样.博主就是以这个为目标来完成的单链表逆序操作. Node pre = null; Node post = null; while(head!=null){ post = head.next; head.next = pre; pre = head; head = post; } 这便是逆序的核心了.下面我们就来一步步的讲解. 首次逆序:

  • C语言数据结构旋转链表的实现

    C语言数据结构旋转链表的实现 实例: 给出链表1->2->3->4->5->null和k=2 返回4->5->1->2->3->null 分析: 感觉很直观,直接把分割点找出来就行,记得k可能大于len,要取模 代码: /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x

  • C语言数据结构 link 链表反转的实现

    C语言数据结构 link 链表反转的实现 链表反转,示例如下: 偶数个输入:a->b->c->d->e->f 偶数个输出:e->f->c->d->a->b or 奇数个输入:a->b->c->d->e->f->g 偶数个输出:g->e->f->c->d->a->b #include <stdio.h> #include <malloc.h> #incl

  • C语言递归实现字符串逆序的方式详解

    C语言实现字符串逆序,具体内容如下所示: 一.迭代的方式实现 贴上代码:迭代的方式实现 '//字符串逆序:不可用字符串操作函数' #include <stdio.h> void swap(char* ch1, char* ch2) '//交换两个字符串' { char tmp = *ch1; *ch1 = *ch2; *ch2 = tmp; } int my_strlen(char* str) '//实现计算字符串字节数' { int count = 0; while (*str != '\0

  • C语言数据结构单链表接口函数全面讲解教程

    目录 前言 一.链表的概念及结构 1.概念 二.链表的使用 1.遍历整个链表 2.尾插 3.头插 4.头删 5.尾删 6.任意位置插入数据 7.任意位置删除数据 后记 前言 上一期数据结构专栏我们学习了顺序表后:C语言数据结构顺序表 在运用时,细心的同学可能会发现,如果要头插.尾插或者任意位置.如果原先的空间已经被占满了,你是需要扩容的,动态链表扩容往往是2倍,但是扩容后,如果后面没有使用完全扩容后空间就会造成空间浪费,为了解决这个问题,我们今天将学习链表. 提示:以下是本篇文章正文内容,下面案

  • c语言经典习题之逆序字符串详解

    目录 使用指针逆序字符串 使用递归逆序字符串 逆序带空格的字符串 总结 使用指针逆序字符串 思路: 给两个指针,left放在字符串左侧,right放在最后一个有效字符位置 交换两个指针位置上的字符 left指针往后走,right指针往前走,只要两个指针没有相遇,继续2,两个指针相遇后,逆置结束 void reverse_string(char* str) { char* left = str;//首元素 char* right = str + strlen(str) - 1;//最后一个元素 w

随机推荐