1.线性表的顺序结构就是 数组
2.链表概念:
有一个或多个含有指针成员变量的结构体,通过其指针成员的地址指向形成逻辑上的链式结构
链表的优点:方便插入和删除元素,不方便存取(存取是数组的优点)
这里使用的是vscode软件
环境:链接了虚拟机VM,编译使用linux命令
开始代码:
---无头单链表---
1.创建对应的 .c .h文件
2.开始在link_list.h文件写
2.1 创建结点结构体
#ifndef __LINK_LIST_H__
#define __LINK_LIST_H__
typedef int DataType;//typedef作用相当于改名,将int改成DataType
//写结构体,也就是链表中的一般节点
struct node
{
DataType data;//数据域
struct node *next;//指针域
}
#endif
2.2 创建链表的函数
#ifndef __LINK_LIST_H__
#define __LINK_LIST_H__
typedef int DataType;//typedef作用相当于改名,将int改成DataType
//写结构体,也就是链表中的一般节点
struct node
{
DataType data;//数据域
struct node *next;//指针域
}
struct node * create_link_list();//创建链表
#endif
3. 在link.c中完善创建链表的函数
#include <stdio.h>
#include <stdlib.h>
#include "link_list.h"
struct node * create_link_list()
{
DataType d;
struct node *head=NULL;//创建头节点
struct node *tail=NULL;//创建尾节点
struct node *pnew=NULL;//创建新节点
while (1)
{
scanf("%d",&d);
if (d==0)
{
break;
}
pnew=malloc(sizeof(struct node));//给结构体分配空间
//完善结点相关信息
pnew->data=d;
pnew->next=NULL;
if(head==NULL)//从无到有
{
head=pnew;
tail=pnew;
}
else
{
//头插法
pnew->next=head;
head=pnew;//更新头结点
// //尾插法
// tail->next=pnew;
// tail=pnew;//更新尾节点
}
}
return head;
};
图示链表插入的过程
3.1 在link_list.c写一个打印链表元素的函数,link_list.h声明
void printf_link_list(struct node *L)//打印链表中的元素
{
while (L)
{
printf("%d ",L->data);
L=L->next;
}
printf("\n");
}
4.main.c 文件
#include <stdio.h>
#include "link_list.h"
int main()
{
struct node * L;
L=create_link_list();
printf_link_list(L);
return 0;
}
5.编译成功,main函数
6.运行成功
7.后面还有增删查改功能
---有头单链表---
推荐对无头链表熟练后再看,相对无头链表而言,有头链表仅仅只是多了几行代码而已
1.创建文件
2.在head_link_list.h中写入节点的结构体和头结点的结构体,声明创建链表和打印链表的函数
#ifndef __HEAD_LINK_LIST_H__
#define __HEAD_LINK_LIST_H__
typedef int DataType;
//创建头结点
struct head_list
{
int nodenum;//节点数量
struct node * first;//头指针
struct node * last;//尾指针
};
//创建一般节点
struct node
{
DataType data;//数据域
//指针域
struct node * next;
};
struct head_list * create_head_link_list();//创建链表
void printf_head_link_list(struct head_list *L);//打印链表
#endif
到这里,基本可以看到与前面的无头单链表仅仅只是多了一个结构体
3.在head_link_list.c中完善相关函数
#include <stdio.h>
#include <stdlib.h>
#include "head_link_list.h"
struct head_list * create_head_link_list()
{
DataType d;
// struct head_list *L;//error错误写法
//为头结点申请空间
struct head_list *L=(struct head_list*)malloc(sizeof(*L));
//完善结构体头结点的初始化
L->nodenum=0;
L->first=NULL;
L->last=NULL;
//新创建的节点pnew
struct node *pnew=NULL;
while (1)
{
scanf("%d",&d);
if (d==0)//输入0时结束
{
break;
}
//为pnew申请空间,并完善结构体节点的初始化
pnew=malloc(sizeof(*pnew));
pnew->data=d;
pnew->next=NULL;
//将节点放入链表中
//从无到有
if(L->first==NULL)
{
L->first=pnew;
L->last=pnew;
}
//少到多
else
{
//头插法
pnew->next=L->first;
L->first=pnew;
//尾插法
// L->last->next=pnew;
// L->lasst=pnew;
}
L->nodenum++;
}
return L;
};
//打印链表
void printf_head_link_list(struct head_list *L)
{
struct node *p=L->first;
while (p)
{
printf("%d ",p->data);
p=p->next;//指针后移
}
printf("\n");
}
这里可以看到与前面的无头单链表相比,多了一个新节点要申请空间,完善消息
4.main.c文件
#include <stdio.h>
#include "head_link_list.h"
#include <stdlib.h>
int main()
{
struct head_list *L;
L=create_head_link_list();//创建链表
printf_head_link_list(L);
return 0;
}