学习C++02——使用双向链表存储数据(任意长的整数(包括正数和负数))

#本文章仅用于记录本人学习过程,当作笔记来用,如有侵权请及时告知,谢谢!

由于学校作业要求,需要使用链表来存储任意长的整数(包括正数和负数),借鉴了许多网上资料后,成功改造了轮子,于是把经验分享在这里,欢迎大家讨论:

首先是定义链表元素:
注意:
malloc和free函数是配对的,如果申请后不释放就是内存泄露;
malloc的实参是sizeof(int),用于指明一个整形数据需要的大小

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h>
#include<math.h> 
#include<iostream>
using namespace std;

#define N 100  //宏定义,都用100去替换宏

typedef int DataType;

typedef struct DoubleNode //定义链表元素 
{	 DataType data; 
	 struct DoubleNode *prior;  //next是后向指针,prior是前向指针
	 struct DoubleNode *next; }DLNode; 

 void InitNode(DLNode **head) //初始化链表
 {
	 if((*head=(DLNode*)malloc(sizeof(DLNode)))==NULL)
		exit(1); 
		//exit(N)如果N=0,则说明程序或者是函数正常结束,非0表示不正常结束。其实N的值对程序的正确性没有影响。
		(*head)->prior=*head; 
		(*head)->next=*head; 
 }

向链表第N个位置插入元素X

int InsertNode(DLNode *head,int n,DataType x) //向链表第N个位置插入元素X 
 { 
	DLNode *p,*nt; 
	int i=0; 
	p=head->next; 
	while(p!=head&&i<n)
		{ 
			p=p->next; i++; 
		} 
	if(i != n)
	 { 
		 cout<<"插入位置错误\n"; 
		 return 0;
	 } 
	if((nt=(DLNode *) malloc(sizeof(DLNode)))==NULL)
		 exit(1); 
	 nt->data=x; 
	 nt->prior = p->prior;
	 nt->prior->next = nt;  //nt->prior->next 是 nt的前一个节点的后向指针
	 nt->next=p; 
	 p->prior=nt; 
	 return 1;
	 } 

判断整数N有几位

int digit(int n) //判断整数N有几位
	 { 
		 int i; 
		 for(i=1;;n/=10,i++) 
		 {
			if(n/10==0)
			return i;
		 }
 } 
 void PrintNode(DLNode *head) //打印链表 
 { 
	 DLNode *p=head->next;
	 int i; 
	 while( p->data == 0) //去掉前面的一串0 
	 { 
		 p = p->next;
		 if(p == head) 
		 { 
			cout<<"0\n"; 
			return;
		 }
	 }
	 //printf("%d",p->data); 
	 cout<<p->data;
	 //最前面的一个数进行特殊处理,不用补零
	 p = p->next;
	 while(p!=head) //打印后面的数字 
	 { 
		 cout<<","; 
		 if(p->data == 0) 
		 { 
			 cout<<"000"; 
			 p = p->next; 
			 continue;
		 } 
		 for(i=0; i<3-digit(p->data); i++) //补零 
			 cout<<"0"; 
		 //printf("%d",p->data); 
		 cout<<p->data; 
		 p = p->next; 
	 } 
	 cout<<endl; 
 } 

销毁链表

void DestroyNode(DLNode **head) 销毁链表
 {
	 DLNode *p,*p1;
	 p = (*head)->next; 
	 while(p != *head) 
	 { 
		 p1=p;
		 p=p->next;
		 free(p1);
	 }
	 free(p);
	 head = NULL;
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值