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

关于单链表的各种函数的C++源代码,创建单链表、求表长、插入、删除等等

2010-10-04 02:01 417 查看
#include <iostream>
using namespace std;

typedef struct LNode
{
char data;
struct LNode * next;
}LNode,* listLink;//此处声明了一个结构体类型和一个结构体类型的指针

/*单链表的初始化*/
void initList_L(listLink &L)
{
L=new LNode;
L->next=NULL;
}

/*清空表*/
void clearList_L(listLink &L)
{
LNode *p,*q;

p=L->next;
L->next=NULL;//这里应该注意:L->next在等号左边和右边的含义是不一样的,在右边表示将下一个结点的地址
//赋值给变量,在左边表示L这个结点的地址域,是被赋值的对象。

while (p)
{
q=p;
p=p->next;
delete q;//这里应该这样想:p和q都是指针,是指针在动,他们指向链表,而链表并没有动。
}
}

/*求表长*/
int listLength_L(listLink &L)
{
LNode *p;
int length;
p=L;
length=0;

while(p->next)
{
length++;
p=p->next;
}//始终遵循上面注释中说的:p和q都是指针,是指针在动,他们指向链表,而链表并没有动,这样理解就会容易很多。

return length;
}

/*取第i个结点的元素值*/
char getElem_L(listLink &L,int i)
{
LNode *p;
int count;

p=L->next;
while(p&&count<i)
{
p=p->next;
count++;
}
if(!p||count>i)
cout<<"Position Error!";
else
return p->data;
}

/*确定表中某结点的地址*/
LNode *locateElem_L(listLink &L,char x)
{
LNode *p;
p=L->next ;
while(p&&p->data!=x)
p=p->next;
if(!p)
return NULL;
else
return p;
}

/*插入元素*/
void insertElem_L(listLink &L,int i,char x)
{
LNode *p;
LNode *s;
int count;

p=L->next;
count=1;

while(p&&count<i-1)
{
p=p->next;
count++;
}//寻找第i-1个结点,使p指向第i-1个结点。

if(!p||count>i-1)
{
cout<<"Poision Error!";
}

else
{
s=new LNode;
s->next=p->next;
p->next=s;//注意这里赋值的顺序千万不能变,即不能这样:p->next=s; s->next=p->next;
//若是这样的话,就等于是先改变了p->next的值,也就不能把p的前继赋值给s了!!!
s->data=x;
}
}

/*删除表中的元素,并返回该元素的值*/
void deleteElem_L(listLink &L,int i)
{
LNode *p,*q;
int count;

p=L->next;
count=1;

while((p->next)&&count<i-1)
{
p=p->next;
count++;
}
if(!(p->next)||count>i-1)
cout<<"Poision Error";
else
{
q=p->next;
p->next=q->next;
delete q;//这里的释放就是把这个指针给销毁了,就是没有这个指针了,这也就是为什么要多一个指针的缘故。
}
}

/*用正序插入法创建一个单链表*/
void creatList_L_1(listLink &L,int n)
{
initList_L(L);

LNode *p,*q;
p=L;

for(int i=0;i<n;i++)
{
q=new LNode;

cin>>q->data;
q->next=NULL;

p->next=q;
p=q;

}
}//就是在表的尾端不断接上元素。

/*用逆序插入法创建一个单链表*/
void creatList_L_2(listLink &L,int n)
{
initList_L(L);

LNode *p;
for(int i=0;i<n;i++)
{
p=new LNode;

cin>>p->data;
p->next=L->next;
L->next=p;//不断地在L和L的前继之间插入新的元素。
}
}//逆序法就是第一个输入的元素是单链表的最后一个元素,既是从链表的最后一个元素输入。

void outputList_L(listLink &L,int n)
{
LNode *p;
p=L->next;

for(int i=0;i<n;i++)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}//依次输出链表中的元素

void main()
{
listLink L;
//creatList_L_2(L,10);
//outputList_L(L,10);

creatList_L_1(L,10);//创建一个单链表
//outputList_L(L,10);

insertElem_L(L,2,'a');//插入
outputList_L(L,listLength_L(L));

deleteElem_L(L,11);//删除
outputList_L(L,listLength_L(L));
}
 

虽然说有了算法,写代码就容易了,可是就好像你理论上知道那个事是怎么做,却没有去实践过,最终也只能去当个老师了!呵呵!亲身实践一回,就会发现很多问题,比如说对算法有了更透彻的了解,对在写代码的过程中,对那些因忽略某些细节而引起的错误,会更加小心等等!
毛爷爷曾教导我们:理论要和实际相结合,理论来源于实际,用理论去指导实际,再用实际去丰富理论,如此便可循序渐进。
 

PS:另外推荐一个让大家真正练手的网站:猪八戒威客网,在这里可以按自己的能力去接一些程序设计的任务。我觉得这是一种很不错的学习方法,当你接了别人的任务,无形中就给了自己压力和动力,然后就会主动的去查询资料,分析问题,可能会历经艰辛才能解决问题,但这中间的过程是很珍贵的,你会通过自己的努力学到很多课本上没有学到的东西,也能过一回需求分析的瘾,真实的体会到和客户进行交流的诸多“纠结”,最后,如果你的努力得到客户的认可,可以获得一笔小小的佣金,当做对自己的奖励,更重要的是,通过做任务,你能体会到自己存在的价值感和对自己能力的肯定!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ delete struct 任务 null ini
相关文章推荐