/*****************************************************
** 文件名: Single Linked List.cpp
** Copyright (c) 2019 Asuka Shin
** 创建人: 周志豪
** 日 期: 2019.03.29
** 修改人: 周志豪
** 日 期: 2019.04.04
** 描 述: 单链表的实现
** 版 本: 3.0
*****************************************************/
#include <iostream>
#include <stdlib.h>
using namespace std;
const int TRUE = 1;
const int ERROR = 0;
const int OVERFLOW = -2;
const int OK = 1;
const int FALSE = 0;
typedef int Status;
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
/*逆序位输入n个元素的值,建立带头结点的单链线性表L*/
void CreateList_L(LinkList &L,int n);
/*通过位序查找元素*/
/*L为带头节点的单链表的头指针,当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR*/
Status GetElem_L(LinkList L, int i, ElemType &e);
/*在单链表L中的第i个元素前插入元素e*/
Status ListInsert_L(LinkList &L, int i, ElemType e);
/*在带头结点的单链线性表L中,删除第i个元素,并由e返回其值*/
Status ListDelete_L(LinkList &L, int i, ElemType &e);
/*逆序位输入n个元素的值,建立带头结点的单链线性表L*/
void CreateList_L(LinkList &L,int n)
{
LinkList p;
L = new LNode;
L -> next = NULL;//建立一个带头结点的单链表
for(int i = n; i > 0; --i)
{
p = new LNode;//生成新结点
cout << "请输入你逆序输入你要创建的链表元素" << endl;
cin >> p -> data;//向结点的数据域输入元素
p -> next = L -> next;//插入到表头
}
}
/*通过位序查找元素*/
/*L为带头节点的单链表的头指针,当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR*/
Status GetElem_L(LinkList L, int i, ElemType &e)
{
LinkList p;
int j = 1;
p = L -> next;//指针p指向了头结点后面的那个结点,因为头结点的数据域里没数据,所以可以跳过去
while(p && j < i)
{
/*首先,指针p得指向结点,不能指不到结点,其次计数器j得小于位序i,等于i的时候直接跳出循环*/
p = p -> next;//指针p不断后移
++j;//计数器也开始计数
}
if(!p || j > i)
return ERROR;//如果p指针没有指向结点,或者计数器坏了,记不了数 return ERROR
e = p -> data;//把p指向那个结点数据域的值给e
return OK;
}
/*在单链表L中的第i个元素前插入元素e*/
Status ListInsert_L(LinkList &L, int i, ElemType e)
{
LinkList p,s;//P是指针,s是结点
int j = 0;
p = L;
while(p && j < i - 1)
{
p = p -> next;
++j;
}
if(!p || j > i - 1)
return ERROR;
s = new LNode;//新建一个要插入链表的结点S
s -> data = e; //结点S的数据域为e
s ->next = p -> next;
p -> next = s;
return OK;
}
/*在带头结点的单链线性表L中,删除第i个元素,并由e返回其值*/
Status ListDelete_L(LinkList &L, int i, ElemType &e)
{
LinkList p,q;
int j;
p = L;
j = 0;
while(p -> next && j < i - 1)
{
p = p -> data;
++j;
}
if(!(p -> next) || j > i - 1)
return ERROR;
q = p -> next;
p -> next = q -> next;
e = q -> data;
free(q);
return OK;
}
/*已知单链线性表La和Lb的元素按值非递减序列排列*/
/*归并La和Lb得到新的线性表Lc,Lc的元素也按值非递减排列*/
void MergeList_L(LinkList &La, LinkList &Lb, LinkList &Lc)
{
pa = La -> next;//指针pa指向单链线性表La的第一个元素(第0个元素为头结点)
pb = Lb -> next;//指针pb指向单链线性表Lb的第一个元素(第0个元素为头结点)
Lc = pc = La;//单链线性表L c的头结点为La的头结点,且由pc指向
while(pa && pb)
{
if(pa -> data <= pb -> data) //如果p中的数据域小于pb中的数据域
pc -> next = pa;//将pa指向的结点放在单链表Lc的后面
pc = pa;//指针pc由Lc的头结点后移
pa = pa -> next;//指针pa也后移
else
{
pc -> next = pb;
pc = pb;
pb = pb -> next;
}
}
pc -> next = pa?pa:pb//将循环中已经用完的链的另一个链的元素插入剩余段
free(Lb)//释放Lb的头结点。 La的头结点变成了Lc的头结点
}
int main()
{
/*测试过程省略*/
return 0;
}
数据结构------单链表的实现
猜你喜欢
转载自blog.csdn.net/AsukaShin/article/details/89032942
今日推荐
周排行