链表是一种基础且重要的数据结构,在c语言中是必须熟练掌握的知识。现我们通过编写一个自己的链表程序,熟悉c语言如何创建和调用链表。
一、声明
我们先创建一个linklist.h头文件,声明一个LinkList结构体,并声明其中需要用到的方法:
#ifndef TEST1_LINKLIST_H
#define TEST1_LINKLIST_H
struct LinkList
{
int data;
struct LinkList *next;
};
typedef struct LinkList linkList;
linkList* linkListInit();
int linkListDelElem(linkList *,int elem);
int linkListInsertSort(linkList **,int data);
int linkListInsertElem(linkList *,int index,int data);
int freeLinkList(linkList *);
void printLinkList(linkList *);
#endif //TEST1_LINKLIST_H
二、实现
2.1,初始化方法实现
我这边使用的方法比较笨拙,动态申请初始化了一个未存储数据的结构体对象作为头(大家可以通过传入一个指针的指针,这个方法更好)。
linkList* linkListInit()
{
linkList *head = (linkList*)malloc(sizeof(linkList)); //动态申请堆空间,初始化一个链表头
if(!head)
{
printf("linkList init failed,exit.....");
exit(0);
}
head->next = NULL;//链表头的下一个元素指向为null
return head;//返回链表头
}
2.2,插入元素方法
这里链表插入数据方法我设置了指定位置可以插入链表元素。
int linkListInsertElem(linkList *head,int index,int data)
{
linkList *linkNode,*curNode;//定义两个链表元素指针
curNode = head;//获取传入的链表
int j = 0;
while(curNode&&j<index-1)//如果插入位置满足在链表长度范围内,进行插入
{
curNode = curNode->next;
j++;
}
if(!curNode||j>index) //大家其实可以设置如果插入位置大于链表,则在末尾插入
{
printf("error insert index!\n");
exit(0);
}
linkNode = (linkList *)malloc(sizeof(linkList));//申请新的堆空间
if(!linkNode)
{
printf("linkNode malloc failed");
return 0;
}
linkNode->data = data;//新增链表元素设置值
linkNode->next = curNode->next;//插入操作
curNode->next = linkNode;//插入操作
return 1;
}
2.3,排序插入方法
int linkListInsertSort(linkList **mp,int data)
{
linkList *linkNode,*curNode;
curNode = (*mp)->next;
while(curNode&&data>curNode->data)//判断值大小
{
mp = &curNode->next;
curNode = *mp;//存入当前元素地址
}
linkNode = (linkList *)malloc(sizeof(linkList));
if(!linkNode)
{
printf("linkNode malloc failed");
return 0;
}
linkNode->data = data;//元素插入
linkNode->next = curNode;//元素插入
*mp = linkNode;
return 1;
}
2.4,根据值删除元素
int linkListDelElem(linkList *head,int elem)
{
linkList *linkNode,*curNode;
curNode = head;
bool flag = false;
while(curNode)
{
if(curNode->data==elem) //判断值是否相等
{
flag = true;
head = curNode->next;//删除元素节点
free(curNode);//释放堆空间
break;
}
curNode = curNode->next;
}
if(flag)
{
return 1;
} else
{
printf("the link list not have this node data\n");
return 0;
}
}
2.5,输出列表方法
void printLinkList(linkList *head)
{
linkList *curNode = head->next;
while(curNode)
{
printf("%d\n",curNode->data);
curNode = curNode->next;
}
}
2.6,释放内存方法
int freeLinkList(linkList *head)
{
linkList *linkNode = head;
linkList *curNode;
while(linkNode){
curNode = linkNode->next;
free(linkNode);
linkNode = curNode;
}
return 1;
}
三、测试输出
我们运行测试程序,输出如下:
int main() {
linkList *l = linkListInit();
linkListInsertElem(l,1,100);
linkListInsertElem(l,1,300);
printLinkList(l);
freeLinkList(l);
linkList *p = linkListInit();
linkListInsertElem(p,1,10);
linkListInsertSort(&p, 200);
linkListInsertSort(&p, 100);
linkListInsertSort(&p, 90);
printLinkList(p);
freeLinkList(p);
return 0;
}