数据结构中链表是基础中的基础,接下来,学习一下链表
//创建链表
typedef struct LinkNode//用结构体来创建
{
int id;//数据域(用来填写数据)
LinkNode* next;//指针域(用来存放下一个结点的指针)
}link_node;
编写函数:link_node* init_linklist()
建立带有头结点的单向链表,循环创建结点,结点数据域中的数值从键盘输入,以 -1 作为输入结束标志,链表的头结点地址由函数值返回.
//初始化链表
link_node* init_linklist()
{
link_node* head = NULL;//申请一个头节点,制空
head = (link_node*)malloc(sizeof(link_node));//给头节点申请内存空间
if (head == NULL)//如果头节点等于空
{
return NULL;//退出
}
//head->id = -1;//头节点,不维护数据域
head->next = NULL;//头节点指针制空(初始化)
link_node* p_current = head;//current指向第一个真实数据节点
int data = 0 ;//创建data
while (1)//循环
{
printf("插入数据:\n");
scanf("%d", &data);//输入一个int型数据
if (data == -1)//如果输入-1,就退出
{
break;
}
link_node* newnode = (link_node*)malloc(sizeof(link_node));
//创建一个新的指针newnode 给它申请内存空间
if (newnode == NULL)//如果这个指针没有地址,退出循环
{
break;
}
newnode->id = data;//给newnode 记录数据
newnode->next = NULL;//给newnode记录地址
p_current->next = newnode;//重新赋到p_current上
p_current = newnode;
}
return head;
}
编写函数:void foreach_LinkList(LinkNode* head)
//遍历
void foreach_LinkList(LinkNode* head) {
if (head == NULL)//判断头节点为空就返回
{
return;
}
struct LinkNode* current = head->next;//current指向第一个真实数据节点
while (current != NULL)//循环打印,直到尾结点为空
{
printf("%d\n", current->id);//打印当前节点数据
current = current->next;//指向下一个节点
}
}
编写函数: void insert_LinkList( LinkNode* head, int oldVal,int newVal).
//插入
void insert_LinkList(LinkNode* head, int oldVal,int newVal)
{
if (head == NULL)//判断头节点为空就返回
{
return;
}
//创建两个辅助指针
LinkNode* current = head->next;
LinkNode* prev = head;
while (current != NULL)
{
if (current->id == oldVal)//值跟原来一样就退出循环
{
break;
}
//移动两个赋值的指针
prev = current;
current = current->next;
}
//创新的节点
LinkNode* newNode = (link_node*)malloc(sizeof(LinkNode));
newNode->id = newVal;
newNode->next = NULL;
//更新指针的指向
newNode->next = current;
prev->next = newNode;
}
编写函数: void remove_LinkList(LinkNode* head, int val)
//删除
void remove_LinkList(LinkNode* head, int val)
{
if (head == NULL)//判断头节点为空就返回
{
return;
}
//创建辅助指针
LinkNode* prev = head;
LinkNode* current = prev->next;
//查找值为val的节点
while (current != NULL)
{
if (current->id = val)
{
break;
}
prev = current;
current = prev->next;
}
//如果current为空表示没找到,退出
if (current = NULL)
{
return;
}
prev->next = current->next;//删除当前节点,并重新建立当前节点current的前驱后继节点关系
free(current);//释放掉内存
}
编写函数: void destroy_linklist(link_node* head)
//销毁
void destroy_LinlList(LinkNode* head)
{
if (head == NULL)//判断头节点为空就返回
{
return;
}
LinkNode* current = head;//创建辅助指针
while (current != NULL)//持续循环直到指针为空
{
LinkNode* p_next = current->next;//缓存当前节点寻找下一个节点
free(current);//释放内存
current = p_next;//替换继续下一个
}
}
静态链表
//静态链表
void StaticList()
{
//创建节点
struct LinkNode node1 = {
10,NULL };
struct LinkNode node2 = {
20,NULL };
struct LinkNode node3 = {
30,NULL };
struct LinkNode node4 = {
40,NULL };
struct LinkNode node5 = {
50,NULL };
//建立节点之间的联系
node1.next = &node2;
node2.next = &node3;
node3.next = &node4;
node4.next = &node5;
//遍历
struct LinkNode* pCurrent = &node1;
while (pCurrent != NULL)
{
printf("%d\n", pCurrent->id);
pCurrent = pCurrent->next;
}
}
动态链表
//动态链表
void DynamicList()
{
//申请动态内存空间并建立节点
struct LinkNode* node1 = (LinkNode*)malloc(sizeof(struct LinkNode));
node1->id = 10;
struct LinkNode* node2 = (LinkNode*)malloc(sizeof(struct LinkNode));
node2->id = 20;
struct LinkNode* node3 = (LinkNode*)malloc(sizeof(struct LinkNode));
node3->id = 30;
struct LinkNode* node4 = (LinkNode*)malloc(sizeof(struct LinkNode));
node4->id = 40;
//建立节点关系
node1->next = node2;
node2->next = node3;
node3->next = node4;
node4->next = NULL;
//遍历
struct LinkNode* pCurrent = &node1;
while (pCurrent != NULL)
{
printf("%d\n", pCurrent->id);
pCurrent = pCurrent->next;
}
//释放
free(node1);
free(node2);
free(node3);
free(node4);
}