单链表插入
/***************************************************
思路:
1>声明一个指向头结点的指针P
2>遍历列表使P指向第i-1个结点
3>当p为空或j>i,则不存在。
4>生成空结点赋值并插入
*****************************************************/
Status LinkInsert(LinkInsert *L, int i, Elemtype e)
{
LinkInsert p, s;
p = *L; //1>声明一个指向头结点的指针P
int j = 0;
while (p && j < i - 1) //2>遍历列表使P指向 **第i-1个** 结点
{
p = p->next;
++j;
}
if (!p || j > i) //3>当p为空或j>i,则不存在。
return False;
s = (Linklist)malloc(sizeof(Node)); //4>生成空结点赋值并插入
s->data = e;
s->next = p->next; //**p -> next即为第i个结点**
p->next = s;
return True;
}
单链表读取
/*************************************************
思路:
1>声明一个指向第一个结点的指针P
2>遍历列表使P指向第i个结点
3>当p为空或j>i,则不存在
4>返回结点的数据
************************************************/
#include <stdio.h>
typedef int Elemtype;
typedef int Status;
typedef struct NODE
{
Elemtype data;
struct NODE *next;
} Node;
typedef Node *Linklist;
Status GetElem(Linklist L, int i, Elemtype *e)
{
Linklist p;
p = L->next; //1>声明一个指向第一个结点的指针P
int j = 1;
while (p && j < i) //2>遍历列表使P指向**第i个**元素
{
p = p->next;
j++;
}
if (!p || j > i) //3>当p为空或j>i,则不存在
return False;
*e = p->data; //4>返回结点的数据
return True;
}
单链表删除
/***************************************
思路:
(1)声明一个指向头结点的指针P
(2)遍历列表使P指向第i-1个结点
(3)当p为空或j>i,则不存在
4>取出删除的结点给q,断开结点
5>结点数据返回并释放q
****************************************/
Status ListDelect(Linklist *L, int i, Elemtype *e)
{
Linklist p, q;
p = *L; //(1)声明一个指向头结点的指针P
int j = 0;
while (p && j < i) //(2)遍历列表使P指向第i-1个结点
{
p = p->next;
++j;
}
if (!p || j > i) //(3)当p为空或j>i,则不存在
return False;
q = p->next; //4>取出删除的结点给q,断开结点
p->next = q->next;
*e = q->data; //5>结点数据返回并释放q
free(q);
return True;
}
前插法创建单链表
/****************************************
* <前插法创建单链表>
思路:
1>创建只含头结点的空链表
2>创建指针P
3>循环:生成新节点,赋值插入
*****************************************/
void CreatListHead(Linklist *L,int n)
{
*L = (Linklist)malloc(sizeof(Node));
(*L)->next = NULL; //1>创建只含头结点的空链表
Linklist p; //2>创建指针P
srand(time(0));
for (int i = 0; i < n; ++i) //3>循环:生成新节点,赋值插入
{
p = (Linklist)malloc(sizeof(Node));
p->data = rand() % 100 + 1;
p->next = (*L)->next; //(*L)->next==NULL;为什么不直接写NULL?
(*L)->next = p;
}
}
后插法创建单链表
/*********************************************
思路:
1>创建带头结点空链表
2>创建指针p,r,并初始化尾指针r
3>循环:生成新结点赋值并插入,尾指针再次初始化
*********************************************/
void CreatListTail(Linklist *L, int n)
{
*L = (linklist)malloc(sizeof(Node));
(*L)->next = NULL; //1>创建带头结点空链表
Linklist p, r;
r = *L; // 2>创建指针p,r,并初始化为指针r
srand(time(0));
for (int i = 0; i < n; ++i) //3>循环:生成新结点赋值并插入,尾指针再次初始化
{
p = (Linklist)malloc(sizeof(Node));
p->data = rand() % 100 + 1;
r->next = p;
r = p;
}
}
单链表整表删除
/********************************************
思路:
1>声明前后指针p,q
2>第一个结点赋给p
3>循环:下一个结点给q;
free(P);
将p赋给q;
*********************************************/
Status ClearList(Linklist *L)
{
Linklist p, q; //1>声明前后指针p,q
p = (*L)->next; //2>第一个结点赋给p
while (p)
{
q = p->next; //下一个结点给q;
free(p); //free(P);
p = q; //将p赋给q;
}
(*L)->next = NULL;
return True;
}