单链表的一些操作

创建一个链表的节点函数

/*
 * 创建一个结点
 */
linklist list_create(){
	linklist H;
	H = (linklist)malloc(sizeof(listnode));
	H->data = 0;
	H->next = NULL;
	return H;
}

链表的尾部插入函数功能

/*
 * 尾部插入
 */

int list_tail_insert(linklist H, data_t value){
	if (H == NULL){
		printf("H is NULL\n");
		return -1;
	}

	//新建一个结点
	linklist p;
	linklist q;
	if ((p = (linklist)malloc(sizeof(listnode))) == NULL){
		printf("malloc is failed\n");
		return -1;
	}
	p->data = value;
	p->next = NULL;

	//找尾结点
	q = H;
	while(q->next != NULL){
		q = q->next;
	}

	//插入结点
	q->next = p;

	return 0;
}

遍历单链表的功能函数

/*
 * 遍历链表
 */
int list_show(linklist H){
	linklist p;
//判断链表是否为空
	if (H == NULL){
		printf("H is NULL\n");
		return -1;
	}

	p = H;
	while (p->next != NULL){
		printf("%d ", p->next->data);
		p = p->next;
	}

	puts("");

	return 0;
}

获取链表某个位置的节点

/*
 * 获取某个位置的结点
 */
linklist list_get(linklist H, int pos){
	linklist p;
	int i = 0;

	if (H == NULL || pos < -1)
		return NULL;
	if (pos == -1)
		return H;

	p = H;

	while(i <= pos){
		if (p->next == NULL){
			printf("pos_get is invalid\n");
			return NULL;
		}
		p = p->next;
		i++;
	}

	return p;
}

按位置插入节点

/*
 * 按位置插入结点
 */
int list_insert(linklist H, data_t value, int pos){
	if (H == NULL)
		return -1;

	linklist p, q;
	q = list_get(H, pos-1);

	p = (linklist)malloc(sizeof(listnode));
	p->data = value;
	p->next = NULL;

	p->next = q->next;
	q->next = p;

	return 0;
}

按位置删除节点

/*
 * 按位置删除结点
 */
int list_delete(linklist H, int pos){
	if (H == NULL)
		return -1;

	linklist p, q;

	p = list_get(H, pos-1);
	if (p == NULL || p->next == NULL){
		printf("pos_del is invalid\n");
		return -1;
	}
	q = p->next;
	p->next = q->next;

	free(q);
	q = NULL; //防止野指针

	return 0;

}

释放链表

//释放链表

linklist list_free(linklist H){
	if (H == NULL)
		return NULL;
	linklist p;
	p = H;

	printf("free:");
	while (H != NULL){
		p = H;
		H = H->next;
		printf("%d ", p->data);
		free(p);
	}
	puts("");

	return NULL;

}

链表的反转

//链表的反转

int list_reverse(linklist H){
	linklist p, q;

	if (H == NULL)
		return -1;
	if (H->next == NULL || H->next->next == NULL)
		return 0;

	p = H->next->next;
	H->next->next = NULL;
	while(p != NULL){

		q = p;
		p = p->next;

		q->next = H->next;
		H->next = q;
	}

	return 0;

}

求相邻两个节点和的最大值和前一个节点的指针地址

//求相邻两个结点和的最大值的前一个结点的指针

linklist list_adjmax(linklist H, data_t *value){

	linklist p, q, r;
	data_t sum;

	if (H == NULL)
		return NULL;
	if (H->next == NULL || H->next->next == NULL || H->next->next->next == NULL)
		return H;

	q = H->next;
	p = H->next->next;
	sum = q->data + p->data;
	r = q;

	while (p->next !=NULL) {
		p = p->next;
		q = q->next;
		if (sum < (q->data+p->data)) {
			sum = q->data+p->data;
			r = q;
		}
	}
	*value = sum;

	return r;
}

两个有序链表合并为一个有序链表

//两个有序链表合并为一个有序链表

int list_merge(linklist H1,linklist H2){
	linklist p, q, r;

	if (H1 == NULL || H2 == NULL)
		return -1;

	p = H1->next;
	q = H2->next;
	r = H1;
	H1->next = NULL;
	H2->next = NULL;

	while (p && q) {
		if (p->data < q->data){
			r->next = p;
			p = p->next;
			r = r->next;
			r->next = NULL;
		} else {
			r->next = q;
			q = q->next;
			r = r->next;
			r->next = NULL;
		}
	}

	if (p == NULL) {
		r->next = q;
	} else {
		r->next = p;
	}

	return 0;
}

将一个无序链表变为有序递增的

//将一个无序链表变为递增

int list_order(linklist H){
	linklist p, q, r;
	data_t t;

	if (H == NULL)
		return -1;

	p = H->next;

	while (p){
		q = p->next;
		while (q){
			if (p->data > q->data){
				t = p->data;
				p->data = q->data;
				q->data = t;
			}
			q = q->next;

		}
		p = p->next;
	}
	return 0;

}

  • 15
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值