单链表的基本操作和例题

单链表的基本操作和例题(C/C++)

基础操作


/*数据结构定义*/
typedef int ElemType;
typedef struct node {
	ElemType data;
	struct node* next;
}Node, LinkList;

/*单链表的创建*/
void CreateLinkList(LinkList*& L) {
	L = (LinkList*)malloc(sizeof(LinkList));
	L->next = NULL;
}
/*头插法*/
void HeadInsert(LinkList* L, ElemType e) {
	Node* n = (Node*)malloc(sizeof(Node));
	Node* p;
	n->data = e;
	if (L->next == NULL) {
		n->next = L->next;
		L->next = n;
	}
	else {
		p = L->next;
		L->next = n;
		n->next = p;
	}
}
/*尾插法*/
void RearInsert(LinkList* L, ElemType e) {
	Node* n = (Node*)malloc(sizeof(Node)), *p;
	n->data = e;
	if (L->next == NULL) {
		n->next = L->next;
		L->next = n;
	}
	else {
		p = L->next;
		while (p->next != NULL) {
			p = p->next;
		}
		/*循环之后p是最后一个节点*/
		n->next = p->next;
		p->next = n;
	}
}
/*初始化链表并且使用头插法赋值*/
void CreateListHead(LinkList *&L, ElemType elements[], int size) {
	int i = 0;
	L = (LinkList*)malloc(sizeof(LinkList));
	L->next = NULL;
	Node* p = NULL;/*新结点*/
	for (; i < size; i++) {
		p = (LinkList*)malloc(sizeof(LinkList));
		p->data = elements[i];
		p->next = L->next;
		L->next = p;
	}
}
/*初始化链表并且使用尾插法赋值*/
void CreateListRear(LinkList*& L, ElemType elements[], int size) {
	L = (LinkList*)malloc(sizeof(LinkList));
	L->next = NULL;
	Node* p, *s;
	s = L;
	int i = 0;
	for (; i < size; i++) {
		p = (LinkList*)malloc(sizeof(LinkList));
		p->next = s->next;
		p->data = elements[i];
		s->next = p;
		s = s->next;
	}
}

/*遍历打印链表*/
void TraversalList(LinkList* L) {
	LinkList* p = L->next;
	while (p != NULL) {
		printf("%d", p->data);
		p = p->next;
	}
}
/*例题1:设计一个算法,删除一个单链表L中元素值最大的节点(假设最大值节点是唯一的*/
void DeleteMaxNode(LinkList* L) {
	Node* pre = L, * p = L->next, * maxPre = pre, * maxP = p;
	while (p != NULL) {
		if (maxP->data < p->data) {
			maxP = p;
			maxPre = pre;
		}
		pre = p; /*p,pre同步后移*/
		p = p->next;
	}
	maxPre->next = maxP->next;
	free(maxP);
}

/*例题2:有一个带头节点的单链表L(至少有一个数据节点),设计一个算法使其元素递增有序排列*/
void Sort(LinkList* L) {
	LinkList* pre, * p, * q;
	p = L->next->next;/*p指向L的第二个数据节点*/
	L->next->next = NULL;/*构造只含有一个数据节点的有序表*/
	while (p != NULL) {
		q = p->next;
		pre = L;/*pre指向插入p的前趋节点*/
		while (pre->next != NULL && pre->next->data < p->data) {
			pre = pre->next;
		}
		p->next = pre->next;
		pre->next = p;
		p = q;
	}
}

/*例题3:假设有一个带头节点的单链表L={a1,a2,...,an}。设计一个算法将所有节点逆置*/
void Reverse(LinkList *L) {
	LinkList* p = L->next;
	L->next = NULL;
	/*头插法插入截出来的链表*/
	while (p != NULL) {
		HeadInsert(L, p->data);
		p = p->next;
	}
}

/*-例题4:假设有一个带头节点的单链表L={a1,b1,a2,b2,...,an,bn}设计一个算法拆分成两个L1,L2 
L1 = {a1,a2,a3..} L2={bn, bn-1, bn-2..}

*/
void SplitList(LinkList* &L, LinkList*& L1, LinkList*& L2) {
	/*L1尾插法 L2头插法*/
	LinkList* p = L->next, * q, * r1; /*p指向第一个数据节点*/
	L1 = L;/*L1利用原来的L节点*/
	r1 = L1;/*r1始终指向L1的尾巴节点*/
	/*创建L2的头节点*/
	L2 = (LinkList*)malloc(sizeof(LinkList));
	L2->next = NULL;
	while (p != NULL) {
		/*尾插法*/
		r1->next = p;
		r1 = p;
		p = p->next;
		/*头插法将*p插入L2*/
		q = p->next;
		p->next = L2->next;
		L2->next = p;
		p = q; /*p重新指向ai节点*/
	}
	r1->next = NULL;/*尾节点置空*/
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值