双链表的增删

双链表的实现:

就是再单链表的基础上加个前驱结点,其实相较于单链表操作更加简单了,由于王道书上就指出了增加和删除的操作,这里也就简单实现下,其他操作都和单链表类似

状态码等信息定义

#define OK 1
#define ERROR 0
#define True 1
#define False 0

typedef int Elemtype;

//函数状态码
typedef int Statue;

双链表的定义

//定义adt
typedef struct Node {
	Elemtype data;
	struct Node* prior, * next;

}DNode,*DLinkList;

初始化

//函数的初始化
Statue InitList(DLinkList* L) {
	if ((*L)) {
		printf("链表已经存在,无需再初始化了");
			return ERROR;

	}
	//开始创建
	*L = (DNode*)malloc(sizeof(DNode));
	if (!(*L)) { return ERROR; }
	(*L)->prior = NULL;
	(*L)->next = NULL;
	return OK;

}

增加操作

// 在链表LL的第ii个位置插入元素ee,返回值:ERROR-失败;OK-成功。
int InsertList(DLinkList L, unsigned int ii, Elemtype* ee) {
	if (L == NULL || ii < 1 || ee == NULL) {
		return ERROR;
	}
	int count=0;
	DLinkList tmp = L;
	while ((count < ii-1) && (tmp != NULL)) {
		tmp = tmp->next;
		count++;
	}
	if (tmp == NULL) {
		printf("超过了表长");
		return ERROR;
	}
	DNode* nNode = (DNode*)malloc(sizeof(DNode));
	if (nNode == NULL)
		return ERROR;
	//考虑到结构体整体拷贝的情况
	memcpy(&nNode->data, ee, sizeof(Elemtype));
	nNode->next = tmp->next;
	nNode->prior = tmp;
	if (nNode->next == NULL) {
		nNode->next->prior = nNode;
	}
	tmp->next = nNode;
	return OK;

}

双链表的删除

Statue  DeleteNode(DLinkList LL, unsigned int ii) {
	if ((LL == NULL) || (ii < 1)) {
		return ERROR;
	}
	int count = 0;
	DLinkList tmp = LL;
	while ((tmp!= NULL)&&(count<ii-1))
	{
		tmp = tmp->next;
		count++;
	}
	if (tmp->next == NULL) {
		return ERROR;
	}
	DNode* rem = tmp->next;//要删除1结点
	tmp->next = rem->next;
	if (rem->next != NULL) {
		tmp->next->prior = tmp;
	}
	free(rem);
	return OK;
}

怎么说的有手就行,重点是又水了一天hhh

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值