线性表的操作(课堂笔记)

*/------驱动程序------/*

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;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值