定义结点,以及链表的初始化
typedef int ElemType;//数据类型
//定义结点
typedef struct Lnode
{
ElemType date;//数据域
struct Lnode* next;//指针域
}Lnode, * LinkList;
//链表的初始化
LinkList LinkListInit()
{
LinkList L;
L = new Lnode;
L->next = NULL;
return L;
}
创建单链表
//创建单链表(添加n个元素)
void CreatList_R(LinkList& L, int n)
{
LinkList p, r;
L = new Lnode;
L->next = NULL;
r = L;
for (int i = n; i > 0; i--)
{
p = new Lnode;
//scanf_s("%d",&p->date);
cin >> p->date;
p->next = NULL;
r->next = p;
r = p;
}
}
添加元素在表尾
//1:添加元素在表尾
Status AddElemType_L(LinkList& L)
{
printf("请输入要添加的元素\n");
ElemType e = 0;
cin >> e;
LinkList p = L;
while (p->next!=NULL)
{
p = p->next;
}
Lnode* s = new Lnode;
s->date = e;
s->next = NULL;
p->next = s;
ListTraverse( L);
return OK;
}
按index删除元素
Status ListDelete_index(LinkList& L, ElemType& e)
{
printf("请输入要删除的元素的index\n");
int i = 0;
cin >> i;
LinkList p = L;
int j = 0;
while (p->next && j < i - 1)//使p指向i所指向的位置
{
p = p->next; j++;
}
if (!(p->next) || j < i - 1)
return ERROR;
LinkList q = p->next;
p->next = q->next;
e = q->date;
delete q;
return OK;
}
按值删除
Status ListDelete_ElemType(LinkList& L,ElemType& e)
{
Status Elem = 0;
printf("请输入要删除的元素的值\n");
cin >> Elem;
LinkList p = L;
while (p)
{
if (Elem==p->next->date)
{
LinkList q = p->next;
p->next = q->next;
e = q->date;
delete q;
//p->next = p->next->next;//(其实就是这样)
return OK;
}
p = p->next;
}
return ERROR;
}
修改元素,按值修改
Status ListChange_ElemType(LinkList& L, ElemType& e)
{
Status Elem = 0; Status elem = 0;
printf("请输入要修改的元素的值:\n");
cin >> Elem;
printf("请输入修改后的元素的值:\n");
cin >> elem;
LinkList p = L;
while (p)
{
if (Elem == p->date)
{
e = p->date;
p->date = elem;
return OK;
}
p = p->next;
}
return ERROR;
}
按index修改
Status ListChange_index(LinkList& L, ElemType& e)
{
printf("请输入要修改第几个元素:\n");
int i = 0;
cin >> i;
printf("请输入修改的后的值为:\n");
int elem = 0;
cin >> elem;
LinkList p = L;
int j = 0;
while (p->next && j < i )//使p指向i所指向的位置
{
p = p->next; j++;
}
if (!(p->next) || j < i)
return ERROR;
/*LinkList q = p->next;
p->next = q->next;
e = q->date;
delete q;*/
p->date = elem;
return OK;
}
查找元素,按值查找
Lnode* LocateElem_L(LinkList L)//按值查找,返回该数据的地址
{
printf("请输入要查找的元素的值\n");
Status e = 0;
cin >> e;
LinkList p;
p = L->next;
while (p && p->date != e)
p = p->next;
return p;
}
int LocateElem(LinkList L,LinkList l)//返回这个元素的index
{
LinkList p = L->next;
int i = 1;
while (true)
{
if (p == l)
{
return i;
}
i++;
p = p->next;
}
}
按index查找
Status Locateindex_L(LinkList L)
{
printf("请输入要查询第几个元素:\n");
int index = 0;
cin >> index;
LinkList l = L;
for (int i = 1 ; i <= ListLength_L(L); i++)
{
l = l->next;
if (index == i)
{
return l->date;
}
}
return index;
}
遍历单链表
遍历单链表
void ListTraverse(LinkList L)
{
LinkList p = L->next;
while (p)
{
printf("%d ", p->date);
p = p->next;
}
printf("\n");
}
插入元素在第i个元素的位置
//6:在L中的第i个元素之间插入数据元素e
Status ListInsert_L(LinkList& L)
{
int i = 0;
Status e = 0;
printf("请输入要插入的位置\n");
cin >> i;
printf("请输入要插入的值\n");
cin >> e;
LinkList p;
p = L; int j = 0;
while (p && j < i - 1) {
p = p->next; j++;
}
if (!p || j > i - 1)
return ERROR;
Lnode* s = new Lnode;
s->date = e;
s->next = p->next;
p->next = s;
return OK;
}
清空单链表
//8:清空单链表
Status ClearList(LinkList& L)
{
Lnode* p, * q;
p = L->next;
while (p) { //p=NULL,到了表尾
q = p->next;
delete p;
p = q;
}
L->next = NULL; // 头结点指针域为空
return OK;
}
销毁单链表
//9:销毁单链表
Status DestroyList_L(LinkList& L)
{
Lnode* p;
while (L) { //循环的结束条件L->next=NULL,到达了表尾
p = L;
L = L->next;
delete p;
}
return OK;
}
判断是否为空表
//10:判断是否为空表
Status ListEmpty(LinkList L)
{
if (L->next)
{
printf("为空表\n");
return TRUE;
}
else
printf("不是空表\n");
return FALSE;
}