链式链表的C风格实现
头文件:
#ifndef _LINKLIST_H_
#define _LINKLIST_H_ typedef void LinkList; //将数据的类型分离,相当于句柄 //只是一个小节点 包含着位置信息!
typedef struct _tag_LinkListNode
{
struct _tag_LinkListNode* next;
}LinkListNode; //生成一个链表
LinkList* LinkList_Create();
//删除一个链表
void LinkList_Destory(LinkList* list);
//清空一个链表
void LinkList_Clear(LinkList* list);
//链表长度
int LinkList_Length(LinkList* list);
//在某个位置插入一个节点
int LinkList_Insert(LinkList* list, LinkListNode* node, int pos);
//获取某个位置的节点
LinkListNode* LinkList_Get(LinkList* list, int pos);
//删除某个位置的节点
LinkListNode* LinkList_Delete(LinkList* list, int pos); #endif
CPP文件:
#include "linkList.h"
#include <iostream>
using namespace std; //定义一个链表头
typedef struct _tag_LinkList
{
LinkListNode header; //定义一个头结点
int length; }tagList; //生成一个链表
LinkList* LinkList_Create()
{
tagList * ret = NULL;
ret = (tagList *)malloc(sizeof(tagList)); //分配内存
memset(ret, , sizeof(tagList)); //memset快速填充 ret->header.next = NULL; //头结点的Next指向NULL
ret->length = ;
return ret;
}
//删除一个链表
void LinkList_Destory(LinkList* list)
{
//异常处理
if (list != NULL)
{
free(list);
list = NULL;
}
return;
}
//清空一个链表
void LinkList_Clear(LinkList* list)
{
tagList *tList = NULL; if(list == NULL)
{
cout << "LinkList_Clear Err" << endl;
return;
} tList = (tagList *)list; tList->length = ;
tList->header.next = NULL;
return;
}
//链表长度
int LinkList_Length(LinkList* list)
{
tagList *tList = NULL; if(list == NULL)
{
cout << "LinkList_Length Err" << endl;
return -;
} tList = (tagList *)list; return tList->length;
}
//在某个位置插入一个节点 //链表是单向的 POS位置保存在POS-1的NEXT域里面 int LinkList_Insert(LinkList* list, LinkListNode* node, int pos)
{
int ret = ; LinkListNode* current = NULL; //定义辅助指针变量Current tagList* tList;
if (list == NULL || node == NULL || pos <)
{
ret = -;
cout << "Insert Err" << endl;
return ret;
} tList = (tagList*)list; current = &(tList->header); //Current首先指向头结点 for(int i = ; ((i < pos) && (current->next !=NULL)); i++)
{
current = current->next; //指向POS节点的前一个位置
} //node的NEXT改变 将Current的NEXT域的信息存入node的NEXT域
node->next = current->next;
//Current的NEXT域指向node 从而实现插入
current->next = node; tList->length++;
return ;
}
//获取某个位置的节点
LinkListNode* LinkList_Get(LinkList* list, int pos)
{
int ret = ;
LinkListNode* current = NULL; //辅助节点指针变量
LinkListNode* temp = NULL;
tagList* tList;
if (list == NULL || pos <)
{
ret = -;
cout << "Get Err" << endl;
return NULL;
} tList = (tagList*)list; current = &(tList->header); //Current首先指向头结点
for(int i = ; ((i < pos) && (current->next !=NULL)); i++)
{
current = current->next;
}
temp = current->next;
//返回Current的Next域为POS位置信息
return temp;
} //删除某个位置的节点
LinkListNode* LinkList_Delete(LinkList* list, int pos)
{
int ret = ;
LinkListNode* current = NULL;
LinkListNode* temp = NULL; //定义中间指针变量 tagList* tList;
if (list == NULL || pos <)
{
ret = -;
cout << "Get Err" << endl;
return NULL;
} tList = (tagList*)list; current = &(tList->header);
for(int i = ; ((i < pos) && (current->next !=NULL)); i++)
{
current = current->next; //Current指向POS节点的前一个位置
}
//temp指针指向POS位置的节点
temp = current->next;
//将temp 也就是POS位置的NEXT域值赋给CurrentNext域 从而实现跳过删除
current->next =temp->next; tList->length--;
return temp;
}
测试函数:
#include <iostream>
#include "linkList.h"
using namespace std; typedef struct _Teacher
{
LinkListNode node; //必须在所需要的数据结构中添加LinkListNode类型的node!!
int age;
char name[];
}Teacher; int main()
{
int len = ;
int ret = ;
LinkList* list = NULL;
Teacher t1, t2, t3, t4, t5;
t1.age = ;
t2.age = ;
t3.age = ;
t4.age = ;
t5.age = ;
//创建
list = LinkList_Create();
if(list == NULL)
{
return -;
}
len = LinkList_Length(list);
//逐条插入
ret = LinkList_Insert(list, (LinkListNode*)(&t1), );
ret = LinkList_Insert(list, (LinkListNode*)(&t2), );
ret = LinkList_Insert(list, (LinkListNode*)(&t3), );
ret = LinkList_Insert(list, (LinkListNode*)(&t4), );
ret = LinkList_Insert(list, (LinkListNode*)(&t5), ); for (int i = ; i < LinkList_Length(list); i++)
{
cout << "List的遍历" << endl;
cout << "age:" << ((Teacher*)LinkList_Get(list, i))->age << endl;
}
cout << endl;
//头删
while(LinkList_Length(list) > )
{
cout << "删除的元素:" << ((Teacher*)LinkList_Delete(list, ))->age << endl;
} system("pause");
return ;
}
链式链表的C风格实现的更多相关文章
- 基于链式链表的栈链式存储的C风格实现
链式链表的头文件与CPP文件见前文 头文件: #ifndef _LINKSTACK_H_ #define _LINKSTACK_H_ typedef void LinkStack; //创建一个栈 L ...
- javascript实现数据结构:线性表--线性链表(链式存储结构)
上一节中, 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示.然后,另一方面来看,这个特点也造成这种存储 ...
- 链表回文串判断&&链式A+B
有段时间没有练习了,链表回文串判断用到了栈.链式A+B将没有的项用0补充.链表有没有头节点,及结点和链表的区别,即pNode和pHead. //#include<iostream> //u ...
- 链表回文串判断&&链式A+B
有段时间没有练习了,链表回文串判断用到了栈.链式A+B将没有的项用0补充.链表有没有头节点,及结点和链表的区别,即pNode和pHead. //#include<iostream> //u ...
- C语言链表全操作(增,删,改,查,逆序,递增排序,递减排序,链式队列,链式栈)
一,数据结构——链表全操作: 链表形式: 其中,每个节点(Node)是一个结构体,这个结构体包含数据域,指针域,数据域用来存放数据,指针域则用来指向下一个节点: 特别说明:对于单链表,每个节点(Nod ...
- 线性表的Java实现--链式存储(单向链表)
单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. 链式存储结构的线性表将采用一组任意的存储单元存放线性表中的数据元素.由于不需要按顺序存储,链表在 ...
- c数据结构 -- 线性表之 顺序存储结构 于 链式存储结构 (单链表)
线性表 定义:线性表是具有相同特性的数据元素的一个有限序列 类型: 1:顺序存储结构 定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构 算法: #include <stdio. ...
- C语言实现链表(链式存储结构)
链表(链式存储结构)及创建 链表,别名链式存储结构或单链表,用于存储逻辑关系为 "一对一" 的数据.与顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其 ...
- 由反转链表想到python链式交换变量
这两天在刷题,看到链表的反转,在翻解体思路时看到有位同学写出循环中一句搞定三个变量的交换时觉得挺6的,一般用的时候都是两个变量交换(a,b=b,a),这种三个变量的交换还真不敢随便用,而且这三个变量都 ...
随机推荐
- siege官方文档(译)(一)
WHAT IS siege? Siege is an open source regression test and benchmark utility. Siege是一款开源回归测试和基准测试工具. ...
- 转 shell模拟数据库的读写
0.create table create table myTestTable as select rownum as id, to_char(sysdate + rown ...
- substring和substr,slice和splice
substring 和 substr 这二货都是针对字符串而言的,且都是返回一个副本,而不是在原字符串上直接操作. 上代码: var str = '0123456789'; console.log( ...
- Eclipse-运行符-数据类型转换-环境变量配置
1.能够使用Eclipse快捷键 ctrl + / 单行注释:再按一次则取消: ctrl + shift + / 多行注释: ctrl + shift + \ 取消多行注释: ctrl + ...
- iOS 如何解决并发请求时,只接受最后一个请求返回的结果
大致意思是 虽然NSOperation 的cancel 并不能取消请求,但是可以对这个NSOperation进行标记. 当cancel 属性是YES时,表明 NSOperation虽然已经执行,并 ...
- CentOS 6.5 下,phpmyadmin 建库无权限
阿里云主机.用root进入phpMyadmin,居然没有权限建库. 上网查到命令: grant all privileges on *.* to root@'%' identified by &quo ...
- springMVC中ajax和后台数据格式错误
前台ajax: $.ajax("${pageContext.request.contextPath}/hello",// 发送请求的URL字符串. { dataType : &qu ...
- 9.18 New Start
好久没上cnblogs,今天提示我说园龄已经2年1个月了.今天就用一个日记的形式开始第一篇博客吧.我以后比较精髓的文章就放在cnblogs,csdn博客也继续会更新,不过也会慢慢提高文章质量. 今天是 ...
- scanf("%s",s)与gets(s)
#include <stdio.h> void fun(char s[]) {; while(s[i]!='\0') {i++;} printf("%d",i);} v ...
- pc端引入微信公众号文章
最近做了一个小需求,结果坑特别多..... 需求是这样的,要给公司内部做一个微信公众号广告投票系统,整个项目就不多赘述了,有个小功能,要求是这样的: 点击某条记录后的“投票”按钮,在当前页面弹出弹窗显 ...