代码实现
# include <stdio.h>
# include <stdlib.h>
# include <stdbool.h>
# define ElemType int
typedef struct LNode { ElemType data; struct LNode * next;
} LNode, * LinkList;
bool Empty ( LinkList L) ;
void InitList ( LinkList * L) { * L = ( LinkList) malloc ( sizeof ( LNode) ) ; ( * L) -> next = NULL ;
}
LinkList ListInsert_Head ( LinkList * L) { InitList ( L) ; ElemType Elem; printf ( "请输入要插入的元素数据(输入0结束):" ) ; scanf ( "%d" , & Elem) ; while ( Elem != 0 ) { LinkList newNode = ( LinkList) malloc ( sizeof ( LNode) ) ; newNode-> data = Elem; newNode-> next = ( * L) -> next; ( * L) -> next = newNode; scanf ( "%d" , & Elem) ; } return * L;
}
LinkList ListInsert_Tail ( LinkList * L) { InitList ( L) ; ElemType Elem; LNode * p, * r = ( * L) ; printf ( "请输入要插入的元素(输入0结束):" ) ; scanf ( "%d" , & Elem) ; while ( Elem != 0 ) { p = ( LinkList) malloc ( sizeof ( LNode) ) ; p-> data = Elem; p-> next = NULL ; r-> next = p; r = p; scanf ( "%d" , & Elem) ; } return * L;
}
int Length ( LinkList L) { LNode * p = L-> next; int num = 0 ; while ( p != NULL ) { num++ ; p = p-> next; } return num;
}
LNode * LocateElem ( LinkList L, ElemType Elem) { LNode * p = L-> next; while ( p != NULL && p-> data != Elem) { p = p-> next; } return p;
}
LNode * GetElem ( LinkList L, int index) { LNode * p = L-> next; if ( index > Length ( L) ) { printf ( "索引超出链表长度!\n" ) ; return NULL ; } while ( index > 1 ) { p = p-> next; index-- ; } return p;
}
void ListInsert ( LinkList * L, int index, ElemType Elem) { if ( index > Length ( * L) ) { printf ( "索引超出链表长度!\n" ) ; return ; } LNode * p = ( * L) ; LinkList new; InitList ( & new) ; new-> data = Elem; while ( index > 1 ) { p = p-> next; index-- ; } new-> next = p-> next; p-> next = new;
}
void ListDelete ( LinkList * L, int index) { if ( index > Length ( * L) ) { printf ( "索引超出链表长度!\n" ) ; return ; } if ( Empty ( * L) ) { printf ( "删除失败,链表为空!\n" ) ; return ; } LNode * p = ( * L) ; while ( index > 1 ) { p = p-> next; index-- ; } p-> next = p-> next-> next;
}
bool Empty ( LinkList L) { if ( L == NULL || L-> next == NULL ) { return true; } return false;
}
void DestroyList ( LinkList * L) { LNode * p = ( * L) ; while ( p != NULL ) { LNode * temp = p; p = p-> next; free ( temp) ; } * L = NULL ; }
void PrintList ( LinkList L) { if ( Empty ( L) ) { printf ( "链表为空!\n" ) ; return ; } LNode * p = L-> next; printf ( "链表中的元素为:" ) ; while ( p != NULL ) { printf ( "%d " , p-> data) ; p = p-> next; } printf ( "\n" ) ;
} int main ( ) { LinkList head; ElemType Elem; int index;
head = ListInsert_Tail ( & head) ; PrintList ( head) ; printf ( "链表长度为:%d\n" , Length ( head) ) ; printf ( "请输入要查找的元素的值:" ) ; scanf ( "%d" , & Elem) ; printf ( "值为%d的元素的值为%d\n" , Elem, LocateElem ( head, Elem) -> data) ; printf ( "请输入要查找的元素的位置:" ) ; scanf ( "%d" , & index) ; printf ( "位置为%d的元素的值为%d\n" , index, GetElem ( head, index) -> data) ; printf ( "请输入要插入的元素的位置:" ) ; scanf ( "%d" , & index) ; printf ( "请输入要插入的元素的值:" ) ; scanf ( "%d" , & Elem) ; ListInsert ( & head, index, Elem) ; printf ( "插入元素后的链表:\n" ) ; PrintList ( head) ; printf ( "请输入要删除的元素的位置:" ) ; scanf ( "%d" , & index) ; ListDelete ( & head, index) ; printf ( "删除元素后的链表:\n" ) ; PrintList ( head) ; DestroyList ( & head) ; printf ( "销毁后的链表:\n" ) ; PrintList ( head) ;
}