0
点赞
收藏
分享

微信扫一扫

Flink CDC 源码解析--整体流程

静悠 2024-11-18 阅读 45

    链表是一种基础且重要的数据结构,在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(
linkListInsertSort(
linkListInsertSort(
printLinkList(p);
freeLinkList(p);
return 0;
}

举报

相关推荐

0 条评论