目录
6-1 单链表逆转
要求实现一个函数,将给定的单链表逆转。
L
是给定单链表,函数Reverse
要返回被逆转后的链表。
程序:
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;
List Read(); /* 细节在此不表 */
void Print( List L ); /* 细节在此不表 */
List Reverse( List L );
int main()
{
List L1, L2;
L1 = Read();
L2 = Reverse(L1);
Print(L1);
Print(L2);
return 0;
}
/* 你的代码将被嵌在这里 */
List Reverse( List L )
{
if(!L)
return 0;
PtrToNode pre,tmp;
pre=NULL;
tmp=NULL;
while(L)
{
tmp=L->Next; tmp只是暂存节点,使链表节点可链接,它并不参与逆置的主过程
L->Next=pre;
pre=L;
L=tmp; //头指针随着tmp指针移动,当他们为null时,
//链表遍历完毕,退出循环
}
return pre; //L 最后一定为NULL,因此不返回L,
//而返回pre,将其作为新链表的头指针
}
笔记:
这道题坑就坑在没有头节点,L为头指针,如果没注意到这点,很容易犯错。
当有头节点时,L指向头节点,用就地逆置的方法,程序如下
List Reverse( List L )
{
PtrToNode pre,tmp;
pre=L->Next;
L->Next=NULL;
while(pre)
{
tmp=pre->Next; //tmp只是暂存节点,使链表节点可链接,它并不参与逆置的主过程
pre->Next=L->Next;
L->Next=pre;
pre=tmp;
}
return L;
}
6-2 顺序表操作集 (20 分)
本题要求实现顺序表的操作集。
List MakeEmpty()
:创建并返回一个空的线性表;
Position Find( List L, ElementType X )
:返回线性表中X的位置。若找不到则返回ERROR;
bool Insert( List L, ElementType X, Position P )
:将X插入在位置P并返回true。若空间已满,则打印“FULL”并返回false;如果参数P指向非法位置,则打印“ILLEGAL POSITION”并返回false;
bool Delete( List L, Position P )
:将位置P的元素删除并返回true。若参数P指向非法位置,则打印“POSITION P EMPTY”(其中P是参数值)并返回false。
程序:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 5
#define ERROR -1
typedef enum {false, true} bool;
typedef int ElementType;
typedef int Position;
typedef struct LNode *List;
struct LNode
{
ElementType Data[MAXSIZE];
Position Last; /* 保存线性表中最后一个元素的位置 */
};
List MakeEmpty();
Position Find( List L, ElementType X );
bool Insert( List L, ElementType X, Position P );
bool Delete( List L, Position P );
int main()
{
List L;
ElementType X;
Position P;
int N;
L = MakeEmpty();
scanf("%d", &N);
while ( N-- )
{
scanf("%d", &X);
if ( Insert(L, X, 0)==false ) //都是从下标为0的位置插入,故数据的存放和输入的顺序刚好相反
printf(" Inse