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