线性表链式存储实现
来源:互联网 发布:suse12 linux 网卡配置 编辑:程序博客网 时间:2024/05/16 01:38
/**********头文件**********/
#ifndef _SEQLIST_H_
#define _SEQLIST_H_
typedef void LinkList;
//typedef void LinkListNode;
typedef struct _tag_LinkListNode
{
struct _tag_LinkListNode* next;
}LinkListNode;
//创建并且返回一个空的线性表
LinkList* LinkList_Create();
//销毁一个线性表
void LinkList_Destroy(LinkList* list);
//将一个线性表list中的所有元素清空,线性表回到创建时的初始状态
void LinkList_Clear(LinkList* list);
//返回一个线性表list中的所有元素个数
int LinkList_Length(LinkList* list);
int LinkList_Capacity(LinkList* list);
//向一个线性表list的pos位置处插入新元素node
int LinkList_Insert(LinkList* list, LinkListNode* node, int pos);
//获取一个线性表list的pos位置处的元素
LinkListNode* LinkList_Get(LinkList* list, int pos);
//删除一个线性表list的pos位置处的元素 返回值为被删除的元素, NULL表示删除失败
LinkListNode* LinkList_Delete(LinkList* list, int pos);
#endif/*********实现代码**********/
#include <stdio.h>#include <stdlib.h>#include <string.h>#include "linklist.h"typedef struct _tag_LinkList{LinkListNode header;int length;}TLinkList;
//创建并且返回一个空的线性表
LinkList* LinkList_Create()
{TLinkList *ret = NULL;ret = (TLinkList *)malloc(sizeof(TLinkList));memset(ret, 0, sizeof(TLinkList));ret->header.next = NULL;//ret->length = 0;//return ret;}//销毁一个线性表
void LinkList_Destroy(LinkList* list){if (list != NULL){free(list);list = NULL;}return;
}//将一个线性表list中的所有元素清空,线性表回到创建时的初始状态
void LinkList_Clear(LinkList* list){if (list == NULL){return;
}TLinkList *tlist = NULL;tlist = (TLinkList *)list;tlist->length = 0;tlist->header.next = NULL;return;
}//返回一个线性表list中的所有元素个数
int LinkList_Length(LinkList* list){if (list == NULL){return -1;}TLinkList *tlist = NULL;tlist = (TLinkList *)list;return tlist->length;}/************核心算法************/
//向一个线性表list的pos位置处插入新元素node
int LinkList_Insert(LinkList* list, LinkListNode* node, int pos){int ret = 0,i = 0;LinkListNode *current = NULL;TLinkList *tlist = NULL;if (list == NULL || node == NULL || pos < 0){ret = -1;return ret;}tlist = (TLinkList *)list;current = &(tlist->header);//让辅助指针变量指向链表的头部for (i = 0; i < pos && (current->next != NULL); i++)//跳pos次 后 指针指向新节点前驱节点{current = current->next;}//1 新节点连接后续节点node->next = current->next;//2 前驱节点连接新节点current->next = node;tlist->length++;
return ret;}//获取一个线性表list的pos位置处的元素
LinkListNode* LinkList_Get(LinkList* list, int pos){int ret = 0, i = 0;LinkListNode *current = NULL;TLinkList *tlist = NULL;if (list == NULL || pos < 0){ret = -1;printf("func LinkList_Get() err: %d \n", ret);return NULL;}tlist = (TLinkList *)list;current = &(tlist->header);//让辅助指针变量指向链表的头部for (i = 0; i < pos && (current->next != NULL); i++)//跳pos次 后 指针指向pos前驱节点{current = current->next;}return current->next; //pos位置元素值 //注意不是current}//删除一个线性表list的pos位置处的元素 返回值为被删除的元素, NULL表示删除失败LinkListNode* LinkList_Delete(LinkList* list, int pos){int i = 0;LinkListNode *current = NULL;LinkListNode *ret = NULL;TLinkList *tlist = NULL;if (list == NULL || pos < 0){return NULL;}tlist = (TLinkList *)list;current = &(tlist->header);for (i = 0; i < pos && (current->next != NULL); i++)//跳pos次{current = current->next;}//缓存被删除的元素
ret = current->next;//连线,删除
current->next = ret->next;tlist->length--;
return ret;//返回值为被删除的元素}/**********测试代码**********/
#include <stdio.h>#include <stdlib.h>#include <string.h>#include "linklist.h"typedef struct teacher{LinkListNode node; //第一个域char name[64];int age;}Teacher;
int main(){int ret = 0, i = 0, len = 0;LinkList* list = NULL;Teacher t1, t2, t3, t4, t5;t1.age = 31;t2.age = 32;t3.age = 33;t4.age = 34;t5.age = 35;list = LinkList_Create();if (list == NULL){printf("func Linklist_Create() ret; %d\n", ret);return ret;}len = LinkList_Length(list);ret = LinkList_Insert(list, (LinkListNode*)&t1, 0); //头插法ret = LinkList_Insert(list, (LinkListNode*)&t2, 0); //头插法ret = LinkList_Insert(list, (LinkListNode*)&t3, 0); //头插法ret = LinkList_Insert(list, (LinkListNode*)&t4, 0); //头插法ret = LinkList_Insert(list, (LinkListNode*)&t5, 0); //头插法//遍历
for (i = 0; i < LinkList_Length(list); i++){Teacher* tmp = (Teacher*)LinkList_Get(list, i);if (tmp == NULL){return ret;}printf("tmp->age:%d\n", tmp->age);}//删除链表中的节点
while (LinkList_Length(list) >0){Teacher* tmp = (Teacher*)LinkList_Delete(list, 0);if (tmp == NULL){return ret;}printf("tmp->age:%d\n", tmp->age);}LinkList_Destroy(list);system("pause");
return ret;}
0 0
- 线性表链式存储实现
- 线性表链式存储的实现
- 线性表链式存储C++实现
- 线性表链式存储的实现
- 线性表链式存储的实现详解
- 线性表链式存储的实现详解
- 线性表链式存储实现各种操作
- 线性表链式存储结构实现 --单链表
- 线性表链式存储_api函数实现
- 线性表链式存储_api函数实现
- 线性表链式存储结构一种实现
- 线性表链式存储
- 线性表链式存储
- 线性表链式存储
- 线性表链式存储
- 线性表链式存储
- 线性表链式存储
- 线性表链式存储
- 15位和18位身份证JS校验实例(jquery)和注意事项
- 文章标题
- Intellij IDEA 内存优化
- [WZOI D1T2] 挑选士兵
- Android 使用Rtmp音视频推流
- 线性表链式存储实现
- R语言学习十一
- openvpn-2.3.8开通客户端
- 十六进制转八进制
- 2个文件内容的比较
- Spring MVC Controller线程安全性问题
- 编辑文章 - 博客频道 - CSDN.NET
- LeetCode OJ-78.Subsets
- iOS函数式编程初探