c语言头结点作用,数据结构--C语言--带头结点的单链表 (已过真机)

#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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值