##单链表基本运算的笔记(可供一些初学者学习)
(1)初始化单链表L。
(2)依次采用尾插法插入h、e、l、l、o。
(3)输出单链表L。
(4)输出单链表L的长度。
(5)判断单链表L是否为空。
(6)输出单链表L的第2个和第4个元素。
(7)输出元素o位置。
(8)在单链表L的第4个位置上插入元素r。
(9)输出单链表L。
(10)删除单链表L的第3个元素。
(11)输出单链表L。
(12)释放单链表L。
#include <stdio.h>
#include <malloc.h>
typedef char ElemType; /*相当于typedef给char换个名字Elemtype,便于之后修改,
比如你要把所有char改成int,只需要改这一个地方。*/
typedef struct LNode //同理,定义结点,结点可以换一个长方形,切成两半,左边是数据域,右边是指针域
{
ElemType data; //相当于char data,定义数据域
struct LNode *next; //定义指针域
}LinkList; //结构体变量,比如后面的LinkList *&L可以跟int x对比一下就理解了
void InitList(LinkList *&L) /*初始化操作:就是创建一个头结点,头结点没有data,有next,
所以头结点不为空可以与链表为不为空作区分,链表只有头结点的话,就是为空。
另外,括号里的形参有的是*&L,有的是*L,可简单记为有增减操作用*&L*/
{
L = (LinkList *)malloc(sizeof(LinkList)); /*malloc(size):用来申请一块动态内存,参数size是要申请的内存的大小,
(LinkList *):把它转换成LinkList类型的指针,这里的类型就是前面L的类型。*/
L->next = NULL; //L指向空。 这里的“=”可以翻译成“指向”,会容易理解。
}
int InsertList(LinkList *&L,int i,ElemType e) //(尾插法)插入操作:在第i个位置插入元素e。 括号里的形参i,e都是手动输入的
{
int j = 0;
LinkList *p = L, *s; //定义一个结构体变量 p,让它等于头结点,再定义一个结构体变量 s
while((j < i - 1) && (p != NULL)) /*这个while是这篇代码的重点,基本很多操作都需要用到,不过很简单。
遍历:你输入想要找的位置i,当j < i - 1并且头结点不为空,那么就往后移动一个位置,
直到位置i。一开始 p 等于头结点,最后 p 会跑到第 i 个位置。*/
{
j++;
p = p->next;
}
if(p == NULL