单链表的定义
typedef struct lnode {
int data;
struct lnode* next;
}lnode, * linklist;
初始化一个空的单链表不带头结点
bool initlist(linklist &l)
{
l = NULL;
return true;
}
判断单链表是否为空
bool empty(linklist l)
{
if (l == NULL)
{
return true;
}
else
{
return false;
}
}
初始化一个空的单链表带头结点
bool initlist(linklist& l)
{
l = (lnode*)malloc(sizeof(lnode));
if (l == NULL)
return false;
l->next = NULL;
return true;
}
以下插入删除均为带头结点的操作
带头结点在第i个位置插入元素e
bool listinsert(linklist& l, int i, int e)
{
if (i < 1)
return false;
lnode* p;
int j = 0;
p = l;
while (p!=NULL && j<i-1)
{
p = p->next;
j++;
}
if (p == NULL)
return false;
lnode* s = (lnode*)malloc(sizeof(lnode));
s->data = e;
p->next = s->next;
p->next = s;
return true;
}
不带头结点在第i个位置插入元素e
bool listinsert(linklist& l, int i, int e)
{
if (i < 1)
return false;
if (i == 1)
{
lnode* s = (lnode*)malloc(sizeof(lnode));
s->data = e;
s ->next = l;
l = s;
return true;
}
lnode* p;
int j = 1;
p = l;
while (p != NULL && j < i - 1)
{
p = p->next;
j++;
}
if (p == NULL)
return false;
lnode* s = (lnode*)malloc(sizeof(lnode));
s->data = e;
p->next = s->next;
p->next = s;
return true;
}
指定结点p的后插操作e
bool insertnextnode(lnode* p, int e)
{
if (p == NULL)
return false;
lnode* s = (lnode*)malloc(sizeof(lnode));
if (s == NULL)
return false;
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
指定结点的前插操作
bool insertpriornode(lnode* p, int e)
{
if (p == NULL)
return false;
lnode* s = (lnode*)malloc(sizeof(lnode));
if (s == NULL)
return false;
s->next = p->next;
p->next = s;
s->data = p->data;
p->data = e;
return true;
}
按位序删除
bool listdelete(linklist& l, int i, int e)
{
if (i < 1)
return false;
lnode* p;
int j = 0;
p = l;
while (p!=NULL &&j<i-1)
{
p = p->next;
j++;
}
if (p == NULL)
return false;
if (p->next ==NULL)
{
return false;
}
lnode* q = p->next;
e = q->data;
p->next = q->next;
free(q);
return true;
}
指定结点的删除 指定的结点是最后一个的时候需要特殊处理
bool deletenode(lnode* p)
{
if (p == NULL)
return false;
lnode* q = p->next;
p->data = p->next->data;
p->next = q->next;
free(q);
return true;
}