您的位置:首页 > 编程语言 > C语言/C++

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

2016-11-22 17:51 239 查看

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);

};

/[b]*******[/b]链表类函数定义[b]***********[/b]/

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);


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息