#include<iostream>
#include<algorithm>
using namespace std;
typedef struct LNode {
int data;
struct LNode* next;
}LNode, * LinkList;
//初始化单链表
bool InitList(LinkList& L)
{
L = NULL;
return true;
}
//头插法创建单链表
LinkList List_HeadInsert(LinkList& L)
{
InitList(L);
int x = 0;
cin >> x;
while (x != 99)
{
LNode* s;
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = L;
L = s;
cin >> x;
}
return L;
}
//按位查找,不带头节点
LNode* GetElem(LinkList L, int i)
{
if (i < 1)
{
return false;
}
int j = 1;
LNode* p = L;
while (p&& j < i)
{
p = p->next;
j++;
}
return p;
}
//按值查找
LNode* LocateElem(LinkList L, int e)
{
LNode* p = L;
while (p && p->data != e)
{
p = p->next;
}
return p;
}
//统计单链表的长度
int Length(LinkList)
{
int len = 0;
LNode* p = L;
while (p)
{
len++;
p = p->next;
}
return len;
}
//后插操作。在节点p之后插入元素e
bool InsertNextNode(LNode* p, int e)
{
if (!p)
{
return false;
}
LNode* s = (LNode*)malloc(sizeof(LNode));
if (!s)
{
return false;
}
s->data = e;
s->next = p->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;//不在第一个位置插入;
p = L;
int j = 1;
while (p && j < i - 1)
{
p = p->next;
j++;
}
if (!p)
{
return false;
}
return InsertNextNode(p, e);
}
//前插操作,在p节点前插入元素e
bool InsertPriorNode(LNode* p, int e)
{
if (!p)
{
return false;
}
LNode* s = (LNode*)malloc(sizeof(LNode));
if (!s)
{
return false;
}
s->next = p->next;
p->next = s;
s->data = p->data;
p->data = e;
return true;
}
//前插操作,在p节点前插入节点s;
bool InsertPriorNode(LNode* p, LNode* s)
{
if (!p || !s)
{
return false;
}
s->next = p->next;
p -> next = s;
swap(s->data, p->data);
return true;
}
//删除位序为i的节点,e是i节点的值
bool ListDelete(LinkList& L, int i, int& e)
{
if (L == NULL)
{
e = -1;
return false;
}
if (i < 1)
{
return false;
}
if (i > 1)
{
LNode* p = GetElem(L, i - 1);//安值查找,找到数据域等于e的节点
if (!p || !(p->next))
{
return false;
}
LNode* q = p->next;//q指针指向位序为i的节点
e = q->data;//将数值复制给e,
p->next = q->next;//p指针跳过q指针指向下一个节点
free(q);//这时q指针变为一个空节点,将这个结点释放
}
else//i==1;
{
if (L->next == NULL)//只有一个头节点,直接将这个节点变为空,
{
e = L->data;
L = NULL;
}
else//L->next!==NULL;//头节点后还有节点,将下一个节点变为头节点.
{
e = L->data;
L = L->next;
}
}
return true;
}
//删除指定节点P,核心在于找p的下一个节点,将下一个节点的值覆盖P节点,p指向下下一个节点。
bool DeleteNode(LNode* p)
{
if (p->next == NULL)//bug,不能删除最后一个节点
{
return false;
}
LNode* q = p->next;
p->data = q->data;
p->next = q->next;
free(q);
return true;
}
//尾插法创建不带节点的单链表
LinkList List_Taillnsert(LinkList& L)
{
InitList(L);
int x = 0;
cout << "请输入数据" << endl;
cin >> x;
LNode* s, * r = L;//r=L->next;
while ( x!= 9999) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = NULL;
if (L == NULL) {//第一次插入,L==NULL;
L = s;//将覆盖L;
r = s;//指针还是指向最后
}
else {//从第二此插入开始,L!=NULL
r->next = s;//此次表尾指针指向最后
r = s;//
}
cin >> x;
}
r->next = NULL;//退出的时候表尾指针指向NULL
return L;
}
void print(LinkList L)//打印单链表
{
LNode* s = L;
while (s != NULL)
{
cout << s->data << " ";
s = s->next;
}
cout << endl;
}
int main()
{
LinkList L;
List_HeadInsert(L);
cout << "头插法的结果" << endl;
print(L);
return 0;
}
03-13
1433
03-02
233
08-26
443
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交