验证性实验
实现顺序表各种基本运算的算法
放码
sqlist.h
# ifndef SQLIST_H
# define SQLIST_H
# define MaxSize 50
typedef char ElemType;
typedef struct
{
ElemType data[ MaxSize] ;
int length;
} SqList;
void CreateList ( SqList * & L, ElemType a[ ] , int n) ;
void InitList ( SqList * & L) ;
void DestroyList ( SqList * & L) ;
bool ListEmpty ( SqList * L) ;
int ListLength ( SqList * L) ;
void DispList ( SqList * L) ;
bool GetElem ( SqList * L, int i, ElemType & e) ;
int LocateElem ( SqList * L, ElemType e) ;
bool ListInsert ( SqList * & L, int i, ElemType e) ;
bool ListDelete ( SqList * & L, int i, ElemType & e) ;
# endif
sqlist.cpp
# include <stdio.h>
# include <malloc.h>
# include "sqlist.h"
void CreateList ( SqList * & L, ElemType a[ ] , int n)
{
L = ( SqList * ) malloc ( sizeof ( SqList) ) ;
for ( int i = 0 ; i < n; i++ )
L-> data[ i] = a[ i] ;
L-> length = n;
}
void InitList ( SqList * & L)
{
L = ( SqList * ) malloc ( sizeof ( SqList) ) ;
L-> length = 0 ;
}
void DestroyList ( SqList * & L)
{
free ( L) ;
}
bool ListEmpty ( SqList * L)
{
return ( L-> length == 0 ) ;
}
int ListLength ( SqList * L)
{
return ( L-> length) ;
}
void DispList ( SqList * L)
{
for ( int i = 0 ; i < L-> length; i++ )
printf ( "%c " , L-> data[ i] ) ;
printf ( "\n" ) ;
}
bool GetElem ( SqList * L, int i, ElemType & e)
{
if ( i < 1 || i > L-> length)
return false;
e = L-> data[ i - 1 ] ;
return true;
}
int LocateElem ( SqList * L, ElemType e)
{
int i = 0 ;
while ( i < L-> length && L-> data[ i] != e) i++ ;
if ( i >= L-> length)
return 0 ;
else
return i + 1 ;
}
bool ListInsert ( SqList * & L, int i, ElemType e)
{
int j;
if ( i < 1 || i > L-> length + 1 )
return false;
i-- ;
for ( j = L-> length; j > i; j-- )
L-> data[ j] = L-> data[ j - 1 ] ;
L-> data[ i] = e;
L-> length++ ;
return true;
}
bool ListDelete ( SqList * & L, int i, ElemType & e)
{
int j;
if ( i < 1 || i > L-> length)
return false;
i-- ;
e = L-> data[ i] ;
for ( j = i; j < L-> length - 1 ; j++ )
L-> data[ j] = L-> data[ j + 1 ] ;
L-> length-- ;
return true;
}
exp2-1.cpp
# include "sqlist.h"
# include <stdio.h>
int main ( )
{
SqList * L;
ElemType e;
printf ( "顺序表的基本运算如下:\n" ) ;
printf ( " (1)初始化顺序表L\n" ) ;
InitList ( L) ;
printf ( " (2)依次插入a,b,c,d,e元素\n" ) ;
ListInsert ( L, 1 , 'a' ) ;
ListInsert ( L, 2 , 'b' ) ;
ListInsert ( L, 3 , 'c' ) ;
ListInsert ( L, 4 , 'd' ) ;
ListInsert ( L, 5 , 'e' ) ;
printf ( " (3)输出顺序表L:" ) ;
DispList ( L) ;
printf ( " (4)顺序表L长度:%d\n" , ListLength ( L) ) ;
printf ( " (5)顺序表L为%s\n" , ( ListEmpty ( L) ? "空" : "非空" ) ) ;
GetElem ( L, 3 , e) ;
printf ( " (6)顺序表L的第3个元素:%c\n" , e) ;
printf ( " (7)元素a的位置:%d\n" , LocateElem ( L, 'a' ) ) ;
printf ( " (8)在第4个元素位置上插入f元素\n" ) ;
ListInsert ( L, 4 , 'f' ) ;
printf ( " (9)输出顺序表L:" ) ;
DispList ( L) ;
printf ( " (10)删除L的第3个元素\n" ) ;
ListDelete ( L, 3 , e) ;
printf ( " (11)输出顺序表L:" ) ;
DispList ( L) ;
printf ( " (12)释放顺序表L\n" ) ;
DestroyList ( L) ;
return 1 ;
}
结果
顺序表的基本运算如下:
(1)初始化顺序表L
(2)依次插入a,b,c,d,e元素
(3)输出顺序表L:a b c d e
(4)顺序表L长度:5
(5)顺序表L为非空
(6)顺序表L的第3个元素:c
(7)元素a的位置:1
(8)在第4个元素位置上插入f元素
(9)输出顺序表L:a b c f d e
(10)删除L的第3个元素
(11)输出顺序表L:a b f d e
(12)释放顺序表L
请按任意键继续. . .
实现单链表各种基本运算的算法
放码
linklist.h
# ifndef LINKLIST_H
# define LINKLIST_H
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode * next;
} LinkNode;
void CreateListF ( LinkNode * & L, ElemType a[ ] , int n) ;
void CreateListR ( LinkNode * & L, ElemType a[ ] , int n) ;
void InitList ( LinkNode * & L) ;
void DestroyList ( LinkNode * & L) ;
bool ListEmpty ( LinkNode * L) ;
int ListLength ( LinkNode * L) ;
void DispList ( LinkNode * L) ;
bool GetElem ( LinkNode * L, int i, ElemType & e) ;
int LocateElem ( LinkNode * L, ElemType e) ;
bool ListInsert ( LinkNode * & L, int i, ElemType e) ;
bool ListDelete ( LinkNode * & L, int i, ElemType & e) ;
# endif
linklist.cpp
# include <stdio.h>
# include <malloc.h>
# include "linklist.h"
void CreateListF ( LinkNode * & L, ElemType a[ ] , int n)
{
LinkNode * s;
L = ( LinkNode * ) malloc ( sizeof ( LinkNode) ) ;
L-> next = NULL ;
for ( int i = 0 ; i < n; i++ ) {
s = ( LinkNode * ) malloc ( sizeof ( LinkNode) ) ;
s-> data = a[ i] ;
s-> next = L-> next;
L-> next = s;
}
}
void CreateListR ( LinkNode * & L, ElemType a[ ] , int n)
{
LinkNode * s, * r;
L = ( LinkNode * ) malloc ( sizeof ( LinkNode) ) ;
L-> next = NULL ;
r = L;
for ( int i = 0 ; i < n; i++ ) {
s = ( LinkNode * ) malloc ( sizeof ( LinkNode) ) ;
s-> data = a[ i] ;
r-> next = s;
r = s;
}
r-> next = NULL ;
}
void InitList ( LinkNode * & L)
{
L = ( LinkNode * ) malloc ( sizeof ( LinkNode) ) ;
L-> next = NULL ;
}
void DestroyList ( LinkNode * & L)
{
LinkNode * pre = L, * p = pre-> next;
while ( p != NULL ) {
free ( pre) ;
pre = p;
p = pre-> next;
}
free ( pre) ;
}
bool ListEmpty ( LinkNode * L)
{
return ( L-> next == NULL ) ;
}
int ListLength ( LinkNode * L)
{
int i = 0 ;
LinkNode * p = L;
while ( p-> next != NULL ) {
i++ ;
p = p-> next;
}
return ( i) ;
}
void DispList ( LinkNode * L)
{
LinkNode * p = L-> next;
while ( p != NULL )
{
printf ( "%c " , p-> data) ;
p = p-> next;
}
printf ( "\n" ) ;
}
bool GetElem ( LinkNode * L, int i, ElemType & e)
{
int j = 0 ;
if ( i <= 0 ) return false;
LinkNode * p = L;
while ( j < i && p != NULL )
{
j++ ;
p = p-> next;
}
if ( p == NULL )
return false;
else
{
e = p-> data;
return true;
}
}
int LocateElem ( LinkNode * L, ElemType e)
{
int i = 1 ;
LinkNode * p = L-> next;
while ( p != NULL && p-> data != e)
{
p = p-> next;
i++ ;
}
if ( p == NULL )
return ( 0 ) ;
else
return ( i) ;
}
bool ListInsert ( LinkNode * & L, int i, ElemType e)
{
int j = 0 ;
if ( i <= 0 ) return false;
LinkNode * p = L, * s;
while ( j < i - 1 && p != NULL )
{
j++ ;
p = p-> next;
}
if ( p == NULL )
return false;
else
{
s = ( LinkNode * ) malloc ( sizeof ( LinkNode) ) ;
s-> data = e;
s-> next = p-> next;
p-> next = s;
return true;
}
}
bool ListDelete ( LinkNode * & L, int i, ElemType & e)
{
int j = 0 ;
if ( i <= 0 ) return false;
LinkNode * p = L, * q;
while ( j < i - 1 && p != NULL )
{
j++ ;
p = p-> next;
}
if ( p == NULL )
return false;
else
{
q = p-> next;
if ( q == NULL )
return false;
e = q-> data;
p-> next = q-> next;
free ( q) ;
return true;
}
}
exp2-2.cpp
# include <stdio.h>
# include "linklist.h"
int main ( ) {
LinkNode * h;
ElemType e;
printf ( "单链表的基本运算如下:\n" ) ;
printf ( " (1)初始化单链表h\n" ) ;
InitList ( h) ;
printf ( " (2)依次采用尾插法插入a,b,c,d,e元素\n" ) ;
ListInsert ( h, 1 , 'a' ) ;
ListInsert ( h, 2 , 'b' ) ;
ListInsert ( h, 3 , 'c' ) ;
ListInsert ( h, 4 , 'd' ) ;
ListInsert ( h, 5 , 'e' ) ;
printf ( " (3)输出单链表h:" ) ;
DispList ( h) ;
printf ( " (4)单链表h长度:%d\n" , ListLength ( h) ) ;
printf ( " (5)单链表h为%s\n" , ( ListEmpty ( h) ? "空" : "非空" ) ) ;
GetElem ( h, 3 , e) ;
printf ( " (6)单链表h的第3个元素:%c\n" , e) ;
printf ( " (7)元素a的位置:%d\n" , LocateElem ( h, 'a' ) ) ;
printf ( " (8)在第4个元素位置上插入f元素\n" ) ;
ListInsert ( h, 4 , 'f' ) ;
printf ( " (9)输出单链表h:" ) ;
DispList ( h) ;
printf ( " (10)删除h的第3个元素\n" ) ;
ListDelete ( h, 3 , e) ;
printf ( " (11)输出单链表h:" ) ;
DispList ( h) ;
printf ( " (12)释放单链表h\n" ) ;
DestroyList ( h) ;
return 1 ;
}
结果
单链表的基本运算如下:
(1)初始化单链表h
(2)依次采用尾插法插入a,b,c,d,e元素
(3)输出单链表h:a b c d e
(4)单链表h长度:5
(5)单链表h为非空
(6)单链表h的第3个元素:c
(7)元素a的位置:1
(8)在第4个元素位置上插入f元素
(9)输出单链表h:a b c f d e
(10)删除h的第3个元素
(11)输出单链表h:a b f d e
(12)释放单链表h
请按任意键继续. . .
实现双链表各种基本运算的算法
放码
dlinklist.h
# ifndef DLINKLIST_H
# define DLINKLIST_H
typedef int ElemType;
typedef struct DNode {
ElemType data;
struct DNode * prior;
struct DNode * next;
} DLinkNode;
void CreateListF ( DLinkNode * & L, ElemType a[ ] , int n) ;
void CreateListR ( DLinkNode * & L, ElemType a[ ] , int n) ;
void InitList ( DLinkNode * & L) ;
void DestroyList ( DLinkNode * & L) ;
bool ListEmpty ( DLinkNode * L) ;
int ListLength ( DLinkNode * L) ;
void DispList ( DLinkNode * L) ;
bool GetElem ( DLinkNode * L, int i, ElemType & e) ;
int LocateElem ( DLinkNode * L, ElemType e) ;
bool ListInsert ( DLinkNode * & L, int i, ElemType e) ;
bool ListDelete ( DLinkNode * & L, int i, ElemType & e) ;
# endif
dlinklist.cpp
# include <stdio.h>
# include <malloc.h>
# include "dlinklist.h"
void CreateListF ( DLinkNode * & L, ElemType a[ ] , int n)
{
DLinkNode * s;
L = ( DLinkNode * ) malloc ( sizeof ( DLinkNode) ) ;
L-> prior = L-> next = NULL ;
for ( int i = 0 ; i < n; i++ ) {
s = ( DLinkNode * ) malloc ( sizeof ( DLinkNode) ) ;
s-> data = a[ i] ;
s-> next = L-> next;
if ( L-> next != NULL ) L-> next-> prior = s;
L-> next = s;
s-> prior = L;
}
}
void CreateListR ( DLinkNode * & L, ElemType a[ ] , int n)
{
DLinkNode * s, * r;
L = ( DLinkNode * ) malloc ( sizeof ( DLinkNode) ) ;
L-> prior = L-> next = NULL ;
r = L;
for ( int i = 0 ; i < n; i++ ) {
s = ( DLinkNode * ) malloc ( sizeof ( DLinkNode) ) ;
s-> data = a[ i] ;
r-> next = s;
s-> prior = r;
r