数据结构严蔚敏 线性表基本操作C语言实现(单链表)

【数据结构(严蔚敏)】 线性表基本操作C语言实现(单链表)

vs2017
算法2.8–算法2.11

#include
#include
#include
using namespace std;
#define TRUE	1
#define FALSE	0
#define	OK		1
#define ERROR	0
#define	INFEASLBLE	-1
typedef int Status;
typedef int ElemType;

typedef struct  LNode {
	ElemType  data;
	struct LNode	*next;
}LNode,*Linklist;

void Listshow(Linklist L) {
	Linklist p;
	p = L;
	cout << "显示表L:"<<endl;

	while (p->next) {
		p = p->next;
		cout << p->data<<" ";
	}
}

Status GetElem_L(Linklist L, int i, ElemType &e) {
	//算法2.8
	//L为带头节点的单链表头指正
	//当第i个元素存在时,其值赋给e,返回OK,否则返回ERROR
	Linklist p;
	p = L->next; 
	int j = 1;
	while (p&&j < i) {
		p = p->next;
		++j;
	}
	if (!p || j > i) { return ERROR; }
	e = p->data;
	return OK;
}

Status	ListInsert_L(Linklist &L, int i, ElemType e) {			
	//算法2.9
	//在带头节点在单链线性表L中第i个位置之前插入元素e
	Linklist p;
	p = L;
	int j = 0;
	while (p&&j<i-1)
	{
		p = p->next; ++j; //找到第i-1个节点
	}
	if (!p || j > i - 1) return ERROR;
	Linklist s;
	s = (Linklist) malloc(sizeof(LNode));	//生成新节点s
	s->data = e;
	s->next = p->next;
	p->next = s;
	return OK;
}
Status ListDelete_L(Linklist &L, int i, ElemType &e) {
	//算法2.10
	//删除第i个元素,返回其值    p->next = p->next->next 
	Linklist p;
	p = L; int j = 0;
	while (p->next && j < i - 1) {
		p = p->next; ++j;
	}
	if (!(p->next) || j > i - 1) return ERROR;
	Linklist q;
	q = p->next; p->next = q->next;
	e = q->data; free(q);
	return OK;
}


void CreateList_L(Linklist &L, int n) {
	//算法2.11 
	//逆序输入n个元素的值,建立带表头节点单链表L
	cout << "请逆序输入" << n << "个元素值:"<< endl;

	L = (Linklist)malloc(sizeof(LNode));
	L->next = NULL;
	
	for (int i = n; i > 0; --i) {
		Linklist p;
		p = (Linklist)malloc(sizeof(LNode));
		cin >> p->data;
		p->next = L->next; L->next = p;
	}
}

void MergeList_L(Linklist &La, Linklist &Lb, Linklist &Lc) {
	//算法2.12
	//La,Lb元素按值非递减排列,合并成Lc按非递减排列
	Linklist pa;
	Linklist pb;
	Linklist pc;
	pa = La->next;
	pb = Lb->next;
	Lc = pc = La; //用La头结点作为Lc头结点

	while (pa && pb)
	{
		if (pa->data <= pb->data) {
			pc->next = pa; pc = pa; pa = pa->next;
		}
		else {
			pc->next = pb; pc = pb; pb = pb->next;
		}
	}
	pc->next = pa ? pa : pb; //将剩余节点插入
	free(Lb);
	cout << endl<<"排序完成:" << endl;
	Listshow(Lc);
}

测试部分

int main(){

	Linklist L1;
	Linklist L2;
	Linklist L3;
	CreateList_L(L2, 5);
	CreateList_L(L1, 5);
	MergeList_L(L1, L2, L3);
	system("pause");
	return 0;

}

测试结果
数据结构严蔚敏 线性表基本操作C语言实现(单链表)_第1张图片

你可能感兴趣的:(数据结构严蔚敏)