单链表的实现:
头文件list.h
#ifndef __LIST_H
#define __LIST_H
#include
#include
#include
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node* next;
}Node, *pNode, *pList;
void InitList(pList* pplist);
void PushBack(pList* pplist, DataType d);
void PushFront(pList* pplist, DataType d);
void PopBack(pList* pplist);
void PopFront(pList* pplist);
int GetListLength(pList plist);
void PrintfList(plist);
pNode Find(pList plist, DataType d);
void Remove(pList* pplist, DataType d);
void RemoveAll(pList* pplist, DataType d);
void Insert(pList* pplist, pNode pos, DataType d);
void Erase(pList* pplist, pNode pos);
void DestroyList(pList* pplist);
#endif
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "list.h"
void menu()
{
printf("************* 单链表 **************\n");
printf("*** 1.InitList 2.PushBack ****\n");
printf("*** 3.PushFron 4.PopBack ****\n");
printf("*** 5.PopFront 6.GetListLength ****\n");
printf("*** 7.PrintfList 8.Find ****\n");
printf("*** 9.Remove 10.RemoveAll ****\n");
printf("*** 11.Insert 12.Erase ****\n");
printf("*** 13.DestroyList 0.Exit ****\n");
printf("**********************************************\n");
}
int main()
{
int input = 0;
pList plist = NULL;
pList ret = 0;
do{
menu();
DataType data = 0;
printf("请输入你的选择:");
scanf("%d", &input);
switch (input)
{
case 1:
InitList(&plist);
break;
case 2:
printf("请输入要插入的元素:");
scanf("%d", &data);
PushBack(&plist, data);
break;
case 3:
printf("请输入要插入的元素:");
scanf("%d", &data);
PushFront(&plist, data);
break;
case 4:
PopBack(&plist);
break;
case 5:
PopFront(&plist);
break;
case 6:
GetListLength(plist);
break;
case 7:
PrintfList(plist);
break;
case 8:
{
printf("请输入要查找的元素:");
scanf("%d", &data);
ret = Find(plist, data);
if (ret == NULL)
{
printf("查找的数据不存在\n");
}
else
{
printf("找到了该元素为:%d\n", ret->data);
}
}
break;
case 9:
printf("请输入要删除的元素:");
scanf("%d", &data);
Remove(&plist, data);
break;
case 10:
printf("请输入要删除的元素:");
scanf("%d", &data);
RemoveAll(&plist, data);
break;
case 11:
printf("请输入要插入的位置:");
scanf("%d", &data);
ret = Find(plist, data);
if (ret == NULL)
{
printf("查找的数据不存在\n");
}
else
{
printf("请输入要插入的数:");
scanf("%d", &data);
Insert(&plist, ret, data);
}
break;
case 12:
printf("请输入要删除的位置:");
scanf("%d", &data);
ret = Find(plist, data);
if (ret == NULL)
{
printf("需要删除的数据不存在\n");
}
else
{
Erase(&plist, ret);
}
break;
case 13:
DestroyList(&plist);
break;
case 0:
exit;
break;
default:
printf("选择错误,请重新输入\n");
break;
}
} while (input);
return 0;
}
list.c
#include "list.h"
void InitList(pList* pplist)
{
assert(pplist != NULL);
*pplist = NULL;
printf("初始化成功\n");
}
pNode BuyNode(DataType d)
{
pNode pnode = (pNode)malloc(sizeof(Node));
if (pnode == NULL)
{
perror("malloc");
return NULL;
}
pnode->data = d;
pnode->next = NULL;
return pnode;
}
void PushBack(pList* pplist, DataType d)
{
assert(pplist != NULL);
pNode pNewNode = BuyNode(d);
if (*pplist == NULL) //没有结点
{
*pplist = pNewNode;
printf("插入元素成功\n");
}
else
{
pNode cur = *pplist;
while (cur->next != NULL)
{
cur = cur->next;
}
cur->next = pNewNode;
printf("插入元素成功\n");
}
}
void PushFront(pList* pplist, DataType d)
{
assert(pplist != NULL);
pNode pNewNode = BuyNode(d);
if (*pplist == NULL) //没有结点
{
*pplist = pNewNode;
printf("插入元素成功\n");
}
else
{
pNewNode->next = *pplist;
*pplist = pNewNode;
printf("插入元素成功\n");
}
}
void PopBack(pList* pplist)
{
pNode cur = *pplist;
assert(pplist != NULL);
if (cur == NULL)
{
printf("该链表为空\n");
return;
}
if (cur->next==NULL)
{
free(cur);
*pplist = NULL;
return;
}
while (cur->next->next != NULL)
{
cur = cur->next;
}
free(cur->next);
cur->next = NULL;
printf("删除成功\n");
}
void PopFront(pList* pplist)
{
pNode cur = *pplist;
pNode del = NULL;
assert(pplist != NULL);
if (cur == NULL)
{
printf("该链表为空\n");
return;
}
if (cur->next == NULL)
{
free(cur);
*pplist = NULL;
return;
}
del = *pplist;
*pplist = cur->next;
free(del);
printf("删除成功\n");
}
int GetListLength(pList plist)
{
pNode cur = plist;
int count = 0;
while (cur)
{
count++;
cur = cur->next;
}
printf("该链表的元素个数为:%d\n", count);
}
pNode Find(pList plist, DataType d)
{
pNode cur = plist;
while (cur)
{
if (cur->data == d)
{
return cur;
}
cur = cur->next;
}
return NULL;
}
void Remove(pList* pplist, DataType d)
{
pNode cur = *pplist;
pNode prev = NULL;
while (cur)
{
pNode del = NULL;
if (cur->data == d)
{
if (cur == *pplist) //第一个
{
del = *pplist;
*pplist = cur->next;
free(del);
printf("该数据删除成功\n");
}
else //非第一个
{
prev->next = cur->next;
free(cur);
printf("该数据删除成功\n");
}
return;
}
prev = cur;
cur = cur->next;
}
if (cur== NULL)
{
printf("该数据不存在\n");
}
}
void RemoveAll(pList* pplist, DataType d)
{
pNode cur = *pplist;
pNode prev = NULL;
pNode del = cur;
if (cur == NULL)
{
printf("该数据不存在\n");
}
while (cur)
{
pNode del = NULL;
if (cur->data == d)
{
if (cur == *pplist) //第一个
{
del = *pplist;
*pplist = cur->next;
}
else //非第一个
{
prev->next = cur->next;
free(del);
}
prev = cur;
cur = cur->next;
}
else
{
prev = cur;
cur = cur->next;
}
}
printf("该数据删除成功\n");
}
void Insert(pList* pplist, pNode pos, DataType d)
{
pNode newNode = BuyNode(d);
assert(pplist);
if (pos == NULL)
{
PushBack(pplist, d);
}
else
{
newNode->next = pos->next;
pos->next = newNode;
printf("插入成功\n");
}
}
void Erase(pList* pplist, pNode pos)
{
assert(pplist);
if (*pplist == NULL)
{
return;
}
else
{
if (pos->next == NULL)
{
PopBack(pplist);
}
else
{
pNode del = pos->next;
pos->data = pos->next->data;
pos->next = pos->next->next;
free(del);
}
}
}
void DestroyList(pList* pplist)
{
pNode cur = *pplist;
assert(pplist);
while (cur)
{
pNode del = cur;
cur = cur->next;
free(del);
}
*pplist = NULL;
printf("销毁成功\n");
}
void PrintfList(pList plist)
{
pNode cur = plist;
if (cur == NULL)
{
printf("该链表为空\n");
return;
}
else
{
while (cur != NULL)
{
printf(" %d", cur->data);
cur = cur->next;
}
printf("\n");
}
}