C语言实现带头结点的链表的创建、查找、插入、删除操作
本文实例讲述了C语言实现带头结点的链表的创建、查找、插入、删除操作。是数据结构中链表部分的基础操作。分享给大家供大家参考。具体方法如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node* next;// 这个地方注意结构体变量的定义规则
} Node, *PNode;
Node* createLinklist(int length)
{
int i = 0;
PNode pHeader = NULL;
PNode pTail = NULL;
PNode pTemp = 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;
}
return pHeader;
}
Node* search(PNode pHeader, int k)
{
PNode p = pHeader->next;
int i = 1;
printf("search\n");
while(p && (i < k))
{
p = p->next;
i++;
}
if (p && (i == k)) // 这步的i == k是必须的,
// 因为如果一开始的时候 i就 >= k并且pHeader->next还不为NULL这一步就会必过,导致返回的是第一个元素的值
{
return p;
}
return NULL;
}
int insert(PNode pHeader, PNode pNew, int k)
{
PNode p = 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;
return 1;
}
return 0;
}
int deleteNode(PNode pHeader, int k)
{
PNode p = 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);
// 带头结点的操作如下
PNode temp = p->next;
p->next = temp->next;
free(temp);
return 1;
}
else
{
printf("Not Found\n");
return 0;
}
}
void print(PNode pHeader)
{
PNode p = pHeader->next;
printf("print\n ");
while(p)
{
printf("%4d ", p->data);
p = p->next;
}
putchar('\n');
}
void freeList(PNode pH)
{
PNode p = NULL;
printf("freeList\n");
while(NULL != pH)
{
p = pH;
pH = pH->next;
printf("%4d be freed\n", p->data);
free(p);
}
}
int main(void)
{
PNode pHeader = NULL;// C和C++中判断指针为空都是用NULL宏(全大写)
PNode pNew = NULL;
PNode result = NULL;
pHeader = createLinklist(10);
print(pHeader);
result = search(pHeader, 5);
if ( result )
{
printf("%d\n", result->data);
}
else
{
printf("Not Found\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);
return 0;
}
上述实例备有较为详尽的注释,相信不难理解。希望本文所述对大家C程序数据结构与算法设计有所帮助。
以上是 C语言实现带头结点的链表的创建、查找、插入、删除操作 的全部内容, 来源链接: utcz.com/z/340612.html