實現無頭結點單鏈表的基本操作函式
阿新 • • 發佈:2019-02-03
什麼是無頭結點連結串列???
singlelinkedlist.h標頭檔案
#ifndef __SINGLELINKEDLIST_H__
#include<stdio.h>
#include<windows.h>
#include<assert.h>
typedef int DataType;
typedef struct ListNode
{
DataType data;
struct ListNode *next;
}ListNode;
ListNode *InitList(DataType num);//初始化並賦值
void PushBack(ListNode **pplist, DataType num);//尾插
void PrintList(ListNode *plist);//輸出
void PopBack(ListNode **pplist);//尾刪
void PushFront(ListNode **pplist, DataType num);//頭插
void PopFront(ListNode **pplist);//頭刪
ListNode* Find(ListNode *plist, DataType num);//查詢
void Insert(ListNode** pplist, ListNode* pos, DataType x);//插入
void Erase(ListNode** pplist, ListNode* pos);//刪除
#endif//__SINGLELINKEDLIST_H__
singlelinkedlist.c實現部分
#include "singlelinkedlist.h"
ListNode *InitList(DataType num)//定義一個新的結點
{
ListNode *node = (ListNode*)malloc(sizeof(ListNode));
node->data = num;
node->next = NULL;
return node;
}
void PushBack(ListNode **pplist, DataType num)//尾插
{
if (*pplist == NULL)//空連結串列
{
*pplist = InitList(num);//定義一個結點
}
else if ((*pplist)->next == NULL)//只有一個結點
{
(*pplist)->next = InitList(num);
}
else//正常情況(多個結點)
{
ListNode *tail = *pplist;
while (tail->next)
{
tail = tail->next;//依次指向下一個結點,找到為空的尾結點
}
tail->next = InitList(num);//找到以後直接新增一個結點
}
}
void PrintList(ListNode *plist)//列印連結串列
{
ListNode *tail = plist;
while (tail)
{
printf("%d->", tail->data);
tail = tail->next;
}
printf("NULL");
printf("\n");
}
void PopBack(ListNode **pplist)//尾刪
{
if (*pplist == NULL)//空連結串列
{
return;
}
else if ((*pplist)->next == NULL)//只有一個結點,直接釋放
{
free(*pplist);
*pplist = NULL;
}
else
{
ListNode* tail = *pplist;
ListNode* pos = tail;
while (tail->next)//tail指向pos的後一個結點
{
pos = tail;
tail = tail->next;
}
free(tail);//釋放最後一個結點就相當於刪除了尾結點
tail = NULL;
pos->next = NULL;
}
}
void PushFront(ListNode **pplist, DataType num)//頭插
{
if (*pplist == NULL)//空連結串列
{
*pplist = InitList(num);
}
else
{
ListNode *tmp = InitList(num);//開闢一個新的結點
tmp->next = *pplist;//讓它指向原先的開始結點
*pplist = tmp;//pplist依然開始結點
}
}
void PopFront(ListNode **pplist)//頭刪
{
if (*pplist == NULL)//空連結串列
{
return;
}
else if ((*pplist)->next == NULL)//只有一個結點
{
*pplist = NULL;
}
else
{
ListNode *tmp = (*pplist)->next;//tmp指向原先頭結點指向的下一個位置
free(*pplist);
*pplist = tmp;
}
}
ListNode* Find(ListNode *plist, DataType num)//查詢
{
assert(plist);//斷言其是否為空連結串列
while (plist)
{
if (plist->data == num)
{
return plist;
}
plist = plist->next;
}
return NULL;
}
void Insert(ListNode** pplist, ListNode* pos, DataType num)//插入
{
assert(*pplist&&pos);
if (((*pplist)->next == NULL) || (pos == *pplist))
//只有開始結點或者是要插入的正好在開始結點的前面
{
PushFront(pplist, num);
}
else
{
ListNode* tmp = NULL;
ListNode* tail = *pplist;
while (tail->next != pos)
{
tail = tail->next;
}
tmp = InitList(num);
tail->next = tmp;
tmp->next = pos;
}
}
void Erase(ListNode** pplist, ListNode* pos)//刪除
{
assert(*pplist&&pos);
if (((*pplist)->next == NULL) || (*pplist == pos))
{
PopFront(pplist);
}
else
{
ListNode* tmp = *pplist;
while (tmp->next != pos)
{
tmp = tmp->next;
}
tmp->next = pos->next;
free(pos);
pos = NULL;
}
}
test.c測試部分
#include "singlelinkedlist.h"
void test()
{
ListNode *list = NULL;
PushBack(&list, 1);
PushBack(&list, 2);
PushBack(&list, 3);
PushBack(&list, 4);
PrintList(list);
PopBack(&list);
PrintList(list);
PopBack(&list);
PrintList(list);
PopBack(&list);
PrintList(list);
PopBack(&list);
PrintList(list);
}
void test1()
{
ListNode *list = NULL;
PushFront(&list, 1);
PushFront(&list, 2);
PushFront(&list, 3);
PushFront(&list, 4);
PushFront(&list, 5);
PrintList(list);
PopFront(&list);
PrintList(list);
PopFront(&list);
PrintList(list);
PopFront(&list);
PrintList(list);
PopFront(&list);
PrintList(list);
PopFront(&list);
PrintList(list);
}
void test2()
{
ListNode *list = NULL;
PushFront(&list, 1);
PushFront(&list, 2);
PushFront(&list, 4);
PushFront(&list, 5);
PushFront(&list, 6);
PrintList(list);
ListNode *ret = Find(list, 2);
//測試使用
/*if (ret != NULL)
{
printf("%p\n", ret);
}
else
{
printf("沒有這個值!\n");
}*/
Insert(&list, ret, 3);
PrintList(list);
Erase(&list, ret);
PrintList(list);
}
int main()
{
//test();
//test1();
test2();
system("pause");
return 0;
}
test()測試結果
test1()測試結果
test2()測試結果
下一篇還有基於單鏈表經常出的一些面試題,點選進入!!!!