C說話完成帶頭結點的鏈表的創立、查找、拔出、刪除操作。本站提示廣大學習愛好者:(C說話完成帶頭結點的鏈表的創立、查找、拔出、刪除操作)文章只能為提供參考,不一定能成為您想要的結果。以下是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法式數據構造與算法設計有所贊助。