(二) 单向链表

1.通常把线性表的链式存储结构体简称链表

2.链表的结构

3.初始化

4.插入

5.删除

6.实现单项链表的数据逆转为实例

// linklist.h
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef int datatype;
typedef struct linklistnode {
	datatype data;
	struct linklistnode *next;
} linklist_node, *linklist_pnode;

extern void init_linklist(linklist_pnode *H);

extern int length_linklist(linklist_pnode l);

extern bool insert_linklist(linklist_pnode l, int i, datatype data);

extern bool del_linklist(linklist_pnode l, int i);

extern bool isempty_linklist(linklist_pnode l);

extern void show_linklist(linklist_pnode l);

#endif
// linklist.c
#include "linklist.h"

// 初始化单向链表
void init_linklist(linklist_pnode *H)
{

	*H = (linklist_pnode)malloc(sizeof(linklist_node));
	if (NULL == (*H)) {
		perror("malloc");
		exit(1);
	}
	(*H)->next = NULL;
}

// 计算链表的长度
int length_linklist(linklist_pnode l)
{
	linklist_pnode p = l->next;
	int i = 0;
	while (p) {
		i++;
		p = p->next;
	}
	return i;
}

// 在l指向的链表中的i位置插入数据data,成功返回true,失败返回false
bool insert_linklist(linklist_pnode l, int i, datatype data)
{
	int length = 0;
	linklist_pnode new = NULL;
	linklist_pnode p = l;

	length = length_linklist(l);

	// 判断i是否合法
	if (i < 0 || i > length + 1) {
		printf("插入位置无效!\n");
		return false;
	}

	// 找到要插入新结点的位置(p指向的结点的后面)
	for (int j = 0; j < i; ++j)
		p = p->next;

	// 插入数据
	new = (linklist_pnode)malloc(sizeof(linklist_node));
	if (NULL == new) {
		perror("malloc");
		return false;
	}

	new->data = data;
	new->next = p->next;
	p->next = new;

	return true;
}

// 在l指向的链表中删除i位置数据data,成功返回true,失败返回false
bool del_linklist(linklist_pnode l, int i)
{
	int length = 0;
	linklist_pnode q = NULL;
	linklist_pnode p = l;

	// 判断i是否合法
	length = length_linklist(l);
	if (i < 0 || i > length) {
		printf("删除位置无效!\n");
		return false;
	}
	
    // 判断链表是否空
	if (isempty_linklist(l)) {
		printf("链表已空!\n");
		return false;
	}

	// 将i位置的数据删除
	for (int j = 0; j < i; ++j)
		p = p->next;

	q = p->next;
	p->next = q->next;
	free(q);

	return true;
}

bool isempty_linklist(linklist_pnode l)
{
	if (l->next == NULL)
		return true;
	else
		return false;
}

void show_linklist(linklist_pnode l)
{
	linklist_pnode p;
	for (p = l->next; p; p = p->next)
		printf("%d\t", p->data);
	printf("\n");
}
// linklist_main.c
/*
* 单项链表实现数据逆转,首先建立一个包含若干整数的单项链表
* 然后参考实现数据的逆转, 如 1,2,3,4,5逆转后为 5,4,3,2,1
*/ 
#include "linklist.h"

void create_linklist(linklist_pnode h, int n);
void reverse_linklist(linklist_pnode h);

int main(void)
{
	int n;
	linklist_pnode h;

	init_linklist(&h);  //初始化链表
	printf("请输入链表长度:");
	scanf("%d", &n);

	create_linklist(h, n);
	reverse_linklist(h);
	show_linklist(h);

	return 0;
}

// 创建链表
void create_linklist(linklist_pnode h, int n)
{
	datatype d;

	for (int i = 0; i < n; ++i) {
		printf("请输入数据:");
		scanf("%d", &d);
		insert_linklist(h, i, d);
		show_linklist(h);
	}
}

// 逆转
void reverse_linklist(linklist_pnode h)
{
	linklist_pnode p, q;

	p = h->next;
	h->next = NULL;

	while (p) {
		q = p;
		p = p->next;

		q->next = h->next;
		h->next = q;
	}
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值