C语言双向链表
来源:互联网 发布:linux开启登录超时锁定 编辑:程序博客网 时间:2024/05/16 08:18
C语言双向链表
1.定义头文件 DoubleLinkList.h
> #ifndef DOUBLELINKLIST_H #define DOUBLELINKLIST_H //定义节点类型 typedef struct Node { int data; Node* previous; Node* next; }Node,*PNode; typedef struct LinkList { Node* head; Node* tail; int len; }LinkList; /*分配值为i的节点,并返回节点地址*/ PNode MakeNode(LinkList * p, int i); /*释放p所指的节点*/ void FreeNode(PNode p); /*构造一个空的双向链表*/ LinkList* InitList(); /*摧毁一个双向链表*/ void DestroyList(LinkList *plist); /*将一个链表置为空表,释放原链表节点空间*/ void ClearList(LinkList *plist); /*返回头节点地址*/ PNode GetHead(LinkList *plist); /*返回尾节点地址*/ PNode GetTail(LinkList *plist); /*返回链表大小*/ int GetSize(LinkList *plist); /*返回p的直接后继位置*/ PNode GetNext(PNode p); /*返回p的直接前驱位置*/ PNode GetPrevious(PNode p); /*将pnode所指节点插入第一个节点之前*/ PNode InsFirst(LinkList *plist, PNode pnode); /*将链表第一个节点删除并返回其地址*/ PNode DelFirst(LinkList *plist); /*获得节点的数据项*/ int Getint(PNode p); /*设置节点的数据项*/ void Setint(PNode p, int i); /*删除链表中的尾节点并返回其地址,改变链表的尾指针指向新的尾节点*/ PNode Remove(LinkList *plist); /*在链表中p位置之前插入新节点S*/ PNode InsBefore(LinkList *plist, PNode p, PNode s); /*在链表中p位置之后插入新节点s*/ PNode InsAfter(LinkList *plist, PNode p, PNode s); /*返回在链表中第i个节点的位置*/ PNode LocatePos(LinkList *plist, int i); /*依次对链表中每个元素输出*/ void ListTraverse(LinkList *plist); #endif
2.实现文件 DoubleLinkList.cpp
>#include"DoubleLinkList.h" #include<malloc.h> #include<stdlib.h> #include<stdio.h> /*构造一个空的双向链表*/LinkList* InitList(){ LinkList* list = (LinkList*)malloc(sizeof(LinkList)); if (list == NULL) { printf("动态内存分配失败"); return NULL; } list->len = 0; list->head = NULL; list->tail = NULL; return list;}/*分配值为i的节点,并返回节点地址*/PNode MakeNode(LinkList * p, int i){ PNode pNode = (PNode)malloc(sizeof(Node)); pNode->data = i; return pNode;}/*释放p所指的节点的内存空间*/void FreeNode(PNode p){ if (p!=NULL) { free(p); } return;}/*将一个链表置为空表(回到初始状态),释放原链表节点空间*/void ClearList(LinkList *plist){ PNode current = plist->head; if (current != NULL){ PNode p = current; current = current->next; free(p); } plist->len = 0; return;}/*返回头节点地址*/PNode GetHead(LinkList *plist){ return plist->head; }/*返回尾节点地址*/PNode GetTail(LinkList *plist){ return plist->tail;}/*返回链表大小*/int GetSize(LinkList *plist){ return plist->len; }/*返回p的直接后继位置*/PNode GetNext(PNode p){ return p->next; }/*返回p的直接前驱位置*/PNode GetPrevious(PNode p){ return p->previous;}/*将pnode所指节点插入第一个节点之前*/PNode InsFirst(LinkList *plist, PNode pnode){ PNode first = plist->head; plist->head = pnode; pnode->next = first; plist->len++; if (plist->len == 1){ plist->tail = pnode; } return pnode;}/*将链表第一个节点删除并返回其地址*/PNode DelFirst(LinkList *plist){ PNode first = plist->head; plist->head = first->next; plist->head->previous = NULL; plist->len--; return first;}/*获得节点的数据项*/int Getint(PNode p){ return p->data;}/*设置节点的数据项*/void Setint(PNode p, int i){ p->data=i;}/*删除链表中的尾节点并返回其地址,改变链表的尾指针指向新的尾节点*/PNode Remove(LinkList *plist){ if (plist==NULL) { return NULL; } PNode last = plist->tail; if (plist->len==1) { plist->head = NULL; plist->tail = NULL; plist->len = 0; return last; } last->previous->next = last->next; plist->tail = last->previous; plist->len--; return last;}/*在链表中p位置之前插入新节点S*/PNode InsBefore(LinkList *plist, PNode p, PNode s){ if (p==plist->head) { InsFirst(plist, s); } s->next = p; s->previous = p->previous; p->previous->next = s; p->previous = s; plist->len++; return s;}/*在链表中p位置之后插入新节点s*/PNode InsAfter(LinkList *plist, PNode p, PNode s){ if (p==plist->tail) { p->next = s; s->previous = p; plist->tail = s; plist->len++; return s; } s->next = p->next; s->previous = p; p->next->previous = s; p->next = s; plist->len++; return s; }/*返回在链表中第i个节点的位置*/PNode LocatePos(LinkList *plist, int i){ if (i>plist->len) { return NULL; } PNode node = plist->head; for (int j = 1; j < i; j++) { node = node->next; } return node;}/*依次对链表中每个元素输出*/void ListTraverse(LinkList *plist){ PNode p = GetHead(plist); if (plist->len == 0) return; int i = 1; printf("The 1th data:%d\n", p->data); for (; i < plist->len; i++){ p = p->next; printf("The %dth data:%d\n",i+1, p->data); }}
3.测试文件 DoubleLinkListTest.cpp
#include <stdlib.h>#include <string.h>#include <stdio.h>#include "DoubleLinkList.h"int main(){ LinkList* pList= InitList(); PNode p1 = MakeNode(pList,1); //插入到头部 InsFirst(pList, p1); PNode p2 = MakeNode(pList, 2); PNode p3 = MakeNode(pList, 3); InsFirst(pList, p2); InsFirst(pList, p3); PNode p4 = MakeNode(pList, 4); PNode p5 = MakeNode(pList, 5); InsAfter(pList, p2, p4); InsBefore(pList,p4,p5); ListTraverse(pList); printf("===================\n"); PNode p6 = MakeNode(pList, 6); InsAfter(pList, p1, p6); Remove(pList); //删除尾部节点 ListTraverse(pList); DelFirst(pList); //删除头部节点 ListTraverse(pList); printf("\n "); system("pause");}
0 0
- 双向链表C语言
- C语言双向链表
- C语言实现双向链表删除、插入、双向输出
- C语言双向链表 快速排序
- c语言双向链表举例
- 双向链表代码实现-C语言
- 双向链表C语言实现
- C语言实现双向链表[上]
- C语言数据结构之双向链表
- C语言实现双向链表
- c语言双向链表的实现
- C语言数据结构----双向链表
- C语言实现双向循环链表
- C语言中的双向循环链表
- C语言实现双向链表
- 双向链表的C语言实现
- C语言之双向链表
- C语言实现双向循环链表
- linux command
- java
- 使用System.arraycopy()实现数组之间的复制
- 接口
- TCP,IP,HTTP,SOCKET区别和联系
- C语言双向链表
- ubuntu系统怎么自适应虚拟机窗口界面大小
- ubutun 12.04开机
- iOS 协议代理的深入理解
- c语言指针在传参时的注意事项
- 指针与数组总结
- Serializable和Parcelable
- 在SQL Server中创建用户角色及授权
- 单例模式及C++实现代码