链表逆序操作笔试的时候真的不要写的太多, 上次还来了个递归实现链表逆序。

就当利用这个题复习下单链表的常用操作了, 下面的单链表(ADT)参考了《数据结构和算法分析---C语言描述》中的写法, 稍有改动。

增加了一些自己觉得会经常用到的函数。链表的主要操作在 linklist.h 文件中, 链表函数的实现主要在 linklist.c 文件中。 test_linklist.c 是一个简单的测试用例。

下面再具体看看链表逆序函数的实现(非递归) :

在函数ReverseList()当中, 定义了4个指针,

1.  pReversedList 指向反转以后的链表头 。

2.  pNode指向的是当前要反转的结点

3.  pPrev是指向的是要反转结点(pNode)的前一个结点(也就是已经反转好的链表的尾结点)

4.  pNext指向的是pNode的下一个结点。主要通过下面几条语句进行反转, 直到链表尾为止。

pNode->Next = pPrev;

pPrev = pNode;

pNode = pNext;

pNext = pNode->Next;

/*  linklist.h  */

/***********************************************************/
/* Copyright (C) SA14226214, USTC, 2014-2015               */
/*                                                         */
/*  FILE NAME             :  linklist.h                       */
/*  PRINCIPAL AUTHOR      :  GaoZhipeng                    */
/*  SUBSYSTEM NAME        :  LinkList                      */
/*  MODULE NAME           :  LinkList                      */
/*  LANGUAGE              :  C                             */
/*  TARGET ENVIRONMENT    :  ANY                           */
/*  DATE OF FIRST RELEASE :  2015/04/13                    */
/*  DESCRIPTION           :  This is a linklist program    */
/***********************************************************/

/*
 *Revision log:
 *
 *Ceated by GaoZhipeng, 2015/04/13
 *     
 */


#ifndef LINK_LIST_H
#define LINK_LIST_H


#define ElementType char
#define boolean int
#define true 1
#define false 0

typedef struct Node
{
    ElementType Element;
    struct Node *Next;
}Node;

//typedef struct Node;
typedef struct Node *PtrToNode;
/*List是一个固定的链表,Position是链表中的位置可以移动 */
typedef PtrToNode List;
typedef PtrToNode Position;




List MakeEmpty(List L);
int IsEmpty(List L);
int IsLast(Position P, List L);
Position Find(ElementType X, List L);
//按照元素和位置查找
Position FindPreviousElement(ElementType X, List L);
Position FindPreviousPosition(int K, List L);
//插入删除操作
void DeleteByElement(ElementType X, List L);
Position DeleteByPosition(int i, List L);
Position InsertByPosition(ElementType X, int i, List L);

List CreateListR();
void PrintList(List L);
void DeleteList(List L);
/*链表逆序*/
List ReverseList(List L);
List ReverseList_DG(List L);
//Position Header(List L);
//Position First(List L);
//Posttion Advance(Position P);
//ElementType Retrieve(Position P);


#endif
View Code

相关文章: