单向链表的基本操作

数据结构的基础知识之一:单向链表的基本操作。

我专门写了一个程序,其中包含尽可能多的链表操作。希望该程序能在工作中帮助到大家~同时也方便大家复习链表。

#include<iostream>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef int datatype;
typedef struct node{
	datatype data;
	struct node *next;
}linknode,*link;

/*Createlist*/
link CreateList(){
	int a;
	link H,p,r;
	H = (link)malloc(sizeof(linknode));//建立头节点
	r = H;
	cin>>a;
	while(a != -1){
		p = (link)malloc(sizeof(linknode));//申请新节点 
		p->data = a;
		r->next = p;
		r = p;//存入数据,将新节点链入表尾 
		cin>>a;
	}
	r->next = NULL;
	return H;
}

/*查找*/
link GetElem(link H,int i){
	int j = -1;
	link p = H;
	if(i<0) return NULL;
	while(p->next&&j<i){
		p = p->next;
		j++;
	}
	if(i==j) return p;
	else return NULL;//查找失败,即i>表长 
}

/*按值查找*/
link LocateElem(link H,datatype e){
	link p = H->next;
	while(p && p->data!=e){
		p = p->next;
	}
	return p;//若p->data==e则返回指针p;否则p必为空,返回NULL 
} 

/*将一定值e插在元素ai之前*/
int ListInsert(link H,int i,datatype e){
	link p,q;
	p = GetElem(H,i-1);
	if(p == NULL) return -1;
	q = (link) malloc(sizeof(linknode));
	q->data = e;
	q->next = p->next;/*插入新节点*/
	p->next = q;
	return 0;
}

/*删除*/
int ListDel(link H,int i){
	link p,q;
	if(i==0) p = H;
	else p = GetElem(H,i-1);
	if(p && p->next){
		q = p->next;
		p->next = q->next;
		free((char*)q);
		return 0;
	} 
	return -1;
} 

/*链表翻转*/
void L1nToLn1(link H){
	link p,q;
	p = H->next;
	H->next = NULL;
	while(p){
		q = p;
		p = p->next;
		q->next = H->next;
		H->next = q;
	}
} 

/*最大值返回前一个的指针*/
link Adjmax(link H){
	link p,p1,q;
	int m0,m1;
	p = H->next;
	p1 = p;
	if(p1 == NULL) return NULL;
	q = p->next;
	if(q == NULL) return NULL;/*表长为1*/
	m0 = p->data+q->data;
	while(q->next){
		p = q;
		q = q->next;
		m1 = p->data+q->data;
		if(m1>m0){
			p1 = p;
			m0 = m1;
		}
	} 
	return p1;
} 

/*链表合并并递增*/
void Merge(link A,link B){
	link r,p,q;
	p = A->next;
	q = B->next;
	free(B);
	r = A;
	while(p && q){
		if(p->data <= q->data){
			r->next = p;
			r = p;
			p = p->next;
		}
		else{
			r->next = q;
			r = q;
			q = q->next;
		}
	}
	if(p == NULL) p = q;
	r->next = p;
} 

void ListPrint(link H){
	link a,b;
	a = H->next;
	while(a != NULL){
		cout<<a->data<<"<";
		b = a;
		a = a->next;
		free(b);
	}
}

int main(){
	link H;
	H = CreateList();
	L1nToLn1(H);
	ListPrint(H);
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值