C++链式线性表的代码实现

C++链式线性表的代码实现

1.结构体定义

typedef struct Node
{
	ElemType data;         //单链表中的数据域
	struct Node *next;    //单链表的指针域
}Node, *LinkList;//LinkList为指向结构体Node的指针

2.单链表的初始化

单链表的初始化——构造一个空表。下面是代码:

int InitList(LinkList &L)       //初始化链表
{
	L = new Node;//新建头结点,用头指针L指向它
	L->next = NULL;//把头结点的指针域置空
	return 1;
}

3.单链表的取值

ElemType GetElem(LinkList L, int i, ElemType e) //链表的取值
{
	LinkList p;
	p = L->next;         //初始化指针p使其指向首元结点
	int j = 0;          //计数器初始值置1
	cout << "请输入要取值的序号:";
	cin >> i;          //输入取值的序号
	while (p != NULL && j < i - 1)
	//指针p顺着链向后扫描,设置终止条件为p空或者指向第i个元素
	{
		p = p->next;   //p指向下一个结点
		j++;   //计数器自增
	}
	e = p->data;   //取第i个节点的数据域
	cout << "取值的序号所对应的数据为:" << e << endl;
	return e;
}

4.单链表的插入元素

int ListInsert(LinkList &L, int i, ElemType e)              //链表的插入
{
	LinkList p;
	p = L;         //p指针指向头结点
	int j = 0;     //计数器初始化为0
	cout << "请输入需要插入的位置:";
	cin >> i;     //输入插入的序号i
	cout << "请输入需要插入的内容:";
	cin >> e;     //输入插入的内容e
	while (p != NULL && j < i - 1)
	//指针p顺着链向后扫描,设置终止条件为p空或者指向第i个元素
	{
		p = p->next; j++;//p指向下一个结点并且计数器自增
	}
	if(!p||j>i-1)  return 0;  //i>n+1或者i<1
	Node *s;       //生成指针*s
	s = new Node;      //新增结点,并让*s指向它
	s->data = e;       //数据域置为e
	s->next = p->next;     //*s指向结点ai
	p->next = s;    //使*p指向*s
	return 1;

}

5.单链表的查找

ElemType ListFind(LinkList L, ElemType e)                  //链表的查找
{
	LinkList p;
	p = L->next;     //定义指针p指向首元结点
	int j = 0;     //计数器置0
	cout << "请输入需要查找的内容:";
	cin >> e;   //输入查找内容e
	while (p != NULL && p->data != e)//p不为空或者还没找到内容
	{
		p = p->next;     //p向后扫描
		j++;    //计数器自增
	}
	cout << "您需要查找的内容在表中的第" << j + 1 << "个位置" << endl;
	return 0;
}

6.链表的删除元素

int DeleteList(LinkList &L, int i)               //链表的删除
{
	LinkList p;
	p = L;       //指针p指向头结点
	int j = 0;   //计数器置为0
	cout << "请输入需要删除的序号:";
	cin >> i;   //输入取值的序号
	while (p->next != NULL && j < i - 1)
	//指针p顺着链向后扫描,设置终止条件为p空或者指向第i个元素
	{
		p = p->next; j++;    //p指向下一个结点并且计数器自增
	}
	LinkList q;     //新建指针q,保存删除节点的空间
	q = p->next;
	p->next = p->next->next;    //改变p的指针域,达到删除内容结果
	delete q;    //删除节点
	return 1;
}

7.使用前插法建立链表

void CreateList1(LinkList &L, int n)                          //前插法建立链表
{
	L = new Node;
	L->next = NULL;      //头结点指针域置空
	cout << endl;
	cout << "请依次输入链表的数据(前插法):";
	for (int i = 0; i < n; i++)   //循环,直到建立完毕
	{
		LinkList p;
		p = new Node;          //用p开一个节点
		cin >> p->data;       //输入插入的数据
		p->next = L->next;   //新插入的每个节点作为首元结点
		L->next = p;       //头结点指针域指向p
	}
}

8.使用后插法建立链表

void CreateList2(LinkList &L, int n)               //后插法建立链表
{
	L = new Node;
	L->next = NULL;    //头结点指针域置空
	LinkList r=L;     //新建指针r,初始指向头结点
	cout << endl;
	cout << "请依次输入链表的数据(后插法):";
	for (int i = 0; i < n; i++)      //循环,直到建立完毕
	{
		LinkList p;
		p = new Node;       //用p开一个节点
		cin >> p->data;    //输入插入的数据
		p->next = NULL;  //插到最后,指针域为空
		r->next = p;    //让r的指针域指向p
		r = p;         //让r指向新的尾结点*p
	}
}

9.链表内容的打印

void Show(LinkList L, int n)                 //打印链表
{
	LinkList p;
	p = L->next;    //新建指针p,用于后期遍历
	cout << "当前链表中的内容为:";
	for (int i = 0; i < n; i++)
	{
		cout << p->data << "  ";
		p = p->next;  //p向后扫描
	}
	cout << endl << endl;
}

你可能感兴趣的:(C++链式线性表的代码实现)