数据结构——链表学习
开篇博客简单的记录一下自己的学习心得,供大家一起参考,也方便自己在以后进行回顾复习
初始化链表
1.有头节点
定义一个结构体指针(也就是该链表的名字),指向分配的头节点的地址,如果想要改变该结构体的指向,则需要用二级指针,传递参数可以为**P或者 *&L这样
2.链表插入
分为尾插入和随即插入,随即插入要注意顺序
链表查找,要注意P->NEXT已经是下一个节点了,所以判断的时候要找到最后一个节点,则要判断他的下一个节点地址是否为空(NULL)
#include "stdio.h"
#include<stdlib.h>
typedef enum status
{
error,
ok
}Status;
typedef struct list_single
{
int data;
struct list_single* next;
}Lnode ,*listpoint;
/** 包括头节点的初始化 */
Status InitList(Lnode **L)
{
*L = malloc(sizeof(Lnode));
(*L)->data = 1;
(*L)->next = NULL;
return ok;
}
/**
* 有头节点链表尾插入
* Lnode* L 需要插入的链表的头指针
* 插入的数据的数值
*/
Status Create_list_back(Lnode* L, int inseert_value)
{
int i = 0;
Lnode* P=L,*S;
/** 判断是否为头节点 如果指针指向*/
if (P->next == NULL)
{
S = malloc(sizeof(Lnode));
S->next = NULL;
S->data = inseert_value;
P->next = S;
return ok;
}
/** 尾插入 */
while (1)
{
P = P->next;
if (P->next == NULL)
{
S = malloc(sizeof(Lnode));
S->next = NULL;
S->data = inseert_value;
P->next = S;
break;
}
}
return ok;
}
/**
* 有头节点的随机插入
* Lnode* L 需要插入的链表的头指针
* 在第几个元素插入
* 插入的数据的数值
*/
Status Insert_list(Lnode* L, int num, int inseert_value)
{
int i = 0;
Lnode* P = L,*S;
/* 找到n-1个元素 */
while (P && i < num - 1)
{
i++;
P = P->next;
}
S = (Lnode*)malloc(sizeof(Lnode));
S->next = P->next;
P->next = S;
S->data = inseert_value;
return ok;
}
void main()
{
Lnode* L = NULL;
Lnode *s = NULL;
printf("L存的地址:%p\n\r",L);
InitList(&L);
printf("L存的地址:%p\n\r",L);
printf("数据:%d\n\r", L->data);
Create_list_back( L, 2);
Create_list_back(L, 4);
Create_list_back(L, 5);
Create_list_back(L, 6);
Create_list_back(L, 7);
Insert_list(L, 2, 3);
printf("数据:%d\n\r", L->next->next->data);
printf("数据:%d\n\r", L->next->next->data);
}