//#include <stdio.h> // c 库
#include <stdlib.h> //maclloc 库
#include <iostream> // c++ 库
// 有本句 ,下面cout 前面可以没有 std::
using namespace std;
typedef char ElemType; //元素数据 以字符型为例
// 定义单链表节点类型
typedef struct LNode {
ElemType data; //ElemType 数组,使用动态初始化
struct LNode* next;
}LNode, * LinkList;
// 1 初始化,创建头节点
bool InitList(LinkList& L) {
L = (LNode*)malloc(sizeof(LNode)); //申请内存,地址赋给头节点, L带出去指代链表
//L=new Lnode;
L->next = NULL; // 因为L是指针类型,对内部成员访问采用 L->
// L->next 头节点成员,存放下一个节点的地址,可以代表下一个节点
return 1;
}
// 增1 头插法建立单链表
bool HeadInsert(LinkList& L) { // l是对指针的引用
ElemType x; //输入元素
LNode* s; //节点类型指针,指向新申请的空间,即新插入的元素
//输入数据,并插入链表
cin >> x;
while (x != 'z') {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = L->next; //新节点的下一个 变为 头节点的下一个
L->next = s; //头节点下一个变为新插入的节点
//输入数据,并插入链表
cin >> x;
}
return L;
}
// 增2 尾插法建立单链表
LinkList TailInsert(LinkList& L) {
LNode* s, * r = L;
ElemType x;
cin >> x;
while (x != 'z') {
s = new LNode;
s->data = x;
r->next = s;
r = s;
cin >> x;
}
r->next = NULL;
return L;
}
//查1 求链表长度
int Length(LinkList L) {
LNode* p = L;
int j = 0;
while (p->next != NULL)
{
j++;
p = p->next;
}
return j;
}
//查2 遍历
bool TraveList(LinkList L) {
LNode* p = L->next; //p 和头节点的next 都指向第一个真节点
while (p) {
cout << p->data << " ";
p = p->next;
}
return 1;
}
//查3 按序号查找,返回指针
LNode* GetElem(LinkList L, int j) {
if (j == 0)
return L;
LNode* p = L->next;
int i = 1;
while (p && (i < j)) {
p = p->next;
i++;
}
return p;
}
//查4 按值查找,返回指针
LNode* LocateElem(LinkList L, ElemType e) {
LNode* p = L->next;
while (p && (p->data != e))
p = p->next;
return p;
}
// 删1 删表
bool DestroyList(LinkList& L) {
LNode* p;
while (L->next)
{
p = L;
L = L->next;
free(p);
}
return 1;
}
// 删2 删第i个元素
bool DelElem(LinkList& L, int i, ElemType &c)
{
LNode* p = GetElem(L, i - 1); //指针p指向第i-1个元素
LNode* q = p->next; //指针q指向第i个元素 ,这指针不能少
if (p) {
c = p->next->data;
p->next = p->next->next;
free(q);
return 1;
}
else return 0;
}
//改1 位置i前插元素
bool FInsElem(LinkList& L, int i, ElemType& c) {
LNode* s = new LNode;
LNode* p = GetElem(L, i-1);
s->data = c;
s->next = p->next;
p->next = s;
return 1;
}
//改2 位置i后插元素
bool BInsElem(LinkList& L, int i, ElemType& c) {
LNode* s = new LNode;
LNode* p = GetElem(L, i - 1);
s->data = c;
s->next = p->next;
p->next = s;
// cout << s->data << s->next->data;
ElemType temp;
temp = s->data;
s->data = s->next->data;
s->next->data = temp;
//cout << s->data << s->next->data;
return 1;
}
int main()
{
cout << endl << "输入元素(以z结尾): " << endl;
//定义
LinkList L;
InitList(L);
//头插法
TailInsert(L);
////按序号查找
//int no;
//cout << endl << "输入要查找的元素的序号: " << endl;
//cin >> no;
//
//LNode* find = GetElem(L, no);
//cout << endl;
//cout << "第" << no << " 个元素是" << find->data << endl;
////查值查找
//char e;
//cout << endl << "输入要查找的元素: " << endl;
//cin >> e;
//LNode* find2 = LocateElem(L, e);
//cout << "要查找的元素是 " << find2->data;
//////删除元素
//int d2;
//ElemType c;
//cout << endl << "输入要删除的元素序号:" << endl ;
//cin >> d2;
//DelElem(L, d2, c);
//cout << endl << "删除的元素是:" << c << endl;
//// i 位置插入元素 ,i位置后移
//int in1;
//ElemType el1;
//cout << endl << "输入要插入位置和元素" << endl;
//cin >> in1 >> el1;
//FInsElem(L, in1,el1);
// i 位置前插入元素 ,i位置不变
int in2;
ElemType el2;
cout << endl << "输入要插入位置和元素" << endl;
cin >> in2 >> el2;
BInsElem(L, in2, el2);
//求长度
int l = Length(L);
cout << endl << "共" << l << "个元素" << endl;
//输出
cout << "---------------遍历如下--------------- " << endl;
TraveList(L);
////按值查找
////销毁
int d1 = DestroyList(L);
if (d1)
cout << endl << endl << "SqList has been Destroyed! " << endl;
//输出
cout << endl << "---------------遍历如下---------------" << endl;
TraveList(L);
}