链表逆序操作笔试的时候真的不要写的太多, 上次还来了个递归实现链表逆序。
就当利用这个题复习下单链表的常用操作了, 下面的单链表(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