单链表 c++(数据结构 )
链表是一种动态数据结构,它的特点是用一组任意的存储单元(可以是连续的,也可以是不连续的)存放数据元素。
链表中每一个元素成为“结点”,每一个结点都是由数据域和指针域组成的,每个结点中的指针域指向下一个结点。Head是“头指针”,表示链表的开始,用来指向第一个结点,而最后一个指针的指针域为NULL(空地址),表示链表的结束。
链表很基础,很重要!!!
头文件:函数的声明,
//linklist.h
#pragma once
#include<iostream>
#include<stdlib.h>
#include<ctime>
using namespace std;
typedef int elemtype;
class node {
public:
elemtype data;
class node *next;
};
typedef node *linklist;
//单链表的整表创建:头插法
void creat_headlist(linklist &l, int n);
//创建链表:尾插法
void creat_taillist(linklist &l, int n);
//判空
bool isempty(linklist l);
//获取长度
int len_list(linklist l);
//读取第i个元素
int getelem(linklist l, int i, elemtype &e);
//删除第i个元素,并用e返回
int dele_list(linklist &l, int i, elemtype &e);
//打印链表
void show_list(linklist l);
//在第i个元素插入e
int insert_list(linklist &l, int i, elemtype e);
//清空链表
void clear_list(linklist &l);
函数的定义:
//linklist.cpp
#include"linklist.h"
//单链表的整表创建:头插法
void creat_headlist(linklist &l, int n)
{
node* p;
srand(time(0));
l = (linklist)malloc(sizeof(node));
(l)->next = NULL;
for (int i = 0; i < n; i++)
{
p = (linklist)malloc(sizeof(node));
p->data = rand() % 100 + 1;
p->next = (l)->next;
(l)->next = p;
}
}
//创建链表:尾插法
void creat_taillist(linklist &l, int n)
{
linklist p, r;
srand(time(0));
l = new node;
r = l;
for (int i = 0; i < n; i++)
{
p = new node;
p->data = rand() % +1;
r->next = p;
r = p;
}
r->next = NULL;
}
//判空
bool isempty(linklist l)
{
if (l->next == NULL)
{
return true;
}
else
{
return false;
}
}
//获取长度
int len_list(linklist l)
{
int len = 0;
if (isempty(l))
return 0;
else
{
while (l->next) {
len++;
l = l->next;
}
return len;
}
}
//读取第i个元素
int getelem(linklist l, int i, elemtype &e)
{
linklist p;
int j = 1;
p = l->next;
while (p&&j < i)
{
p = p->next;
j++;
}
if (i < j || !p)
{
return 0;
}
e = p->data;
return 1;
}
//删除第i个元素,并用e返回
int dele_list(linklist &l, int i, elemtype &e)
{
linklist p, q;
p = l;
if (isempty(l) || i<1 || i>len_list(l))
{
return 0;
}
else
{
int k = 1;
while (p->next && k < i)//找到被删结点的前一个结点
{
p = p->next;
k++;
}
e = p->next->data;
q = p->next;
p->next = q->next;
delete q;
return 0;
}
}
//打印链表
void show_list(linklist l)
{
linklist p = l;
if (isempty(l) == false)
{
cout << "输出链表" << endl;
for (p = l->next; p != nullptr; p = p->next)
{
cout << p->data << "--";
}
cout << endl;
}
else
{
cout << "链表为空" << endl;
}
}
//在第i个元素插入e
int insert_list(linklist &l, int i, elemtype e)
{
if (i<1 || i>len_list(l)) {
return 0;
}
else {
int k = 1; node *p, *q;
q = l;
p = new node;
p->data = e;
while (k < i) { //第i-1个元素
k++;
q = q->next;
}
p->next = q->next;
q->next = p;
}
return 1;
}
//清空链表
void clear_list(linklist &l)
{
linklist p,q;
p = l->next; //指向第一个结点
while (p != NULL) //没到表尾
{
q = p->next; //将下一个结点备份
l->next = p->next;
delete p;
p = q;
}
l->next = NULL;//头结点指针为空
}
main函数测试:
//test.cpp
#include"链表定义.h"
int main()
{
linklist l2;
creat_headlist(l2, 5);
int a; int e;
getelem(l2, 2, a); cout << a << endl;
cout << len_list(l2) << endl;
show_list(l2);
dele_list(l2, 3,e);
cout << e << endl;
show_list(l2);
insert_list(l2, 3, 7);
show_list(l2);
clear_list(l2);
show_list(l2);
system("pause");
return 0;
}