指针实现链表的基本函数

#include 
using namespace std;
typedef struct LNode
{
	int data;
	struct LNode *next;
}LNode, *LinkList;
void Init(LinkList &L) // 初始化 
{
	L = new LNode;
	L->next = NULL;
}
void CreateFront(LinkList &L, int n) // 头插 
{
	while(n--)
	{
		LNode *p = new LNode;
		cin >> p->data;
		p->next = L->next;
		L->next = p;
	}
}
void Show(LinkList L) // 输出 
{
	LNode *p = L->next;
	while(p)
	{
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;
}
void CreateBack(LinkList &L, int n) // 尾插 
{
	LNode *T = L;
	while(n--)
	{
		LNode *p = new LNode;
		cin >> p->data;
		p->next = T->next;
		T->next = p;
		T = p;
	}
}
void Get(LinkList L, int w, int &e) // 获取第w个元素,默认第一个元素下标为0 
{
	LNode *p = L->next;
	int j = 1;
	while(p && j < w) 
	{
		p = p->next;
		j++; 
	}
	e = p->data;
} 
LNode *Locate(LinkList L, int e) // 查找元素e的位置 
{
	LNode *p = L->next;
	while(p && p->data != e)
	{
		p = p->next;	
	} 
	return p;
}
void Insert(LinkList &L, int w, int e) // 在第w个位置插入元素e 
{
	LNode *p = L;
	int j = 0;
	while(j < w - 1 && p)
	{
		p = p->next;
		j++;
	}
	LNode *q = new LNode;
	q->data = e;
	q->next = p->next;
	p->next = q;
}
void Delete(LinkList &L, int w) // 删除第w个位置上的元素 
{
	LNode *p = L;
	int j = 0;
	while(j < w - 1 && p->next)
	{
		p = p->next;
		j++;	
	}
	LNode *q = p->next;
	p->next = q->next;
	delete q;
}
void Inverse(LinkList &L) // 翻转链表
{
	LNode *p = L->next;
	L->next = NULL;
	while(p)
	{
		LNode *q = p;
		p = p->next;
		q->next = L->next;
		L->next = q;	
	}	
} 
LinkList Merge(LinkList &L1, LinkList &L2, LinkList &L3) // 借第三个链表合并两个有序链表,使用尾插 
{
		LNode *p1 = L1->next;
		LNode *p2 = L2->next;
		LNode *T = L3;
		while(p1 && p2)
		{
			if(p1->data < p2->data)
			{
				LNode *q = p1;
				p1 = p1->next;
				q->next = nullptr;
				T->next = q;
				T = q;
			}
			else
			{
				LNode *q = p2;
				p2 = p2->next;
				q->next = nullptr;
				T->next = q;
				T = q;
			}
		}
		T->next = p1 ? p1 : p2;
		return L3;
} 
void MergePlus(LinkList &L1, LinkList &L2) // 原地实现两个有序链表的合并 
{
	if(!L1 || !L2) return;
	LNode *p1 = L1->next, *p2 = L2->next;
	LNode *T = L1;
	L1->next = nullptr;
	
	while(p1 && p2)
	{
		if(p1->data < p2->data)
		{
			T->next = p1;
			T= p1;
			p1 = p1->next;
		}
		else
		{
			T->next = p2;
			T = p2;
			p2 = p2->next;
		}
	} 
	T->next = p1 ? p1 : p2;
	delete L2;
	L2 = nullptr; // 避免野指针 
}


int main()
{
	LinkList L1, L2, L3;
	Init(L1); Init(L2); Init(L3);
	int m; cin >> m;
	int n; cin >> n;
	CreateBack(L1, m);
	CreateBack(L2, n);
	// L3 = Merge(L1, L2, L3);
	// int w; cin >> w;
	// int e; cin >> e;
	// Get 函数的参数e是引用(int &e),所以调用时直接传递 e,不需要加 &
	// 加 & 的情况是在 C 语言中传递指针时使用,或者在 C++ 中取变量地址时使用(但这里不需要)
	//Get(L, w, e); 
	
	MergePlus(L1, L2);
	Show(L1);
	return 0;	
} 

你可能感兴趣的:(C++,数据结构,链表,数据结构,算法,c++)