您的位置:首页 > 理论基础 > 数据结构算法

数据结构C语言版(三)链表的实现

2020-07-12 17:29 309 查看

1. 动态链表

由于事先不知道需要分配多少内存空间,所以这种链表在后续插入的时候需要动态申请存储空间,并且存储空间不一定连续, 在进行插入和删除时则不需要移动元素, 修改指针域即可,所以仍然具有链表的主要优点,链表结构可以是动态地分配存储的,即在需要时才开辟结点的存储空间,实现动态链接。

2.C语言实现

单向链表的数据结构可以分为两部分:数据域和指针域,数据域存储数据,指针域指向下一个储存节点的地址

将指针域定义在数据域之前可以有效的减少代码量。

//在实现动态链表前先定义结构体

//链表节点数据结构
struct Linknode
{
struct Linknode * next;//用来存放指针
};
//链表结构体
struct Linklist
{
Linknode header;
int size;
};

.h文件用来声明函数

#pragma  once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#ifdef __cplusplus
extern "C"{
#endif // __cplusplus
//链表节点数据结构
struct Linknode
{
struct Linknode * next;
};
//链表结构体
struct Linklist
{
Linknode header;
int size;
};
typedef void * LList;//定义void * 类型方便用户阅读
//链表初始化
LList InitializeList();
//遍历
void Ergodiclist(LList list,void (*print)(void *data));
//插入
void InsertList(LList list,int pos,void * data);
//位置删除
void RemoveListpos(LList list ,int pos);
//销毁
void DestroyList(LList list);

#ifdef __cplusplus
}
#endif // __cplusplus

函数实现

#include"onewaylist1.h"

//typedef void * LList;
//链表初始化
LList InitializeList()
{
struct Linklist * list = (struct Linklist *)malloc(sizeof(Linklist));//开辟内存空间
//初始化链表
list->size = 0;
list->header.next = NULL;
return list;
}
//遍历
void Ergodiclist(LList list,void (*print)(void *data))
{
if(NULL == list)
return;
if (NULL == print)
return;
struct Linklist * mylist= (struct Linklist *)list;
struct Linknode * pCurrent = mylist->header.next;
while (pCurrent != NULL)
{
print(pCurrent);
pCurrent = pCurrent->next;
}
}
//插入
void InsertList(LList list,int pos,void * data)
{
if(NULL == list)
return;
if (NULL == data)
return;
struct Linklist * link = (struct Linklist * )list;
struct Linknode * mydate = (struct Linknode * )data;
if(pos <0 || pos>link->size-1)
pos = link->size;
struct Linknode  * pCurrent = &(link->header);
for (int i = 0; i < pos; i++)
{
pCurrent = pCurrent->next;
}
mydate->next=pCurrent->next;
pCurrent->next = mydate;
link->size++;
}
//位置删除
void RemoveListpos(LList list ,int pos)
{
if(NULL == list)
return;
struct Linklist * mylist = (struct Linklist *)list;
if (pos<0 || pos >mylist->size-1)
return;
struct Linknode * pCurrent = &(mylist->header);
for (int i = 0; i < pos; i++)
{
pCurrent=pCurrent->next;
}
struct Linknode * delnode = pCurrent->next;
pCurrent->next = delnode->next;//内存不是自己开辟的不需要释放内存
mylist->size--;
}
//销毁
void DestroyList(LList list)
{
struct Linklist * mylist = (struct Linklist *)list;
free(mylist);
mylist->header.next = NULL;

}

调用函数并输出结果

#include"onewaylist1.h"

struct person
{
struct Linknode next;
char name[64];
int age;
};
void myprint(void * data)
{
struct person * p = (struct person *) data;
printf("name : %s age : %d\n",p->name,p->age);
}
void myclear(void * data)
{
struct person * p = (struct person *) data;
free(p);
}

void test01()
{
person p1 ={NULL,"a",10};
person p2 ={NULL,"b",20};
person p3 ={NULL,"c",30};
person p4 ={NULL,"d",40};
person p5 ={NULL,"e",50};
person p6 ={NULL,"f",60};
person p7 ={NULL,"g",70};
LList list = InitializeList();
InsertList(list,0,&p1);//1
InsertList(list,1,&p2);//1 2
InsertList(list,2,&p3);//1 2 3
InsertList(list,1,&p4);//1 4 2 3
InsertList(list,5,&p5);//14235
InsertList(list,3,&p6);//142635
InsertList(list,0,&p7);//7142635
Ergodiclist(list,myprint);
RemoveListpos(list,0);//142635
printf("----------------------\n");
Ergodiclist(list,myprint);
DestroyList(list);

}
void main()
{
test01();
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: