目录
链表
链表是数据结构中线性表的一种,其中每个元素实际上是一个单独的结构体对象,而所有对象都通过每个元素中的指针链接在一起
结点:
链表中每个结构体对象叫做结点。
首元结点:
第一个数据结点。
头结点:
如果第一个结点不用于存储数据,只用于代表链表的起始点,则这个结点称为链表的头结点。
指针域:保存下一个结点的地址
最后一个指针域指向NULL
链表的结构示意图:
功能实现
创建链表
//声明一个结构体类型,作为结点的类型
typedef struct node
{
int id;//数据域
struct node* next;//指针域
}NODE;
//申请一个头结点让head只想这个结点
NODE* init()
{
NODE* temp = (NODE*)malloc(sizeof(NODE));
temp->id = 0;
temp->next = NULL;
return temp;
}
增加元素
//增加元素 头插法
void insert(NODE*head,int data)//接收主函数的head值
{
//申请一片新的内存,作为新结点S的存储空间
NODE* S = (NODE*)malloc(sizeof(NODE));
//保存数据
S->id = data;
//结点S连接到单链表中,并成为新的首元结点
S->next = head->next;
head->next = S;
}
输出元素
//输出元素
void print(NODE*head)
{
if (head == NULL)
{
printf("单链表为空");
return;
}
NODE* p = head->next;//p指向首元结点
while (p != NULL)
{
printf("%d ", p->id);
p = p->next;
}
printf("\n");
}
修改元素
//修改元素
void change(NODE*head,int val,int data)
{
NODE* p = head->next;
while (p != NULL)
{
if (p->id == val)
{
p->id = data;
}
p = p->next;
}
}
查找元素
//查找元素
void find(NODE* head, int val)
{
NODE* p = head->next;
int flag = 0;//标记p指向首元结点的位置
while (p != NULL)
{
flag++;
if (p->id == val)
{
printf("%d的位置是%d ", p->id, flag);
}
p = p->next;
}
printf("\n");
}
删除元素
删除元素
void delete(NODE* head, int val)
{
NODE* p1 = head->next;
NODE* p2 = head;
while (p1 != NULL)
{
if (p1->id == val)
{
p2->next = p1->next;
free(p1);
p1 = p2->next;
}
else
{
p1 = p1->next;
p2 = p2->next;
}
}
}
释放所有结点
//释放所有结点
void AllClean(NODE* *list)//要改变head的值
{
NODE* p =(*list)->next;
while (p != NULL)
{
(*list)->next = p->next;
free(p);
p = (*list)->next;
}
free(*list);
*list = NULL;//让*list指向的为空,不可以是head,这个时候head已经被释放了
}
第二种方式他不会释放头结点所以不可取
//释放所有结点
void AllClean(NODE* head)
{
NODE* p = head->next;
while (p != NULL)
{
head->next = p->next;
free(p);
p = head->next;
}
free(head);
head = NULL;//head清除了要用*list指向空
}
主函数调用
int main()
{
NODE* head = NULL;//head指向头结点
head = init();
//printf("%p", head);
//测试1-4
//增加元素
for (int i = 0; i < 4; i++)
{
insert(head, i + 1);
}
print(head);
//修改元素
change(head, 2, 4);
print(head);
//查找元素
find(head, 4);
//
delete(head, 3);
//
print(head);
//
AllClean(&head);
//AllClean(head);
print(head);
}