1、链表插入和删除等操作
关键是要找到插入元素的前一个元素
Status ListInsert ( LinkList L, int i, ElemType e)
{
LinkList N = new Node ( ) ;
N- > data = e;
int j = 1 ;
LinkList p = L;
while ( ( j < i ) && ( p) )
{
p = p- > next;
j++ ;
}
if ( ! p)
return ERROR;
N- > next = p- > next;
p- > next = N;
}
2 、完整代码
#include "stdio.h"
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20
typedef int Status;
typedef int ElemType;
Status visit ( ElemType c)
{
printf ( "%d " , c) ;
return OK;
}
typedef struct Node
{
ElemType data;
struct Node* next;
} Node;
typedef struct Node * LinkList;
Status InitList ( LinkList * L)
{
* L = new Node ( ) ;
( * L) - > next = NULL ;
return OK;
}
Status ListEmpty ( LinkList L)
{
if ( L- > next)
return FALSE;
else
return TRUE;
}
Status ClearList ( LinkList * L)
{
LinkList p, q;
p = ( * L) - > next;
while ( p)
{
q = p- > next;
delete p;
p = q;
}
( * L) - > next = NULL ;
return OK;
}
int ListLength ( LinkList L)
{
int i = 0 ;
LinkList p = L- > next;
while ( p)
{
i++ ;
p = p- > next;
}
return i;
}
Status GetElem ( LinkList L, int i, ElemType* e)
{
int j = 1 ;
LinkList p;
p = L- > next;
while ( p && j < i)
{
p = p- > next;
j++ ;
}
if ( ! p || j > i)
return ERROR;
* e = p- > data;
return OK;
}
int LocateElem ( LinkList L, ElemType e)
{
int i = 0 ;
LinkList p = L- > next;
while ( p)
{
i++ ;
if ( p- > data == e)
return i;
p = p- > next;
}
return 0 ;
}
Status ListInsert ( LinkList * L, int i, ElemType e)
{
LinkList N = new Node ( ) ;
N- > data = e;
int j = 1 ;
LinkList p = * L;
while ( ( j < i ) && ( p) )
{
p = p- > next;
j++ ;
}
if ( ! p)
return ERROR;
N- > next = p- > next;
p- > next = N;
}
Status ListDelete ( LinkList * L, int i, ElemType* e)
{
int j = 1 ;
LinkList p = ( * L) ;
LinkList q;
while ( ( p- > next) && ( j < i) )
{
p = p- > next;
j++ ;
}
if ( ! p- > next)
return ERROR;
* e = p- > next- > data;
q = p- > next;
p- > next = p- > next- > next;
delete q;
return OK;
}
Status ListTraverse ( LinkList L)
{
LinkList p = L- > next;
while ( p)
{
visit ( p- > data) ;
p = p- > next;
}
printf ( "\n" ) ;
return OK;
}
void CreateListTail ( LinkList * L, int n)
{
LinkList p = * L;
for ( int i = 0 ; i < n; i++ )
{
Node* N = new Node ( ) ;
N- > data = i;
p- > next = N;
p = p- > next;
p- > next = NULL ;
}
}
void CreateListHead ( LinkList * L, int n)
{
LinkList p = ( * L) - > next;
for ( int i = 0 ; i < n; i++ )
{
Node* N = new Node ( ) ;
N- > data = i;
N- > next = p;
( * L) - > next = N;
p = N;
}
}
int main ( )
{
LinkList L = NULL ;
ElemType e;
Status i;
int j;
int k;
i = InitList ( & L) ;
printf ( "初始化后:ListLength(L) = %d \n" , ListLength ( L) ) ;
for ( int j = 1 ; j <= 5 ; j++ )
{
int i = ListInsert ( & L, 1 , j) ;
}
printf ( "在L的表头依次插入1~5后:L.data=" ) ;
ListTraverse ( L) ;
printf ( "ListLength(L)=%d \n" , ListLength ( L) ) ;
i = ListEmpty ( L) ;
printf ( "L是否空:i=%d(1:是 0:否)\n" , i) ;
i = ClearList ( & L) ;
printf ( "清空L后:ListLength(L)=%d\n" , ListLength ( L) ) ;
i = ListEmpty ( L) ;
printf ( "L是否空:i=%d(1:是 0:否)\n" , i) ;
for ( int j = 1 ; j <= 10 ; j++ )
ListInsert ( & L, j, j) ;
printf ( "在L的表尾依次插入1~10后:L.data=" ) ;
ListTraverse ( L) ;
printf ( "ListLength(L)=%d \n" , ListLength ( L) ) ;
ListInsert ( & L, 1 , 0 ) ;
printf ( "在L的表头插入0后:L.data=" ) ;
ListTraverse ( L) ;
printf ( "ListLength(L)=%d \n" , ListLength ( L) ) ;
GetElem ( L, 5 , & e) ;
printf ( "第5个元素的值为:%d\n" , e) ;
for ( int j = 3 ; j <= 4 ; j++ )
{
k = LocateElem ( L, j) ;
if ( k)
printf ( "第%d个元素的值为%d\n" , k, j) ;
else
printf ( "没有值为%d的元素\n" , j) ;
}
k = ListLength ( L) ;
for ( int j = k + 1 ; j >= k; j-- )
{
i = ListDelete ( & L, j, & e) ;
if ( i == ERROR)
printf ( "删除第%d个数据失败\n" , j) ;
else
printf ( "删除第%d个的元素值为:%d\n" , j, e) ;
}
printf ( "依次输出L的元素:" ) ;
ListTraverse ( L) ;
j = 5 ;
ListDelete ( & L, j, & e) ;
printf ( "删除第%d个的元素值为:%d\n" , j, e) ;
printf ( "依次输出L的元素:" ) ;
ListTraverse ( L) ;
i = ClearList ( & L) ;
printf ( "\n清空L后:ListLength(L)=%d\n" , ListLength ( L) ) ;
CreateListHead ( & L, 20 ) ;
printf ( "整体创建L的元素(头插法):" ) ;
ListTraverse ( L) ;
i = ClearList ( & L) ;
printf ( "\n删除L后:ListLength(L)=%d\n" , ListLength ( L) ) ;
CreateListTail ( & L, 20 ) ;
printf ( "整体创建L的元素(尾插法):" ) ;
ListTraverse ( L) ;
}