单向链表的一些基础接口的实现
来源:互联网 发布:linux执行命令的过程 编辑:程序博客网 时间:2024/05/22 14:25
下面为单向链表的一些基础知识:
单向链表是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指列表中的下一个结点
列表是由结点构成,由head指针指向第一个成为表头的结点而终止于最后一个指向nuLL的指针
如下图:
下面为代码的实现:
linklist.h#ifndef __LINKLIST_H__#define __LINKLIST_H__#include<stdio.h>#include<assert.h>#include<stdlib.h>typedef int DataType;typedef struct Node//链表的构造{ DataType data; struct Node*next;}Node, *pNode, *pList;void initLinkList(pList*pplist); //初始化链表,用二级指针指向一级指针的地址改变其内容void PushFront(pList*pplist, DataType d); //链表的头插void popFront(pList*pplist); //链表的头删void display(pList p1); //链表的打印pNode BuyNode(DataType d);//创建链表节点void PushBack(pList *pplist, DataType d);//尾插void PopBack(pList *pplist);//尾删pNode Find(pList pl, DataType d); //查找dvoid Remove(pList *pplist, DataType d);//删除指定的一个元素void RemoveAll(pList *pplist, DataType d);//删除指定的所有元素void Insert(pList *pplist, pNode pos, DataType d);//指定位置的后面插入//void Delpos(pList *pplist, pNode pos);//指定位置删除pNode BuyNode(DataType d);//创建链表节点void DestroyList(pList *pplist);#endif //__LINKLIST_H__
linklist.c#include"LinkList.h"void initLinkList(pList*pplist){ assert(pplist != NULL); *pplist = NULL;}pNode BuyNode(DataType d)//创建链表节点{ pNode newnode = (pNode)malloc(sizeof(Node)); if (newnode == NULL) { perror("malloc"); exit(EXIT_FAILURE); } newnode->data = d; newnode->next = NULL; return newnode;}void PushFront(pList*pplist, DataType d) //头插{ assert(pplist); pNode ps = BuyNode(d); //调用创的新节点函数 ps->next = *pplist; //将*pplist赋给新的节点 *pplist = ps;}void display(pList pl) //打印{ assert(pl); while (pl != NULL) { printf("%d ", pl->data); pl = pl->next; } printf("\n");}void popFront(pList*pplist)//头部删除{ pNode cur = *pplist; assert(pplist); //链表为空 if (*pplist == NULL) { return; } *pplist = cur->next; free(cur); cur = NULL;}void PushBack(pList *pplist, DataType d)//尾插{ assert(pplist != NULL); pNode ps = BuyNode(d); //调用创的新节点函数 pNode head = *pplist; if (head == NULL)//空链表处理 { *pplist = ps; return; } while (head->next != NULL)//非空链表处理 { head = head->next; } head->next = ps;}void PopBack(pList *pplist) //尾删{ pNode cur = *pplist; pNode prev = NULL; assert(pplist); //链表没有节点 if (*pplist == NULL) { return; } //链表有一个节点 if (cur->next == NULL) { free(*pplist); *pplist = NULL; return; } //链表有两个及两个以上节点 while (cur->next != NULL) { prev = cur;//prev中保存的是cur之前的那个节点 cur = cur->next; } prev ->next = NULL; free(cur);}pNode Find(pList pl, DataType d){ pNode tmp = pl; while (tmp != NULL) { if (tmp->data == d) { return tmp; } tmp = tmp->next; } return NULL;}void Remove(pList *pplist, DataType d)//删除指定的一个元素{ assert(pplist != NULL); pNode del = NULL; pNode cur = Find(*pplist, d); if (cur == NULL) { return; } del = cur->next; cur->data = del->data; cur->next = del->next; free(del); del= NULL;}void RemoveAll(pList *pplist, DataType d) //删除指定的所有元素{ pNode pos = NULL; pNode del = NULL; assert(pplist); pNode cur = *pplist; while (cur) { if (cur->data == d) { del = cur; if (cur == *pplist) { *pplist = cur->next; } else { pos->next = cur->next; } cur = cur->next; free(del); del = NULL; } else { pos = cur; cur = cur->next; } }}void Insert(pList *pplist, pNode pos, DataType d)//指定位置的后面插入{ assert(pplist != NULL); pNode cur = NULL; pNode tmp = BuyNode(d); pNode head = *pplist; while ((head->next != NULL) && (pos--)) { cur = head; head = head->next; } cur->next = tmp; tmp ->next= head;}//void Delpos(pList *pplist, pNode pos)//指定位置删除//{// assert(pplist);// assert(pos);// //要删除的是尾节点// if (pos->next == NULL)// {// PopBack(pplist);// }// //删除的是非尾节点// else// {// pNode del = pos->next;// pos->data = pos->next->data;// pos->next = pos->next->next;// free(del);// del = NULL;// }//}void DestroyList(pList *pplist)//销毁链表{ assert(pplist); pNode cur = *pplist; while (cur!=NULL) { pNode del = cur; cur = cur->next; free(del); del = NULL; }}
下面为实现区:为test.c
test.c#include"LinkList.h"//void test1()//{// pList List;// initLinkList(&List);// PushFront(&List, 4);// PushFront(&List, 3);// PushFront(&List, 2);// PushFront(&List, 1);// display(List);// popFront(&List);// popFront(&List);// display(List);// DestroyList(&List);//}//void test2()//{// pList List;// initLinkList(&List);// PushBack(&List, 6);// PushBack(&List, 5);// PushBack(&List, 4);// PushBack(&List, 3);// PushBack(&List, 2);// PushBack(&List, 1);// display(List);// PopBack(&List);// PopBack(&List);// PopBack(&List);// PopBack(&List);// display(List);// DestroyList(&List);//}//void test3()//{// pList List;// initLinkList(&List);// PushFront(&List, 4);// PushFront(&List, 3);// PushFront(&List, 2);// PushFront(&List, 1);// display(List);// pNode ret = Find(List, 2);// {// if (ret == NULL)// {// printf("找不到");// }// else// {// printf("%d\n", ret->data);// }// }// DestroyList(&List);//}//void test4()//{// pList List;// initLinkList(&List);// PushFront(&List, 4);// PushFront(&List, 3);// PushFront(&List, 2);// PushFront(&List, 1);// display(List);// Remove(&List, 1);// display(List);// DestroyList(&List);//}//void test5()//{// pList List;// initLinkList(&List);// PushFront(&List, 4);// PushFront(&List, 3);// PushFront(&List, 2);// PushFront(&List, 1);// display(List);// Insert(&List,4, 2);// display(List);// DestroyList(&List);//}void test6(){ pList List; initLinkList(&List); PushFront(&List, 4); PushFront(&List, 3); PushFront(&List, 2); PushFront(&List, 1); PushFront(&List, 1); RemoveAll(&List, 1); display(List); DestroyList(&List);}int main(){ /*test1(); test2(); test3(); test4(); test5();*/ test6(); system("pause"); return 0;}
本人是新手,希望得到大家的意见和建议。
阅读全文
0 0
- 单向链表的一些基础接口的实现
- 单向链表的一些操作实现-Java实现
- 单向链表的实现
- 单向链表的实现
- 单向链表的实现
- 单向链表的实现
- 单向链表的实现
- 单向链表的实现
- 单向链表的一些操作
- 单向链表的一些操作
- 数据结构的基础-单向链表所构造的栈 c++实现
- C语言单向链表的实现
- java 单向链表的实现
- C#单向链表的实现
- C语言实现的单向链表
- 单向链表的c++实现
- 数据结构练习--单向链表的实现
- 单向链表的C语言实现
- KMP算法
- 三十天
- 有关散列表
- 多校4 HDU6069
- pat-aChain the Ropes (25)
- 单向链表的一些基础接口的实现
- 数论(基础欧拉函数)
- JSP学习笔记2
- python中的range与list函数
- effect java 学习摘要(4)
- elasticsearch的2.x 和5.x的不同之处之query
- Excel在统计分析中的应用—第四章—数据库统计函数与数据透视表-Part2-(数据库统计函数)
- 洛谷P1197 星球大战
- 用树莓派改装电风扇及实现Android遥控