单链表的初始化,增删改查
文章目录
单链表的定义
typedef struct LNode {
ElemType data; //数据域
struct LNode* next; //指针域
}LNode,*LinkList;
头插法(带头节点)
LinkList List_HeadInsert(LinkList& L)
{
LNode* s;
int x;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL; //初始化
scanf("%d", &x);
while (x!= 9999)
{
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d", &x);
}
return L;
}
尾插法(带头结点)
LinkList List_TailInsert(LinkList &L)
{
LNode* s;
LNode* r=L; //表尾指针,始终指向表尾
int x;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
scanf("%d", &x);
while(x!=9999)
{
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s; //r指向表尾结点
scanf("%d", &x);
}
r->next = NULL;
return L;
}
中间插(带头结点)
//在第i位置插入e
bool List_MidInsert(LinkList& L, int i,ElemType e)
{
if (i < 1)
return false;
LNode* s;
LNode* p = L; //当前扫描到的结点
int j = 0; //当前p指向第几个结点
while (p != NULL && j < i - 1)
{
p = p->next;
j++;
}
if (NULL == p)
return false;
s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
后插操作(p结点之后插入元素e)
bool InsertNextNode(LNode* p, ElemType e)
{
if (NULL==p)
return false;
LNode* s = (LNode*)malloc(sizeof(LNode));
if (NULL == s)
return false;
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
前插操作(在p结点之前插入元素e)
bool InsertPriorNode(LNode* p, LNode* s)
{
if (NULL == p || NULL == s)
return false;
s->next = p->next;
p->next = s; //s连接p之后
ElemType temp = p->data; //交换数据域部分
p->data = s->data;
s->data = temp;
return temp;
}
按位序删除(带头结点)
bool ListDelete(LinkList& L, int i, ElemType& e)
{
if (i < 1)
return false;
LNode* p = L;
int j = 0;
while (p != NULL && j < i - 1)
{
p = p->next;
j++;
}
if (NULL == p)
return false;
if (p->next = NULL)
return false;
LNode* q = p->next; //令q指向被删除结点
e = q->data; //用e返回元素的值
p->next = q->next;
free(q);
return true;
}
指定结点的删除(带头节点)
bool DeleteNode(LNode* p)
{
if (NULL == p)
return false;
LNode* q = p->next;
p->data = p->next->data;
p->next = q->next;
free(q);
return true;
}
按序号查找结点的值
LNode* GetElem(LinkList& L, int i)
{
int j = 1;
LNode* p = L->next; //p指向第一个结点
if (i == 0)
return L;
if (i < 1)
return NULL;
while (p != NULL&&j<i) //从第1个结点开始查找,找到第i个结点
{
p = p->next;
j++;
}
return p;
}
求表的长度
int Length(LinkList L)
{
int len = 0;
LNode* p = L;
for (p->next != NULL)
{
p = p->next;
len++;
}
return len;
}
打印链表
void PrintList(LinkList L)
{
L = L->next;
while (L!=NULL)
{
printf("%d\t", L->data);
L=L->next;
}
printf("\n");
}
循环单链表
//初始化循环单链表
bool InitList(LinkList& L)
{
L = (LNode*)malloc(sizeof(LNode));
if (L == NULL)
return false;
L->next = L;
return true;
}
注意:
LNode *强调返回是一个结点
LinkList 强调这是一个单链表