最近在学数据结构,主要看小甲鱼的“数据结构与算法”视频,自己根据视频实现了单链表的基本操作。
主要包括以下函数;
typedef struct Node
{
ElemType data;//数据域
struct Node *Next;//指针域
}Node,*Linklist;
//头插法建立单链表
int CreatListHead(Linklist *L, int n);
//尾插法建立单链表
int CreatListTail(Linklist *L, int n);
//遍历链表输出所有元素
int OutputList(Linklist L);
//求链表长度
int GetListLength(Linklist L);
//单链表查找
//用e返回L中第i个元素的值
int GetListElem(Linklist L, ElemType *e, int i);
//单链表插入
//在L中第i个元素之前插入新的元素e,L的长度+1
int ListInsert(Linklist *L, int i, ElemType e);
//单链表删除
//删除L的第i个数据元素,并用e返回其值
int ListDelet(Linklist *L, int i, ElemType *e);
//单链表整表删除
int ClearList(Linklist *L);
直接上代码:
//头插法建立单链表
int CreatListHead(Linklist *L, int n)
{
*L = (Linklist)malloc(sizeof(Node));//头结点申请地址 注意malloc的用法
(*L)->Next = NULL;
Linklist p;
srand(time(0));//初始化随机数种子,后续用于生成随机数
for (int i = 0; i < n; i++)
{
p = (Linklist)malloc(sizeof(Node));//生成新结点
p->data = rand() % 100 + 1;//生成两位随机数
p->Next = (*L)->Next;
(*L)->Next = p;
}
return 0;
}
//尾插法建立单链表
int CreatListTail(Linklist *L, int n)
{
*L = (Linklist)malloc(sizeof(Node));//头结点申请地址 注意malloc的用法
Linklist p, r;
srand(time(0));//初始化随机数种子,后续用于生成随机数
for (int i = 0; i < n; i++)
{
p = (Linklist)malloc(sizeof(Node));//生成新结点
p->data = rand() % 100 + 1;//生成两位随机数
(*L)->Next = p;
*L = p;
}
(*L)->Next = NULL;
return 0;
}
//遍历链表输出所有元素
int OutputList(Linklist L)
{
Linklist p;
for (p = L->Next; p != NULL; p = p->Next)//遍历链表
{
cout << p->data << " ";
}
cout << endl;
return 0;
}
//求链表长度
int GetListLength(Linklist L)
{
Linklist p;
int Length = 0;
for (p = L->Next; p != NULL; p = p->Next)//遍历链表
{
//cout << p->data << " ";
Length++;
}
return Length;
}
//单链表查找
//用e返回L中第i个元素的值
int GetListElem(Linklist L, ElemType *e, int i)
{
int j = 0;
Linklist p;
p = L->Next;
while (p&&j<i)
{
p = p->Next;
j++;
}
if (!p || j < i)//存在性判断
{
return 1;
}
*e = p->data;
return 0;
}
//单链表插入
//在L中第i个元素之前插入新的元素e,L的长度+1
int ListInsert(Linklist *L, int i, ElemType e)
{
Linklist p, r;
p = (*L)->Next;
int j=0;
while (p&&j<i)
{
p= p->Next;
j++;
}
if (!p || j < i)//存在性判断
{
return 1;
}
r = (Linklist)malloc(sizeof(Node));
r->data = e;
r->Next = p->Next;
p->Next = r;
return 0;
}
//单链表删除
//删除L的第i个数据元素,并用e返回其值
int ListDelet(Linklist *L, int i, ElemType *e)
{
Linklist p, r;
p = (*L)->Next;
int j=0;
while (p&&j<i)
{
p = p->Next;
j++;
}
if (!p || j < i)//存在性判断
{
return 1;
}
r = (Linklist)malloc(sizeof(Node));
r = p->Next;
p->Next = r->Next;
*e = r->data;
free(r);
return 0;
}
//单链表整表删除
int ClearList(Linklist *L)
{
Linklist p, q;
p = (*L)->Next;
q = (Linklist)malloc(sizeof(Node));
while (p)
{
q = p->Next;
free(p);
p = q;
}
return 0;
}
简单测试代码:
int main()
{
int n;
Linklist list1;
cout << "输入单链表的长度:" << endl;
cin >> n;
CreatListHead(&list1, n);
OutputList(list1);
int length = GetListLength(list1);
cout << "链表的长度是" << length << endl;
cout << "请输入要取哪一个元素的位置" << endl;
int i,elem;
cin >> i;
GetListElem(list1, &elem, i);
cout << "该位置元素为" << elem << endl;
cout << "请输入要删除哪一个元素的位置" << endl;
int a,elem1;
cin >> a;
ListDelet(&list1, a, &elem1);
cout << "要删除的元素为" << elem1 << endl;
OutputList(list1);
getchar();
return 0;
}
测试结果: