#include
#include
#include
//带头结点的链表
/**
带头结点的链表
带头结点的好处:
(1)由于开始节点的位置被存放在头结点的指针域中,所以在链表的第一个位置上的操作和在表中的其他位置上的操作一致,无需特殊处理。
(2)无论链表是否为空,其头指针都指向头结点的非空指针(空表中头结点的指针域为空),因此空表和非空表的处理也就得到了统一。
*/
typedef struct Node {
int data;
struct Node * pNext;
} LinkList, *PNode;
//1.创建链表 头插法
LinkList * createLinkListWithHeadInsert( );
//1.1创建链表 尾插法
LinkList * createLinkListWithTailInsert();
//2.销毁链表
void clear( LinkList * pLinkList );
//3.便利链表
void display( LinkList * pLinkList );
//4.是否为空
bool isEmpty( LinkList * pLinkList );
//5.判断长度
int length( LinkList * pLinkList );
//5.1获取指定位置的元素
bool getItem( LinkList * pLinkList, int position, int * pValue );
//5.2获取指定元素的位置
int locateItem( LinkList * pLinkList, int value );
//6.1追加
bool append( LinkList * pLinkList, int value );
//6.插入
bool insert( LinkList * pLinkList, int position, int value );
//7.删除
bool remove( LinkList * pLinkList, int position, int * pValue );
//8.排序
void sort( LinkList * pLinkList );
//9.翻转
void reverse( LinkList * pLinkList );
int main(){
//头插法创建链表
LinkList * pLinkList = createLinkListWithHeadInsert();
//遍历
display( pLinkList );
//是否为空
bool isempty = isEmpty( pLinkList );
if( isempty ){
printf("链表为空\n");
}else {
printf("链表不为空\n");
}
//获取长度
int len =length( pLinkList );
printf("当前链表长度: %d\n",len);
//清空
clear(pLinkList);
//是否为空
isempty = isEmpty( pLinkList );
if( isempty ){
printf("链表为空\n");
}else {
printf("链表不为空\n");
}
//获取长度
len = length( pLinkList );
printf("当前链表长度: %d\n",len);
//尾插法建立链表
pLinkList = createLinkListWithTailInsert();
display(pLinkList);
//追加
append( pLinkList, 3 );
display(pLinkList);
//获取长度
len = length( pLinkList );
printf("当前链表长度: %d\n",len);
len = length(pLinkList);
int endValue;
getItem(pLinkList, len, &endValue);
printf("末尾值:%d\n", endValue);
int position = locateItem(pLinkList, 4);
if( position == -1 ){
printf("链表中不存在该值的节点\n");
}
else {
printf("值为4的元素的位置为:%d\n",position);
}
//插入
printf("插入前: ");
display(pLinkList);
bool isInsert = insert(pLinkList, 3, 88);
if( isInsert ){
printf("插入成功,插入位置:%d,插入值%d\n",3,88);
}else {
printf("插入失败\n");
}
printf("删除前: ");
display(pLinkList);
//删除
int removeValue;
bool isDelete = remove( pLinkList, 3, &removeValue );
if( isDelete ){
printf("删除成功,删除元素值为:%d\n",removeValue);
}else {
printf("删除失败,删除位置不存在\n");
}
//逆序
display(pLinkList);
reverse(pLinkList);
display(pLinkList);
//排序
sort( pLinkList );
display(pLinkList);
return 1;
}
//1.创建链表 头插法
LinkList* createLinkListWithHeadInsert( ){
//创建头结点
PNode pHead = (PNode)malloc(sizeof(Node));
if( pHead == NULL ){
printf("头结点创建失败\n");
exit(-1);
}
pHead->pNext = NULL;
for( int i=0; i<10; i++ ){
PNode pNode = (PNode)malloc(sizeof(Node));
if( pNode == NULL ){
printf("节点创建失败\n");
exit(-1);
}
pNode->pNext = pHead->pNext;
pHead->pNext = pNode;
pNode->data = i;
}
return pHead;
}
//1.1创建链表 尾插法
LinkList * createLinkListWithTailInsert(){
PNode pHead = (PNode)malloc(sizeof(PNode));
if( pHead == NULL ){
printf("头结点创建失败\n");
}
PNode tail = pHead;
for( int i=0; i<10; i++ ){
PNode pNode = (PNode)malloc(sizeof(PNode));
if( pNode == NULL ){
printf("节点创建失败\n");
}
tail->pNext = pNode;
pNode->pNext = NULL;
tail = pNode;
pNode->data = i;
}
return pHead;
}
//2.销毁链表
void clear( LinkList * pLinkList ){
PNode p = NULL;
while( pLinkList->pNext != NULL ){
p = pLinkList->pNext;
pLinkList->pNext = p->pNext;
free(p);
}
printf("链表销毁成功\n");
}
//3.遍历链表
void display( LinkList * pLinkList ){
//pLinkList是指向头结点的
PNode p = pLinkList;
while( p->pNext != NULL ){
printf("%d ", p->pNext->data);
p = p->pNext;
}
printf("\n");
}
//4.是否为空
bool isEmpty( LinkList * pLinkList ){
if( pLinkList->pNext == NULL ){
return true;
}
return false;
}
//5.判断长度
int length( LinkList * pLinkList ){
int length = 0;
PNode pNode = pLinkList;
while( pNode->pNext != NULL ){
length ++;
pNode = pNode->pNext;
}
return length;
}
//5.1获取指定位置的元素
bool getItem( LinkList * pLinkList, int position, int * pValue ){
//不知道链表长度,没办法一开始就判断position位置是否正确
if( position < 1 ){
printf("插入位置不正确");
return false;
}
int i = 1; //顺序表的起始位置
while( pLinkList->pNext != NULL ){
if( i == position ){
*pValue = pLinkList->pNext->data;
return true;
}
i++;
pLinkList = pLinkList->pNext;
}
return false;
}
//5.2获取指定元素的位置
int locateItem( LinkList * pLinkList, int value ){
int i=1;
while( pLinkList->pNext != NULL ){
if( pLinkList->pNext->data == value ){
return i;
}
i++;
pLinkList = pLinkList->pNext;
}
return -1;
}
//6.1追加
bool append( LinkList * pLinkList, int value ) {
//链表不用判断满
PNode pNode = (PNode)malloc(sizeof(PNode));
if( pNode == NULL ){
printf("节点创建失败\n");
return false;
}
pNode->data = value;
while( pLinkList->pNext != NULL ){
pLinkList = pLinkList->pNext;
}
pLinkList->pNext = pNode;
pNode->pNext = NULL;
return true;
}
//6.插入
bool insert( LinkList * pLinkList, int position, int value ){
if( position <1 ){
printf("插入位置不合理");
return false;
}
int i=1;
while( pLinkList->pNext != NULL ){
if( i == position ){
PNode pNode = (PNode)malloc(sizeof(PNode));
if( pNode == NULL ){
printf("创建节点失败");
exit(-1);
}
pNode->data = value;
pNode->pNext = pLinkList->pNext->pNext;
pLinkList->pNext->pNext = pNode;
return true;
}
i++;
pLinkList = pLinkList->pNext;
}
return false;
}
//7.删除
bool remove( LinkList * pLinkList, int position, int * pValue ){
if( position < 1 ){
printf("删除位置不合理\n");
return false;
}
int i = 1;
while( pLinkList->pNext != NULL ){
if( i == position ){
*pValue = pLinkList->pNext->data;
PNode p = pLinkList->pNext;
pLinkList->pNext = pLinkList->pNext->pNext;
return true;
}
i++;
pLinkList = pLinkList->pNext;
}
return false;
}
//8.排序
void sort( LinkList * pLinkList ){
for( PNode i=pLinkList->pNext; i!=NULL; i=i->pNext ){
for( PNode j=i->pNext; j!=NULL; j=j->pNext ){
if( i->data > j->data ){
int temp = i->data;
i->data = j->data;
j->data = temp;
}
}
}
}
//9.翻转
void reverse( LinkList * pLinkList ) {
//永远指向pLinkList未改变顺序时的第一个节点
PNode pFirst = pLinkList->pNext;
PNode p = NULL;
while( pFirst->pNext != NULL ){
//将节点的后一个节点移除。
p = pFirst->pNext;
pFirst->pNext = pFirst->pNext->pNext;
//别移除的节点指向pFirst节点
p->pNext = pLinkList->pNext;
//让头指针指向p节点
pLinkList->pNext = p;
}
}
标签:pLinkList,结点,真机,int,链表,C语言,LinkList,printf,pNext
来源: https://blog.csdn.net/qq_36723759/article/details/88929751