线性表:n个相同类型的数据元素的有限序列
第一个元素没有直接前驱,最后一个元素没有直接后继,除此之外每个数据元素都已一个直接前驱和直接后继
线性表的存储结构:顺序存储和链式存储
顺序存储:用一组地址连续的存储单元依次存放线性表的各个元素
链式存储:用一组任意的存储单元来存放线性表的结点
测试代码:
第一个元素没有直接前驱,最后一个元素没有直接后继,除此之外每个数据元素都已一个直接前驱和直接后继
线性表的存储结构:顺序存储和链式存储
顺序存储:用一组地址连续的存储单元依次存放线性表的各个元素
链式存储:用一组任意的存储单元来存放线性表的结点
单链表的基本操作:
#ifndef Link_h__
#define Link_h__
typedef int datatype;
typedef struct _NODE
{
datatype num;
struct _NODE *next;
}NODE, *PNODE;
//增加结点
void InsertNode(PNODE *pNode, datatype value);
//前插节点
void InsertHead(PNODE *pNode, datatype value);
//删除结点
void DeleteNode(PNODE *pNode, int value);
//查询节点
NODE *SearchNode(NODE *pNode, int value);
//修改结点的值
int ChangeNodeNum(PNODE *pNode, datatype oldnum, datatype newnum);
//显示所有结点的值
void ShowNodeNum(NODE *pNode);
//链表的逆转
NODE *Reserve(PNODE pNode);
//链表的排序
void Sort(PNODE pNode);
//删除头结点
void DeleteHead(PNODE *pHead);
#endif // Link_h__
以上函数的实现:
#include "Link.h"
//增加结点
void InsertNode(PNODE *pNode, datatype value)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
pNew->num = value;
pNew->next = NULL;
if (*pNode == NULL)
{
*pNode = pNew;
}
else
{
NODE *p = *pNode;
while (p->next != NULL)
{
p = p->next;
}
p->next = pNew;
}
}
//前插节点
void InsertHead(PNODE *pNode, datatype value)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
pNew->num = value;
pNew->next = NULL;
if (NULL == (*pNode))
{
*pNode = pNew;
}
else
{
pNew->next = (*pNode);
(*pNode) = pNew;
}
}
//删除结点
void DeleteNode(PNODE *pNode, int value)
{
NODE *pValue = (*pNode);
NODE *pPrev = NULL;
while (pValue != NULL)
{
while (pValue != NULL && pValue->num != value)
{
pPrev = pValue;
pValue = pValue->next;
}
if (NULL == pValue)
{
break;
}
if (NULL == pPrev)
{
// DeleteHead(pNode);
// pValue = *pNode;
PNODE pPos = *pNode;
*pNode = pPos->next;
free(pPos);
pPos = NULL;
pValue = *pNode;
}
else
{
pPrev->next = pValue->next;
free(pValue);
pValue = NULL;
}
}
}
//删除头结点
void DeleteHead(PNODE *pHead)
{
if (*pHead != NULL)
{
PNODE pPos = *pHead;
*pHead = pPos->next;
free(pPos);
pPos = NULL;
}
}
//查询节点
NODE *SearchNode(NODE *pNode, int value)
{
PNODE pHead = pNode;
while (pHead != NULL)
{
if (value == pHead->num)
{
return pHead;
}
pHead = pHead->next;
}
return NULL;
}
//修改结点的值
int ChangeNodeNum(PNODE *pNode, datatype oldnum, datatype newnum)
{
PNODE pHead = *pNode;
while (pHead != NULL)
{
if (pHead->num == oldnum)
{
pHead->num = newnum;
return 1;
}
pHead = pHead->next;
}
return 0;
}
//显示所有结点的值
void ShowNodeNum(NODE *pNode)
{
while (pNode != NULL)
{
printf("%d, ", pNode->num);
pNode = pNode->next;
}
printf("\b\b \n");
}
//链表的逆转
NODE *Reserve(PNODE pNode)
{
if (NULL == pNode || NULL == pNode->next)
{
return pNode;
}
NODE *p1 = pNode;
NODE *p2 = p1->next;
NODE *p3 = NULL;
while (p2 != NULL)
{
p3 = p2->next;
p2->next = p1;
p1 = p2;
p2 = p3;
}
pNode->next = NULL;
pNode = p1;
return pNode;
}
//链表的排序
void Sort(PNODE pNode)
{
for (PNODE p1 = pNode; p1 != NULL; p1 = p1->next)
{
for (PNODE p2 = pNode; p2 != NULL; p2 = p2->next)
{
if (p1->num > p2->num)
{
NODE Temp;
Temp.num = p1->num;
p1->num = p2->num;
p2->num = Temp.num;
}
}
}
}
测试代码:
#include "Link.h"
int main(void)
{
NODE *Head = NULL;
InsertNode(&Head, 5);
InsertNode(&Head, 6);
InsertNode(&Head, 7);
InsertNode(&Head, 8);
InsertNode(&Head, 9);
InsertHead(&Head, 4);
InsertHead(&Head, 3);
InsertHead(&Head, 2);
InsertHead(&Head, 1);
/*
NODE *pFind = SearchNode(Head, 4);
printf("找到的数为%d, 地址为%x\n", pFind->num, pFind);
*/
/*
int result = ChangeNodeNum(&Head, 3, 100);
if (1 == result)
{
printf("修改成功\n");
}
else
{
printf("修改失败\n");
}
*/
ShowNodeNum(Head);
DeleteNode(&Head, 1);
ShowNodeNum(Head);
/*
Sort(Head);
ShowNodeNum(Head);
*/
/*
PNODE p = Reserve(Head);
ShowNodeNum(p);
*/
return 0;
}