*/------驱动程序------/*
void Input(list& a, int n) //输入
{
elemtype x;
while (n)
{
cin >> x;
Append(a, x);
n--;
}
}
void Prt(list a) //打印
{
elemtype x;
for (int i = 1; i <= Length(a); i++)
{
Get(a, i, x);
cout << x << ' ';
}
cout << endl;
}
void Intersection(list A, list B, list& C) //交集运算
{
int i;
elemtype x;
for (i = 1; i <= Length(A); i++)
{
Get(A, i, x);
if (Locate(B, x))
Append(C, x);
}
}
void Union(list A, list B, list& C) //并集运算
{
int i;
elemtype x;
for (i = 1; i <= Length(A); i++)
{
Get(A, i, x);
Append(C, x);
}
for (i = 1; i <= Length(B); i++)
{
Get(B, i, x);
if (!Locate(A, x))
Append(C, x);
}
}
void Reverse(list A, list& B) //倒置运算
{
int i;
elemtype x;
for (i = Length(A); i > 0; i--)
{
Get(A, i, x);
Append(B, x);
}
}
void del(list& A) //删除线性表中重复元素
{
int i = 1, j;
elemtype x, y;
while (i < Length(A))
{
Get(A, i, x);
j = i + 1;
while (j <= Length(A))
{
Get(A, j, y);
if (x == y)
Delete(A, j, y);
else
j++;
}
i++;
}
}
void merge(list A, list B, list& C) //将两个线性表按从小到大的顺序结合
{
int i = 1, j = 1;
elemtype x, y;
Get(A, i, x);
Get(B, j, y);
while (i <= Length(A) && j <= Length(B))
{
if (x < y)
{
Append(C, x);
i++;
Get(A, i, x);
}
else
{
Append(C, y);
j++;
Get(B, j, y);
}
}
for (; i <= Length(A); i++)
{
Get(A, i, x);
Append(C, x);
}
for (; j <= Length(B); j++)
{
Get(B, j, y);
Append(C, y);
}
}
int main() //No.1版本
{
list A;
int n, sel;
elemtype x;
Initiate(A);
cout << "请输入线性表的元素个数:";
cin >> n;
Input(A, n);
do
{
Prt(A);
cout << endl;
cout << "0.Quit" << endl;
cout << "1.Length" << endl;
cout << "2.Locate" << endl;
cout << "3.Get" << endl;
cout << "4.Prior" << endl;
cout << "5.Next" << endl;
cout << "6.Insert" << endl;
cout << "7.Delete" << endl;
cout << "8.Append" << endl << endl;
cout << "请选择:";
cin >> sel;
switch (sel)
{
case 1: cout << "长度为" << Length(A) << "。" << endl; continue;
case 2: cout << "元素为:"; cin >> x; cout << "序号为" << Locate(A, x) << "。" << endl; continue;
case 3: cout << "序号为: "; cin >> n; if (Get(A, n, x)) cout << "元素为" << x << "。" << endl; continue;
case 4: cout << "元素为:"; cin >> x; if (Prior(A, x, x)) cout << "元素为" << x << "。" << endl; continue;
case 5: cout << "元素为:"; cin >> x; if (Next(A, x, x)) cout << "元素为" << x << "。" << endl; continue;
case 6: cout << "元素为:"; cin >> x; cout << "序号为:"; cin >> n; Insert(A, x, n); continue;
case 7: cout << "序号为:"; cin >> n; if (Delete(A, n, x)) cout << "元素为" << x << "。" << endl; continue;
case 8: cout << "元素为:"; cin >> x; Append(A, x); continue;
default: sel = 0;
}
} while (sel != 0);
system("pause");
return 1;
}
int main() //No.2版本
{
list A, B, C, D;
int n, sel;
elemtype x;
Initiate( A );
Initiate( B );
Initiate( C );
Initiate( D );
cout << "请输入集合 A 的元素个数:";
cin >> n;
Input( A, n );
cout << "请输入集合 B 的元素个数:";
cin >> n;
Input( B, n );
Intersection( A, B, C );
cout << "集合 A 与 B 的交集是:" << endl;
Prt( C );
Union( A, B, D );
cout << "集合 A 与 B 的并集是:" << endl;
Prt( D );
Clear( C );
Reverse( D, C );
cout << "上面数组的倒置为:" << endl;
Prt( C );
Clear( A );
cout << "请输入数组的元素个数:";
cin >> n;
Input( A, n );
del( A );
Prt( A );
Clear( A );
Clear( B );
Clear( C );
cout << "请输入数组 A 的元素个数:";
cin >> n;
Input( A, n );
cout << "请输入数组 B 的元素个数:";
cin >> n;
Input( B, n );
merge( A, B, C );
cout << "数组 A 与 B 合并后是:" << endl;
Prt( C );
system("pause");
return 1;
}
一、线性表的顺序存储结构
#include<iostream>
using namespace std;
#define MAXLEN 100
#define elemtype int
#define tysqlist 1 //顺序表
#define list sqlist
typedef struct
{
elemtype elem[MAXLEN];
int length; //顺序表长度
}sqlist;
void Initiate(sqlist& a) //用&符号,旨在对顺序表进行更改(初始化)
{
a.length = 0;
}
int Length(sqlist a)
{
return a.length;
}
void Clear(sqlist& a)
{
a.length = 0;
}
int Locate(sqlist a, elemtype e)
{
for (int i = 0; i < a.length; i++)
if (a.elem[i] == e)
return i + 1;
return 0;
}
int Get(sqlist a, int i, elemtype &x)
{
if (i<1 || i>a.length)
return 0;
x = a.elem[i - 1];
return 1;
}
int Prior(sqlist a, elemtype e, elemtype &x) //找到当前元素的前一元素
{
int i = Locate(a, e);
if (i < 2)
return 0;
x = a.elem[i - 2];
return 1;
}
int Next(sqlist a, elemtype e, elemtype &x) //找到当前元素的下一元素
{
int i = Locate(a, e);
if (i < 1 || i == a.length)
return 0;
x = a.elem[i];
return 1;
}
int Insert(sqlist& a, elemtype e, int i)
{
if (i<1 || i>a.length + 1 || a.length == MAXLEN)
return 0;
for (int j = a.length; j >= i; j--)
a.elem[j] = a.elem[j - 1];
a.elem[i - 1] = e;
a.length++;
return 1;
}
int Delete(sqlist& a, int i, elemtype& x)
{
if (i<1 || i>a.length)
return 0;
x = a.elem[i - 1];
for (int j = i - 1; j < a.length; j++)
a.elem[j] = a.elem[j + 1];
a.length--;
return 1;
}
int Empty(sqlist a) //判断顺序表是否为空
{
return a.length == 0;
}
int Append(sqlist& a, elemtype e) //在顺序表最后添加元素
{
if (a.length == MAXLEN)
return 0;
a.elem[a.length++] = e;
return 1;
}
二、线性表的链式存储结构
1.单链表
#include<iostream>
using namespace std;
#define MAXLEN 100
#define elemtype int
#define list linkedlist//不带头结点的单链表
typedef struct lnode
{
elemtype data;
lnode* next;
}lnode,*linkedlist;
void Initiate(linkedlist& a)
{
a = NULL;
}
int Length(linkedlist a)
{
int len = 0;
for (; a; a = a->next)
len++;
return len;
}
void Clear(linkedlist& a)
{
linkedlist p;
while (a)
{
p = a;
a = a->next;
delete p;
}
}
int Locate(linkedlist a, elemtype e)
{
int i = 1;
for (; a; a = a->next, i++)
if (a->data == e)
return i;
return 0;
}
int Get(linkedlist a, int i, elemtype& x)
{
if (i < 1)
return 0;
while (i > 1 && a)
{
a = a->next;
i--;
}
if (!a)
return 0;
x = a->data;
return 1;
}
int Prior(linkedlist a, elemtype e, elemtype& x)
{
if (a->data == e)
return 0;
for(;a->next;a=a->next)
if (a->next->data == e)
{
x = a->data;
return 1;
}
return 0;
}
int Next(linkedlist a, elemtype e, elemtype& x)
{
for (; a && a->data != e; a = a->next);
if (!a || !a->next)
return 0;
x = a->next->data;
return 1;
}
int Insert(linkedlist& a, elemtype e, int i)
{
linkedlist p, q;
if(i<1 || i>Length(a) + 1)
return 0;
p = new lnode;
if (!p)
return 0;
p->data = e;
if (i == 1)
{
p->next = a;
a = p;
return 1;
}
for (q = a; i > 2; i--)
q = q->next;
p->next = q->next;
q->next = p;
return 1;
}
int Delete(linkedlist& a, int i, elemtype& x)
{
linkedlist p, q;
if (i<1 || i>Length(a))
return 0;
if (i == 1)
{
q = a;
a = a->next;
x = q->data;
delete q;
return 1;
}
for (p = a; i > 2; i--)
p = p->next;
q = p->next;
p->next = q->next;
x = q->data;
delete q;
return 1;
}
int Empty(linkedlist a)
{
return a == NULL;
}
int Append(linkedlist& a, elemtype e)
{
linkedlist p, q;
q = new lnode;
if (!q)
return 0;
q->data = e;
q->next = NULL;
if (!a)
a = q;
else
{
for (p = a; p->next; p = p->next);
p->next = q;
}
return 1;
}
2.静态链表
#include<iostream>
using namespace std;
#define MAXLEN 100
#define elemtype int
#define list sllist //静态链表
typedef struct
{
elemtype data;
int next;
}node;
typedef struct
{
node elem[MAXLEN + 1];
int firstelem; //将elem[0]作为头结点
}sllist;
int New(sllist a)
{
for (int i = 1; i <= MAXLEN; i++)
if (a.elem[i].next == -1)
return i;
return 0; //溢出
}
void Del(sllist& a, int i)
{
a.elem[i].next = -1;
}
void Initiate(sllist& a)
{
a.firstelem = 0;
a.elem[0].next = 0;
for (int i = 1; i <= MAXLEN; i++)
a.elem[i].next = -1;
}
int Length(sllist a)
{
int len = 0, i = a.elem[0].next;
for (; i; i = a.elem[i].next)
len++;
return len;
}
void Clear(sllist& a)
{
int i;
a.firstelem = 0;
a.elem[0].next = 0;
for (i = 1; i <= MAXLEN; i++)
a.elem[i].next = -1;
}
int Locate(sllist a, elemtype e)
{
int i, j = 1;
for (i = a.elem[0].next; i; i = a.elem[i].next, j++)
if (a.elem[i].data == e)
return j;
return 0;
}
int Get(sllist a, int i, elemtype& x)
{
int j;
if (i < 1)
return 0;
j = a.elem[0].next;
while (i > 1 && j)
{
j = a.elem[i].next;
i--;
}
if (!j)
return 0;
x = a.elem[j].data;
return 1;
}
int Prior(sllist a, elemtype e, elemtype& x)
{
int i;
if (a.elem[a.elem[0].next].data == e)
return 0;
for(i=a.firstelem;a.elem[i].next;i=a.elem[i].next)
if (a.elem[a.elem[i].next].data == e)
{
x = a.elem[i].data;
return 1;
}
return 0;
}
int Next(sllist a, elemtype e, elemtype& x)
{
int i;
for (i = a.elem[0].next; i && a.elem[i].data != e; i = a.elem[i].next)
if (!i || !a.elem[i].next)
return 0;
x = a.elem[i].data; //mistake???
return 1;
}
int Insert(sllist& a, elemtype e, int i)
{
int j, k = Length(a);
if (i<1 || i>k + 1 || k == MAXLEN)
return 0;
j = New(a);
if (!j)
return 0;
a.elem[j].data = e;
for (k = a.firstelem; i > 1; i--)
k = a.elem[k].next;
a.elem[j].next = a.elem[k].next;
a.elem[k].next = j;
return 1;
}
int Delete(sllist& a, int i, elemtype& x)
{
int j, k;
if (i<1 || i>Length(a))
return 0;
for (k = a.firstelem; i > 1; i--)
k = a.elem[k].next;
j = a.elem[k].next;
a.elem[k].next = a.elem[j].next;
x = a.elem[j].data;
Del(a, j);
return 1;
}
int Empty(sllist a)
{
return a.elem[0].next == 0;
}
int Append(sllist& a, elemtype e)
{
int i, j;
j = New(a);
if (!j)
return 0;
a.elem[j].data = e;
a.elem[j].next = 0;
for (i = a.firstelem; a.elem[i].next; i = a.elem[i].next);
a.elem[i].next = j;
return 1;
}
3.带头结点的单循环链表
#include<iostream>
using namespace std;
#define MAXLEN 100
#define elemtype int
#define list linkedlist //带头结点的单循环链表
typedef struct lnode
{
elemtype data;
lnode* next;
}lnode,*linkedlist;
void Initiate(linkedlist& a)
{
a = new lnode;
a->next = a;
}
int Length(linkedlist a)
{
int len = 0;
linkedlist p = a->next;
for (; p != a; p = p->next)
len++;
return len;
}
void Clear(linkedlist& a) //清空线性表,只剩下头结点
{
linkedlist p = a->next, q;
while (p->next != p)
{
q = p->next;
p->next = q->next;
delete q;
}
a = p;
}
int Locate(linkedlist a, elemtype e)
{
int i = 1;
linkedlist p = a->next->next;
a = a->next;
for (; p != a; p = p->next, i++)
{
if (p->data == e)
return i;
}
return 0;
}
int Get(linkedlist a, int i, elemtype& x)
{
linkedlist p = a->next;
a = p->next;
if (i < 1)
return 0;
while (i > 1 && a != p)
{
a = a->next;
i--;
}
if (a == p)
return 0;
x = a->data;
return 1;
}
int Prior(linkedlist a, elemtype e, elemtype& x)
{
linkedlist p = a->next;
a = p->next;
if (a->data == e)
return 0;
for(;a->next!=p;a=a->next)
if (a -> next -> data == e)
{
x = a->data;
return 1;
}
return 0;
}
int Next(linkedlist a, elemtype e, elemtype& x)
{
linkedlist p = a->next;
a = p->next;
for (; a != p && a->data != e; a = a->next);
if (a == p || a->next == p)
return 0;
x = a->next->data;
return 1;
}
int Insert(linkedlist& a, elemtype e, int i)
{
linkedlist p, h = a->next;
if (i < 1 || i > Length(a) + 1)
return 0;
p = new lnode;
if (!p)
return 0;
p->data = e;
for (; i > 1; i--)
h = h->next;
p->next = h->next;
h->next = p;
if (a == h)
a = p;
return 1;
}
int Delete(linkedlist& a, int i, elemtype& x)
{
linkedlist p, h = a->next;
if (i < 1 || i > Length(a))
return 0;
for (; i > 1; i--)
h = h->next;
p = h->next;
h->next = p->next;
x = p->data;
if (p == a)
a = h;
delete p;
return 1;
}
int Empty(linkedlist a)
{
return a->next == a;
}
int Append(linkedlist& a, elemtype e)
{
linkedlist q;
q = new lnode;
if (!q)
return 0;
q->data = e;
q->next = a->next;
a->next = q;
a = q;
return 1;
}