双链表的基本运算

代码:


#include<stdio.h>
#include<malloc.h>
typedef char ElemType;
typedef struct DNode
{
	ElemType data;
	struct DNode *prior;
	struct DNode *next;
}DLinkList;
//初始化
void InitList(DLinkList * &L)
{
	L=(DLinkList *)malloc(sizeof(DLinkList));
	L->prior=L->next=NULL;
}
//销毁双链表
void DestroyList(DLinkList *L)
{
	DLinkList *p=L,*q=p->next;
	while(q!=NULL)
	{
		free(p);
		p=q;
		q=p->next;
	}
	free(p);
}
//判断链表是否为空
bool ListEmpty(DLinkList *L)
{
	return(L->next==NULL);
}
//双链表的长度
int ListLength(DLinkList *L)
{
	DLinkList *p=L;
	int i=0;
	while(p->next!=NULL)
	{
		i++;
		p=p->next;
	}
	return i;
}
//输出双链表
void DispList(DLinkList *L)
{
	DLinkList *p=L->next;
	while(p!=NULL)
	{
		printf(" %c ",p->data);
		p=p->next;
	}
	printf("\n");
}
//求双链表中的某个元素的值
bool GetElem(DLinkList *L,int i,ElemType &e)
{
	int j=0;
	DLinkList *p=L;
	while(j<i && p!=NULL)
	{
		j++;
		p=p->next;
	}
	if(p==NULL)
		return false;
	else
	{
		e=p->data;
		return true;
	}
    
}
//按元素值查找
int LocateElem(DLinkList *L,ElemType e)
{
	int n=1;
	DLinkList *p=L->next;
	while(p!=NULL && p->data!=e)
	{
		n++;
		p=p->next;
	}
	if(p==NULL)
		return 0;
	else
		return n;
}
//插入元素
bool ListInsert(DLinkList * &L,int i,ElemType e)
{
	int j=0;
	DLinkList *p=L,*s;
	while(j<i-1 && p!=NULL)
	{
		j++;
		p=p->next;
	}
	if(p==NULL)
		return false;
	else
	{
		s=(DLinkList *)malloc(sizeof(DLinkList));
		s->data=e;
		s->next=p->next;
		if(p->next!=NULL)
			p->next->prior=s;
		s->prior=p;
		p->next=s;
		return true;
	}
}
//删除数据元素
bool ListDelete(DLinkList * &L,int i,ElemType &e)
{
	int j=0;
	DLinkList *p=L,*q;
	while(j<i-1 && p!=NULL)
	{
		j++;
		p=p->next;
	}
	if(p==NULL)
		return false;
	else
	{
		q=p->next;
		if(q==NULL)
			return false;
		e=q->data;
		p->next=q->next;
		if(p->next!=NULL)
			p->next->prior=p;
		free(q);
		return true;
	}
}
void main()
{
	DLinkList *h;
	ElemType e;
	printf("双链表的基本运算如下:\n");
	printf(" (1)初始化双链表h\n");
	InitList(h);
	printf(" (2)依次采用尾插法插入a,b,c,d,e元素\n");
	ListInsert(h,1,'a');
	ListInsert(h,2,'b');
	ListInsert(h,3,'c');
	ListInsert(h,4,'d');
	ListInsert(h,5,'e');
	printf(" (3)输出双链表h:");
	DispList(h);
	printf(" (4)双链表的长度=%d\n",ListLength(h));
	printf(" (5)双链表h为%s\n",(ListLength(h)?"空":"非空"));
	GetElem(h,3,e);
	printf(" (6)双链表h的第三个元素=%c\n",e);
	printf(" (7)元素a的位置=%d\n",LocateElem(h,'a'));
	printf(" (8)在第四个元素上插入f元素\n");
	ListInsert(h,4,'f');
	printf(" (9)输出双链表h:");
	DispList(h);
	printf(" (10)删除h的第三个元素\n");
	ListDelete(h,3,e);
	printf(" (11)输出双链表h:");
	DispList(h);
	printf(" (12)释放双链表h\n");
	DestroyList(h);
}

运行结果:


  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你设计双向链表实现大整数四则运算。 首先,我们可以定义一个节点结构体,有三个成员变量:前驱指针 prev、后继指针 next、节点值 val。其中,节点值 val 可以用一个 int 数组存储,每个 int 存储一位数字。 ```c++ struct Node { int val[4]; // 每个 int 存储 4 位数字 Node* prev; Node* next; }; ``` 然后,我们可以定义一个双向链表结构体,有两个指针成员变量:头指针 head 和尾指针 tail。我们可以在双向链表中定义一些基本的操作,如插入节点、删除节点、遍历链表等。 ```c++ struct DoubleLinkedList { Node* head; Node* tail; // 在链表末尾插入节点 void insertNode(Node* node) { if (head == NULL) { head = tail = node; } else { tail->next = node; node->prev = tail; tail = node; } } // 删除链表中的节点 void deleteNode(Node* node) { if (node == head && node == tail) { head = tail = NULL; } else if (node == head) { head = head->next; head->prev = NULL; } else if (node == tail) { tail = tail->prev; tail->next = NULL; } else { node->prev->next = node->next; node->next->prev = node->prev; } } // 遍历链表,输出所有节点的值 void traverse() { Node* cur = head; while (cur != NULL) { for (int i = 3; i >= 0; i--) { cout << cur->val[i]; } cur = cur->next; } cout << endl; } }; ``` 有了双向链表的基本操作,我们就可以实现大整数的四则运算了。以下是加法和减法的实现代码。 ```c++ // 大整数加法 void add(DoubleLinkedList& num1, DoubleLinkedList& num2, DoubleLinkedList& sum) { Node* cur1 = num1.head; Node* cur2 = num2.head; int carry = 0; while (cur1 != NULL || cur2 != NULL) { Node* node = new Node(); int val = carry; if (cur1 != NULL) { for (int i = 0; i < 4; i++) { val += cur1->val[i]; } cur1 = cur1->next; } if (cur2 != NULL) { for (int i = 0; i < 4; i++) { val += cur2->val[i]; } cur2 = cur2->next; } carry = val / 10000; val = val % 10000; for (int i = 0; i < 4; i++) { node->val[i] = val % 10; val /= 10; } sum.insertNode(node); } if (carry > 0) { Node* node = new Node(); for (int i = 0; i < 4; i++) { node->val[i] = carry % 10; carry /= 10; } sum.insertNode(node); } } // 大整数减法 void subtract(DoubleLinkedList& num1, DoubleLinkedList& num2, DoubleLinkedList& diff) { Node* cur1 = num1.head; Node* cur2 = num2.head; int borrow = 0; while (cur1 != NULL || cur2 != NULL) { Node* node = new Node(); int val = borrow; if (cur1 != NULL) { for (int i = 0; i < 4; i++) { val += cur1->val[i]; } cur1 = cur1->next; } if (cur2 != NULL) { for (int i = 0; i < 4; i++) { val -= cur2->val[i]; } cur2 = cur2->next; } if (val < 0) { val += 10000; borrow = -1; } else { borrow = 0; } for (int i = 0; i < 4; i++) { node->val[i] = val % 10; val /= 10; } diff.insertNode(node); } // 去除前导零 while (diff.tail != NULL && diff.tail != diff.head && diff.tail->val[3] == 0) { Node* temp = diff.tail; diff.tail = diff.tail->prev; diff.tail->next = NULL; delete temp; } } ``` 以上是双向链表实现大整数四则运算基本思路和代码实现。当然,这只是一个简单的实现,还有很多可以优化的地方,比如可以用 STL 中的 vector 代替 int 数组来存储节点值,提高代码可读性和易维护性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值