线性表单链表算法分析(C语言)

#include "pch.h"
#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2

typedef int ElemType;
typedef int Status;

/*存储结构*/
typedef struct LNode 
{
	ElemType data;
	struct LNode *next;
}LNode,*LinkList;

/*头插法建表*/
void CreateListF(LinkList *L,ElemType a[],int n) 
{
	LinkList s;
	int i;
	*L = (LinkList)malloc(sizeof(LNode));
	(*L)->next = NULL;
	for (int i = 0; i < n;i++) {
		s = (LinkList)malloc(sizeof(LNode));
		s->data = a[i];
		s->next = (*L)->next;         //将s插入开始节点之前,头结点之后
		(*L)->next = s;
	}
}

/*尾插法建表*/
void CreateListR(LinkList *L,ElemType a[],int n) 
{
	LinkList s, r;
	int i;
	(*L) = (LinkList)malloc(sizeof(LNode));//创建头结点
	r = (*L);                             //r开始时指向头节点
	for (i = 0; i < n;i++) {             //循环建立数据节点
		s = (LinkList)malloc(sizeof(LNode));  //创建数据节点s
		s->data = a[i];                   //将s插入r之后
		r->next = s;
		r = s;
	}
	r->next = NULL;                      //为节点next域置为NULL
}

/*删除单链表元素最大的节点,假设节点唯一*/
void delmaxnode(LinkList *L) 
{
	LinkList p = (*L)->next, pre = (*L), maxp = p, maxpre = pre;
	while (p) {
		if (maxp->data<p->data) {       //若找到一个更大的节点
			maxp = p;
			maxpre = pre;
		}
		pre = p;                        //p,pre同步后移一个节点
		p = p->next;
	}
	maxpre->next = maxp->next;
	free(maxp);
}

/*使元素递增有序排列*/
void sort(LinkList *L) 
{
	LinkList p, pre, q;
	p = (*L)->next->next;//p指向第二个节点
	(*L)->next->next = NULL;//构造只含有一个节点的链表(一个节点是有序的)
	while (p) {
		q = p->next;//q指向p的后继节点
		pre = *L;
		while (pre->next&&pre->next->data<p->data) {
			pre = pre->next;
		}
		p->next = pre->next;
		pre->next = p;
		p = q;
	}
}

/*所有节点逆置*/
void Rerverse(LinkList *L) 
{
	LinkList p = (*L)->next, q;
	(*L)->next = NULL;
	while (p) {
		q = p->next;
		p->next = (*L)->next;
		(*L)->next = p;
		p = q;
	}
}

/*分解split,L1尾插法,L2头插法*/
void split(LinkList *L,LinkList *L1,LinkList *L2) 
{
	LinkList p = (*L)->next, q, r1;
	*L1 = *L;
	r1 = *L1;
	*L2 = (LinkList)malloc(sizeof(LNode));
	(*L2)->next = NULL;
	while (p) {
		r1->next = p;
		r1 = p;
		p = p->next;
		q = p->next;;
		p->next = (*L2)->next;
		(*L2)->next = p;
		p = q;
	}

}

void visit(ElemType e) 
{
	printf("%d",e);
}

void TraverseList(LinkList L,void (*visit)(ElemType)) 
{
	LinkList p = L->next;
	while (p) {
		visit(p->data);
		p = p->next;
	}
}

int main() 
{
	LinkList L,R;
	ElemType a[] = {1,2,3,4,5};
	CreateListF(&L,a,5);
	CreateListR(&R,a,5);
	TraverseList(L, visit);
	printf("\n");
	delmaxnode(&L);
	TraverseList(L, visit);
	printf("\n");
	TraverseList(R,visit);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值