C语言实现带头结点的链表的创建、查找、插入、删除操作
本文实例讲述了C语言实现带头结点的链表的创建、查找、插入、删除操作。是数据结构中链表部分的基础操作。分享给大家供大家参考。具体方法如下:
#include<stdio.h>
#include<stdlib.h>
typedefstructnode
{
intdata;
structnode*next;//这个地方注意结构体变量的定义规则
}Node,*PNode;
Node*createLinklist(intlength)
{
inti=0;
PNodepHeader=NULL;
PNodepTail=NULL;
PNodepTemp=NULL;
printf("create\n");
pHeader=(PNode)malloc(sizeof(Node));//申请头结点
if(!pHeader)
{
exit(-1);
}
pHeader->next=NULL;
for(i=0;i<length;i++)
{
pTemp=(PNode)malloc(sizeof(Node));//用malloc要包含头文件
if(!pTemp)
{
exit(-1);
}
pTemp->data=i*10;
pTemp->next=NULL;
if(!pHeader->next)
{
//第一个结点是空的,则先连接第一个结点
pHeader->next=pTemp;
}
else
{
pTail->next=pTemp;
}
pTail=pTemp;
}
returnpHeader;
}
Node*search(PNodepHeader,intk)
{
PNodep=pHeader->next;
inti=1;
printf("search\n");
while(p&&(i<k))
{
p=p->next;
i++;
}
if(p&&(i==k))//这步的i==k是必须的,
//因为如果一开始的时候i就>=k并且pHeader->next还不为NULL这一步就会必过,导致返回的是第一个元素的值
{
returnp;
}
returnNULL;
}
intinsert(PNodepHeader,PNodepNew,intk)
{
PNodep=NULL;
printf("insert\n");
if(1==k)
{
p=pHeader;
}
else
{
printf("==>");
p=search(pHeader,k-1);
}
if(p)
{
//带头结点和不带头结点的主要区别之一就在这
//如果不带头结点,那么在第一个位置插入结点的操作应该是
//pNew->next=p;
//p=pNew;
//带头结点的操作如下
pNew->next=p->next;
p->next=pNew;
return1;
}
return0;
}
intdeleteNode(PNodepHeader,intk)
{
PNodep=NULL;
printf("deleteNode\n");
if(1==k)
{
p=pHeader->next;
}
else
{
printf("==>");
p=search(pHeader,k-1);
}
if(p&&p->next)
{
//不带头结点的操作时删除第一个结点的操作
//Node*temp=p;
//p=p->next;
//free(temp);
//带头结点的操作如下
PNodetemp=p->next;
p->next=temp->next;
free(temp);
return1;
}
else
{
printf("NotFound\n");
return0;
}
}
voidprint(PNodepHeader)
{
PNodep=pHeader->next;
printf("print\n");
while(p)
{
printf("%4d",p->data);
p=p->next;
}
putchar('\n');
}
voidfreeList(PNodepH)
{
PNodep=NULL;
printf("freeList\n");
while(NULL!=pH)
{
p=pH;
pH=pH->next;
printf("%4dbefreed\n",p->data);
free(p);
}
}
intmain(void)
{
PNodepHeader=NULL;//C和C++中判断指针为空都是用NULL宏(全大写)
PNodepNew=NULL;
PNoderesult=NULL;
pHeader=createLinklist(10);
print(pHeader);
result=search(pHeader,5);
if(result)
{
printf("%d\n",result->data);
}
else
{
printf("NotFound\n");
}
pNew=(PNode)malloc(sizeof(Node));
if(!pNew)
{
exit(-1);
}
pNew->data=100;
pNew->next=NULL;
insert(pHeader,pNew,5);
print(pHeader);
deleteNode(pHeader,12);
print(pHeader);
freeList(pHeader);
return0;
}
上述实例备有较为详尽的注释,相信不难理解。希望本文所述对大家C程序数据结构与算法设计有所帮助。