c语言实现链表及其基本操作

来源:互联网 发布:mac 音乐 编辑:程序博客网 时间:2024/04/30 04:30

链表:

       链表是一种物理储存单元上非连续、非顺序的储存结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。

和顺序表的区别:

顺序表使用数组存储线形的元素,其特点是可以随机存取,但是,因为逻辑上相邻的元素物理上也相邻,所以插入删除需要移动元素.链表使用指针链表示线形表元素的逻辑关系,插入和删除只需修改指针,不能随机存取。

代码实现

typedef int DataType;typedef struct Node{DataType data;struct Node* next;   }Node, *PNode;


void InitList(PNode* PHead)//初始化{assert(PHead);*PHead = NULL;}PNode ByeNode(DataType data)//申请一个结点{PNode newNode = NULL;newNode = (PNode)malloc(sizeof(Node));if (NULL == newNode){printf("out of memory.\n");exit(1);}else{newNode->data = data;newNode->next = NULL;}return newNode;}void PopBack(PNode* PHead)//尾删{assert(PHead);if (NULL == *PHead){return;}else if(NULL == (*PHead)->next){PNode TempNode = *PHead;free(TempNode);TempNode = NULL;*PHead = NULL;}else{PNode PCur = *PHead;while (PCur->next->next){PCur = PCur->next;}PCur->next = NULL;}}void PushBack(PNode* PHead, DataType data)//尾插{assert(PHead);if (NULL == *PHead){*PHead = ByeNode(data);}else{PNode PCur = NULL;PCur = *PHead;while (PCur->next){PCur = PCur->next;}PCur->next = ByeNode(data);}}void PushFront(PNode *PHead, DataType data)//头插{assert(PHead);PNode PreNode = NULL;PNode Node = ByeNode(data);PreNode = *PHead;Node->next = PreNode;*PHead = Node;}void PopFront(PNode *PHead)//头删{assert(PHead);PNode PreNode = *PHead;if (NULL == *PHead){return;}else if (NULL == (*PHead)->next){*PHead = NULL;}else{*PHead = PreNode->next;free(PreNode);PreNode = NULL;}}


PNode Find(PNode* PHead, DataType data)//查找{assert(PHead);PNode PCur = *PHead;while (PCur){if (data == PCur->data)break;PCur = PCur->next;}return PCur;}void Destroy(PNode* PHead)//销毁{assert(PHead);PNode PCur = *PHead;while (PCur->next){PNode Dnode = PCur;PCur = PCur->next;free(Dnode);Dnode = NULL;}}int Empty(PNode PHead)//判空{if (NULL == PHead)return 0;elsereturn 1;}int Size(PNode PHead)//求链表中结点的个数{ PNode Node = PHead;DataType num = 0;while (Node){num++;Node = Node->next;}return num;}void PrintList(PNode* PHead)//打印单链表{PNode PCur = *PHead;assert(PHead);while (PCur){printf("%d->",PCur->data);PCur = PCur->next;}printf("NULL\n");}void Insert(PNode pos, DataType data)//在data后插入结点{PNode newNode = ByeNode(data);PNode PreNode = pos;newNode->next = PreNode->next;PreNode->next = newNode;}




3 0
原创粉丝点击