/*
线性表是有相同数据类型的n个数据元素的优先序列,
三个特征:(1)所有的数据的类型相同
(2)由有限个数据元素构成
(3)数据元素与位置相关
*/
//静态分配
#include<iostream>
using namespace std;
#define MaxSize 50
typedef int ElemType;
typedef struct{
ElemType data[MaxSize];
int length;
}SqList;
//动态分配
//#define InitSize 100
//typedef int ElemType;
//typedef struct{
// ElemType *data;
// int MaxSize, length;
//}seqList;
//seqList L;
//
//int main(){
//
// L.data = new ElemType[InitSize];
//
//}
///////////////////////////////////////////////////////////////////////////////顺序表的一些操作
//插入元素
bool ListInsert(SqList &L, int i, ElemType e){
if (i<0 || i>L.length + 1)
return false;
if (L.length > MaxSize)
return false;
for (int j = L.length; j >= i; j--){
L.data[j] = L.data[j - 1];
}
L.data[i - 1] = e;
L.length++;
}
//删除元素
bool ListDelete(SqList &L, int i, ElemType e){
if (i<0 || i>L.length)
return false;
e = L.data[i-1];
for (int j = i; j <= L.length; j++){
L.data[j - 1] = L.data[j];
}
L.length--;
return true;
}
//顺序查找元素
int LocateElem(SqList &L,ElemType e){
for (int j = 0; j < L.length; j++){
if (L.data[j] == e)
{
return j+1;
}
return false;
}
}
////////////////////////////////////////////////////////单链表的一些操作
//单链表的节点的描述
typedef struct LNode{//定义单链表节点类型
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//实现头插法建立单链表
LinkList CreatList1(LinkList &L){
LNode *s;
int x;
L = new LNode; //linkList 和 LNode 什么关系…………………………
L->next = NULL;
cin >> x;
while (x != 9999){
s = new LNode;
s->data = x;
s->next = L->next;
L->next = s;
cin >> x;
}
return L;
}
//得到序号为i的元素
LNode *GetElem(LinkList L,int i){
int j = 1;
LNode *p = L->next;//////////////////////linkList和LNode的关系 头结点之间赋给p
if (i == 0)
return false;
if (i < 1)
return false;
while (p&&j < i){
p = p->next;
j++;
}
return p;
}
////////////////////////////////////按值查找
LNode *LocateElem(LinkList L,ElemType e){
LNode *p = L->next;
while (p != NULL&&p->data != e)
p = p->next;
return p;
}
//插入节点操作,把s查到p后面,后插值
LNode p;
p = GetElem(L,i-1);
s->next = p->next;
p->next = s;
////////////////////////////////////////////////插入节点操作,这次是前插,前插值,方法:先实现后插然后,将data进行交换
LNode p;
p2 = GetElem(L,i-1);
s2->next = p2->next;
p2->next = s2;
ElemType tmp = p2->data;
p2->data = s2->data;
s2->data = tmp;
//////////////删除*p节点
p = GetElem(L,i-1);
q = p->next;
q = GetElem(L,i);
p->next = q->next;
free(q);
//双链表
/////////////////////////////////////////////////////节点类型的描述
typedef struct DNode{ //定义双链表节点类型
ElemType data; //数据域
struct DNode *prior, *next; //前驱和后继指针
}DNode,*DLinklist;
/////////////////////////////////双链表的插入操作,注意先从s->next开始!!!!!!!!!!!!!!!!!!!!!1
s->next = p->next;
p->next->prior = s;
s->prior = p;
p->next = s;
//双链表的删除操作
p->next = q->next;
q->next->prior = p;
free(q);
线性表是有相同数据类型的n个数据元素的优先序列,
三个特征:(1)所有的数据的类型相同
(2)由有限个数据元素构成
(3)数据元素与位置相关
*/
//静态分配
#include<iostream>
using namespace std;
#define MaxSize 50
typedef int ElemType;
typedef struct{
ElemType data[MaxSize];
int length;
}SqList;
//动态分配
//#define InitSize 100
//typedef int ElemType;
//typedef struct{
// ElemType *data;
// int MaxSize, length;
//}seqList;
//seqList L;
//
//int main(){
//
// L.data = new ElemType[InitSize];
//
//}
///////////////////////////////////////////////////////////////////////////////顺序表的一些操作
//插入元素
bool ListInsert(SqList &L, int i, ElemType e){
if (i<0 || i>L.length + 1)
return false;
if (L.length > MaxSize)
return false;
for (int j = L.length; j >= i; j--){
L.data[j] = L.data[j - 1];
}
L.data[i - 1] = e;
L.length++;
}
//删除元素
bool ListDelete(SqList &L, int i, ElemType e){
if (i<0 || i>L.length)
return false;
e = L.data[i-1];
for (int j = i; j <= L.length; j++){
L.data[j - 1] = L.data[j];
}
L.length--;
return true;
}
//顺序查找元素
int LocateElem(SqList &L,ElemType e){
for (int j = 0; j < L.length; j++){
if (L.data[j] == e)
{
return j+1;
}
return false;
}
}
////////////////////////////////////////////////////////单链表的一些操作
//单链表的节点的描述
typedef struct LNode{//定义单链表节点类型
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//实现头插法建立单链表
LinkList CreatList1(LinkList &L){
LNode *s;
int x;
L = new LNode; //linkList 和 LNode 什么关系…………………………
L->next = NULL;
cin >> x;
while (x != 9999){
s = new LNode;
s->data = x;
s->next = L->next;
L->next = s;
cin >> x;
}
return L;
}
//得到序号为i的元素
LNode *GetElem(LinkList L,int i){
int j = 1;
LNode *p = L->next;//////////////////////linkList和LNode的关系 头结点之间赋给p
if (i == 0)
return false;
if (i < 1)
return false;
while (p&&j < i){
p = p->next;
j++;
}
return p;
}
////////////////////////////////////按值查找
LNode *LocateElem(LinkList L,ElemType e){
LNode *p = L->next;
while (p != NULL&&p->data != e)
p = p->next;
return p;
}
//插入节点操作,把s查到p后面,后插值
LNode p;
p = GetElem(L,i-1);
s->next = p->next;
p->next = s;
////////////////////////////////////////////////插入节点操作,这次是前插,前插值,方法:先实现后插然后,将data进行交换
LNode p;
p2 = GetElem(L,i-1);
s2->next = p2->next;
p2->next = s2;
ElemType tmp = p2->data;
p2->data = s2->data;
s2->data = tmp;
//////////////删除*p节点
p = GetElem(L,i-1);
q = p->next;
q = GetElem(L,i);
p->next = q->next;
free(q);
//双链表
/////////////////////////////////////////////////////节点类型的描述
typedef struct DNode{ //定义双链表节点类型
ElemType data; //数据域
struct DNode *prior, *next; //前驱和后继指针
}DNode,*DLinklist;
/////////////////////////////////双链表的插入操作,注意先从s->next开始!!!!!!!!!!!!!!!!!!!!!1
s->next = p->next;
p->next->prior = s;
s->prior = p;
p->next = s;
//双链表的删除操作
p->next = q->next;
q->next->prior = p;
free(q);