分别用C和C++实现了链表结构

C实现:这里写代码片

LINKED_LIST.h

typedef struct S_NODE
{
float data;
struct S_NODE *link;

}Node;

//创建链表
Node* Create()
{
Node *root,*tail,*pnew;
float data;
int i;
root=(Node*)malloc(sizeof(Node));
if(root==NULL)
{printf(“头结点创建失败\n”);return NULL;}
root->link=NULL;
tail=root;

for(i=0;i<10;++i)
{

    data=i;
    pnew=(Node*)malloc(sizeof(Node));
    pnew->data=data;
    pnew->link=NULL;
    tail->link=pnew;
    tail=pnew;

}
return root;

}
//向头指针为head的链表 的loc位置插入数据data
void Insert(Node* root,int loc,float data)
{
Node *pnew,*p=root;
int i=1;
pnew=(Node*)malloc(sizeof(Node));
pnew->data=data;

while(i++<loc)
{
    p=p->link;
    if (p->link==NULL&&i<loc)
    {printf("插入位置错误\n");return ;}

}
//这时p指向要插入的结点
pnew->link=p->link;
//p->link=NULL; 这条语句可省略 不用先将p->link赋NULL 可直接改变p->link的值
p->link=pnew;

}
//删除链表第DelIdx个结点
void Delete(Node* root,int DelIdx)
{
Node *p=root ,*previous=NULL;
int i=0;
while(i< DelIdx)
{
if(i==DelIdx-1)
previous=p; //找到要删除结点的前一个结点
p=p->link;
if(p==NULL)//判断是否删除最后的无用数据
{printf(“删除位置错误\n”);return;}
++i;
}

previous->link=p->link;//跳过删除结点
//这是p所指向的结点就是要删除的结点
free(p);

}
//显示链表所有结点数据
void Display(Node* root)
{
Node *p;
p=root->link;
while(1)
{
printf(“%f\t”,p->data);
if(p->link==NULL)//最后一个结点
break;
p=p->link;
}
}
//释放链表内存
void Free(Node *root)
{
Node *p,*q;
p=root;
do
{
q=p->link;
p->link=q->link;
free(q);
}
while(p->link!=NULL);

free(p);

}
//在链表中查找数据data 找到则返回序号 找不到返回0
int find(Node *root,float data)
{
Node *p;
int idx=1;
p=root->link;

while(p!=NULL)
{
    if(p->data==data)
    return idx;
    p=p->link;
    ++idx;
}
return 0;//表示没找到data

}
//返回链表的长度
int length(Node *root)
{
Node *p;
int len=0;
p=root->link;
while(p!=NULL)
{++len;p=p->link;}
return len;
}

LINKED_LIST.c

include < stdio.h>

include< stdlib.h>

include”LINKED_LIST.h”

void main()
{
Node *root;
int data=5;
root=Create();//构造链表
Insert(root,9,23);//将数据23插入到第8个结点位置
Delete(root,8);//删除链表中的第8个数据
Display(root);//显示此时链表的数据
printf(“链表长度为:%d\n”,length(root));
printf(“%d在链表的第%d个位置\n”,data,find(root,data));

Free(root);//释放链表内存

}

C++ 实现这里写代码片

**

LINKED_LIST.c

**

include< iostream >

include”LINKED_LIST.h”

using namespace std;
void main()
{
List Mylist;
float i;
int j=1;
float data=5;
int len,dedata=8;
cout<<”构造后链表的长度为”<< Mylist.length()<< endl;

for(i=0;i<10;++i)
{
    Mylist.Insert(j,i);
    ++j;
}
cout<<"构造的链表为:"<<endl;
Mylist.Display();
Mylist.Delete(dedata);
cout<<"输出一个结点后的链表为:"<<endl;
Mylist.Display();
cout<<data<<"在链表中的位置为:"<<Mylist.Find(data)<<endl;

}
**

LINKED_LIST.h

**

include < stdlib.h >

define space ” “

//结点结构体声明
typedef struct S_Node
{
float data;
struct S_Node *link;

}Node;

// 链表类声明
class List
{
private:
//public:
Node *root;
//Node *tail; tatil其实没有 哪个结点的link为空 哪个结点就是tail 结点
public:
List();
~List();
int& length();
void Insert(int &loc,float &data);//传引用 为了提高效率
void Display();
void Delete(int &idx);
int& Find(float &data);

};

/*******链表类函数定义***********/
List::List()
{
std::cout<< “已经入构造函数…”<< std::endl;
this->root=new Node();
root->link=NULL;
}
int &List::length()
{
int len=0;
Node *p=this->root->link;
while(p!=NULL)
{++len;p=p->link;}
return len;
}
void List::Insert(int &loc,float &data)
{
Node *pnew;
Node *p=this->root;
int i=1;
pnew=new Node();
pnew->data=data;

while(i++<loc)
{
    p=p->link;
    if (p->link==NULL&&i<loc)
    {printf("插入位置错误\n");return ;}

}
//这时p指向要插入的结点
pnew->link=p->link;
p->link=pnew;

}
void List::Display()
{
std::cout<< “链表为:”<< std::endl;
Node *p=this->root->link;
while(p!=NULL)
{std::cout<data<< space;p=p->link;}
std::cout<< std::endl;
}

void List::Delete(int &DelIdx )
{
Node *p=this->root ,*previous=NULL;
int i=0;
while(i< DelIdx)
{
if(i==DelIdx-1)
previous=p; //找到要删除结点的前一个结点
p=p->link;
if(p==NULL)//判断是否删除最后的无用数据
{printf(“删除位置错误\n”);return;}

    ++i;
}

previous->link=p->link;//跳过删除结点
//这是p所指向的结点就是要删除的结点
delete(p);

}

int &List::Find(float &data)
{
Node *p;
int idx=1;
p=this->root->link;

while(p!=NULL)
{
    if(p->data==data)
    return idx;
    p=p->link;
    ++idx;
}
std::cout<<"查找的数据"<<data<<"不在链表中"<<std::endl;
exit(1);

}
List::~List()
{
Node *p,*q;
std::cout<<”已进入析构函数…”<< std::endl;
p=this->root;
do
{
q=p->link;
p->link=q->link;
delete(q);
}
while(p->link!=NULL);

delete(p);

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值