线性表链式存储实现

来源:互联网 发布: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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果6黑屏没反应怎么办 苹果7卡机黑屏了怎么办 苹果7手机铃声小怎么办 支付宝发现套现怎么办 空调滴水管断了怎么办 地漏下水管断了怎么办 脸上长白色糠疹怎么办 腋下长白色的毛怎么办 饥荒电羊死光了怎么办 6s储存空间虚满怎么办 大胸下垂穿婚纱怎么办 美团签约成功后怎么办 拍婚纱照笑不出来怎么办 长得丑拍婚纱照怎么办 失恋了怎么办才能最快走出来 眼镜大了往下掉怎么办 眼镜带着往下掉怎么办 眼镜腿松了怎么办妙招 眼镜框大了总掉怎么办 吃不下饭恶心想吐怎么办 买到苹果翻新机怎么办 欠装修款不给怎么办 老板欠工资跑了怎么办 挖机老板欠工资怎么办 欠工程款耍赖不给怎么办 辞工后不给工资怎么办 工伤仲裁后不给怎么办 离职后不给工资怎么办 离职了不发工资怎么办 饭店欠工资不给怎么办 单位欠工资不给怎么办 离职后工资不发怎么办 暑假工不给工资怎么办 暑假工工资不发怎么办 个人欠钱2万不还怎么办 快递发错地址了怎么办 香烟被快递扣了怎么办 买st股票退市了怎么办 av淘宝看不了了,怎么办 厨房通水道堵了怎么办 皮鞋大了不跟脚怎么办