一个完善的动态链表程序应该具有以下基本功能:建立链表、插入结点、删除结点、打印链表、释放链表等。扩展的动态链表程序还可能有获得链表长度、获得当前结点、查找结点位置、连接两个链表、比较两个链表等功能。下面将逐个实现其功能代码。
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
typedef int ElemType;
typedef struct List *link;
typedef struct List Lnode;
struct List
{
ElemType data;
struct List *next;
};
/*链表的建立*/
link create (link Head)
{
ElemType newData;
link NewPoint; //先建立一个结点
Head=(link)malloc(sizeof(Lnode));
cout<<"Please input number:\n";
cin>>newData;
Head->data=newData; //结点赋值
Head->next=NULL; //结点指向空地址
while(1)
{
NewPoint=(link)malloc(sizeof(Lnode)); //开辟一个节点空间
if(NewPoint==NULL) //如果开辟空间失败,则返回
break;
cout<<"Please input number(input '-1' means exit)\n";
cin>>newData;
if(newData==-1)
return Head;
NewPoint->data=newData;
NewPoint->next=Head;
Head=NewPoint;
}
return Head;
}
/*链表的显示*/
void display(link Head)
{
link p;
p=Head;
if(p==NULL)
cout<<"\nList is empty\n";
else do
{
cout<<p->data;
p=p->next;
}
while(p!=NULL);
}
/*结点的插入*/
link insert(link Head, ElemType x,int i)
{
link NewPoint,p=Head;
int j=1;
NewPoint=(link)malloc(sizeof(Lnode));
NewPoint->data=x;
if(i==1) //如果插入位置为第一个节点时
{
NewPoint ->next=Head;
Head=NewPoint;
}
else
{
while(j<i-1&&p->next!=NULL)
{
p=p->next;
j++;
}
if(j==i-1)
{
NewPoint->next=p->next;
p->next=NewPoint;
}
else cout<<"Insert is failure,i is not right!";
}
return Head;
}
/*结点的删除*/
link del(link Head,int i)
{
int j=1;
link p,t;
p=Head;
if(i==1)
{
p=p->next;
free(Head);
Head=p;
}
else
{
while(j<i-1&&p->next!=NULL)
{
p=p->next;
j++;
}
if(p->next!=NULL&&j==i-1)
{
t=p->next;
p->next=t->next;
}
if(t!=NULL) free(t);
}
return Head;
}
/*获得结点元素值*/
ElemType get (link Head, int i)
{
int j=1;
link p;
p=Head;
while(j<i&&p!=NULL)
{
p=p->next;
j++;
}
if(p!=NULL)
return (p->data);
else
cout<<"Data is error!";
return -1;
}
/*查找节点元素x的位置*/
int locate (link Head,ElemType x)
{
int n=0;
link p;
p=Head;
while(p!=NULL&&p->data!=x)
{
p=p->next;
n++;
}
if(p==NULL)
return -1;
else
return n+1;
}
/*返回链表的长度*/
int lenth(link Head)
{
int len=0;
link p;
p=Head;
while(p!=NULL)
{
len++;
p=p->next;
return len;
}
}
/*连接两个链表*/
link connect (link Head1,link Head2)
{
link p;
p=Head1;
while(p->next!=NULL)
{
p=p->next;
}
p->next=Head2;
return Head1;
}
/*比较两个链表是否相同*/
int compare(link Head1,link Head2)
{
link p1,p2;
p1=Head1;
p2=Head2;
while(1)
{
if((p1->next==NULL)&&(p2->next==NULL))
return 1;
if(p1->data!=p2->data)
return 0;
else
{
p1=p1->next;
p2=p2->next;
}
}
}
/*释放链表*/
link setnull(link Head)
{
link p;
p=Head;
while(p!=NULL)
{
p=p->next;
free(Head);
Head=p;
}
return Head;
}
/*主函数的建立*/
int main()
{
int l;
link head1,head2;
head1=create(head1);
head2=create(head2);
connect(head1,head2);
head1=del(head1,3);
display(head1);
cout<<"\n Length is "<<lenth(head1);
cout<<"\n Length is "<<get(head1,3);
cout<<"\n Locate 12 is %d", locate(head1,12);
}