#本文章仅用于记录本人学习过程,当作笔记来用,如有侵权请及时告知,谢谢!
由于学校作业要求,需要使用链表来存储任意长的整数(包括正数和负数),借鉴了许多网上资料后,成功改造了轮子,于是把经验分享在这里,欢迎大家讨论:
首先是定义链表元素:
注意:
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;
}