作业标题
单链表的增删查改
一、定义三个文件
二、代码实现
LinkList.c部分
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <errno.h>
#include <ctype.h>
#include <assert.h>
#include "LinkList.h"
void text2()
{
LinkList* head = NULL;
for (int i = 0; i < 3; i++)
{
LinkListPushBack(&head, i);
}
PrintLinkList(head);
for (int i = 3; i < 6; i++)
{
LinkListPushFront(&head, i);
}
PrintLinkList(head);
LinkListPopBack(&head);
PrintLinkList(head);
LinkListPopBack(&head);
PrintLinkList(head);
LinkListPopBack(&head);
PrintLinkList(head);
LinkListPopFront(&head);
PrintLinkList(head);
LinkListPopFront(&head);
PrintLinkList(head);
LinkList* pos1 = LinkListFind(head, 3);
if (pos1)
{
printf("找到了:%p\n", pos1);
}
pos1->data = 10;
PrintLinkList(head);
LinkListInsertBefor(&head, pos1, 30);
PrintLinkList(head);
LinkList* pos2 = LinkListFind(head, 10);
if (pos2)
{
printf("找到了:%p\n", pos2);
}
LinkListInsertBefor(&head, pos2, 20);
PrintLinkList(head);
LinkListInsertAfter(pos2, 0);
PrintLinkList(head);
LinkListErase(&head, pos2);
PrintLinkList(head);
LinkList* pos3 = LinkListFind(head, 30);
if (pos3)
{
printf("找到了:%p\n", pos3);
}
LinkListErase(&head, pos3);
PrintLinkList(head);
LinkList* pos4 = LinkListFind(head, 20);
if (pos4)
{
printf("找到了:%p\n", pos4);
}
LinkListEraseAfter(&head, pos4);
PrintLinkList(head);
LinkListEraseAfter(&head, pos4);
PrintLinkList(head);
LinkListDistroy(&head);
}
int main()
{
text2();
return 0;
}
LinkList.h部分
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <errno.h>
#include <ctype.h>
#include <assert.h>
//1.定义结构体
typedef struct LinkList
{
int data;
struct LinkList* next;
}LinkList;
//2.打印链表函数声明
void PrintLinkList(LinkList* head);
//3.尾插函数声明
void LinkListPushBack(LinkList** head, int x);
//4.头插函数声明
void LinkListPushFront(LinkList** head, int x);
//5.尾删函数声明
void LinkListPopBack(LinkList** head);
//6.头删函数声明
void LinkListPopFront(LinkList** head);
//7.查找函数声明
LinkList* LinkListFind(LinkList* head, int x);
//8.中间插值函数(在节点前插入)声明
void LinkListInsertBefor(LinkList** head, LinkList* pos, int x);
//9.中间插值函数(在节点后插入)声明
void LinkListInsertAfter(LinkList* pos, int x);
//10.删除函数声明
void LinkListErase(LinkList** head, LinkList* pos);
//11.删除函数(删除节点之后的数据)声明
void LinkListEraseAfter(LinkList** head, LinkList* pos);
//12.回收空间函数声明
void LinkListDistroy(LinkList** head);
LinkListFunc.c部分
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <errno.h>
#include <ctype.h>
#include <assert.h>
#include "LinkList.h"
//2.打印链表函数实现
void PrintLinkList(LinkList* head)
{
LinkList* cur = head;
while (cur != NULL)
{
printf("%d->", cur->data);
cur = cur->next;
}
printf("NILL\n");
}
//3.1创造节点函数实现
LinkList* BuyLinkListNode(int x)
{
LinkList* newnode = (LinkList*)malloc(sizeof(LinkList));
if (newnode == NULL)
{
printf("malloc fail\n");
exit(-1);
}
else
{
newnode->data = x;
newnode->next = NULL;
}
return newnode;
}
//3.尾插函数实现
void LinkListPushBack(LinkList** head, int x)
{
assert(head);
LinkList* newnode = BuyLinkListNode(x);
if (*head == NULL)
{
*head = newnode;
}
else
{
LinkList* tail = *head;
while (tail->next != NULL)
{
tail = tail->next;
}
tail->next = newnode;
}
}
//4.头插函数实现
void LinkListPushFront(LinkList** head, int x)
{
LinkList* newnode = BuyLinkListNode(x);
newnode->next = *head;
*head = newnode;
}
///5.尾删函数实现
void LinkListPopBack(LinkList** head)
{
assert(head);
//5.1没有节点时
if (*head == NULL)
{
return;
}
//5.2当只有一个节点的时候
if ((*head)->next == NULL)
{
free(*head);
*head = NULL;
return;
}
LinkList* tail = *head;
while (tail->next->next != NULL)
{
tail = tail->next;
}
free(tail->next);
tail->next = NULL;
}
//6.头删函数实现
void LinkListPopFront(LinkList** head)
{
assert(head);
if (*head == NULL)
{
return;
}
else
{
LinkList* next = (*head)->next;
free(*head);
*head = next;
}
}
//7.查找函数实现
LinkList* LinkListFind(LinkList* head, int x)
{
LinkList* cur = head;
while (cur != NULL)
{
if (cur->data == x)
{
return cur;
}
cur = cur->next;
}
return NULL;
}
//8.中间插值函数实现
void LinkListInsertBefor(LinkList** head, LinkList* pos, int x)
{
assert(head);
assert(pos);
if (pos == *head)
{
LinkListPushFront(head, x);
}
else
{
LinkList* pre = *head;
while (pre->next != pos)
{
pre = pre->next;
}
LinkList* newnode = BuyLinkListNode(x);
pre->next = newnode;
newnode->next = pos;
}
}
//9.中间插值函数(再节点后插入)实现
void LinkListInsertAfter(LinkList* pos, int x)
{
assert(pos);
LinkList* newnode = BuyLinkListNode(x);
newnode->next = pos->next;
pos->next = newnode;
}
//10.中间删除函数实现
void LinkListErase(LinkList** head, LinkList* pos)
{
assert(head);
assert(pos);
LinkList* pre = *head;
if (pos == *head)
{
LinkListPopFront(head);
}
else
{
while (pre->next != pos)
{
pre = pre->next;
}
pre->next = pos->next;
free(pos);
pos = NULL;
}
}
//11.删除函数(删除节点之后的数据)实现
void LinkListEraseAfter(LinkList** head, LinkList* pos)
{
assert(head);
LinkList* NodeNext = pos->next;
if (NodeNext)
{
pos->next = NodeNext->next;
free(NodeNext);
NodeNext = NULL;
}
}
//12.回收空间函数实现
void LinkListDistroy(LinkList** head)
{
assert(head);
LinkList* cur = *head;
LinkList* NodeNext = NULL;
while (cur)
{
NodeNext = cur->next;
free(cur);
cur = NodeNext;
}
*head = NULL;
printf("回收空间成功\n");
}