关于单链表的各种函数的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++链表的创建和插入删除的实现
- 单链表的创建,删除,插入,翻转,打印--数组存入单链表,单链表翻转
- c++实现单链表创建,删除,遍历,插入,修改操作
- c++之链表篇1:单向链表的创建,打印,删除,插入,销毁等基本操作
- Oracle数据库的概念(权限、角色)以及各种操作(创建表空间、创建表、查询、更新、删除、插入)和常用函数
- 数据结构:头插法、尾插法创建单链表,求链表长度、查找、插入、删除、合并
- c++链表 建立 输入 输出 删除结点 插入结点 释放链表 的函数
- 链表初解(一)——单链表的创建、删除、插入、测长、排序、逆置
- 单链表的创建删除排序插入逆向打印各种操作
- 用c++实现单向链表的创建,插入和删除
- 单链表中头结点的有无. 并讨论下有无头结点在单链表的创建,打印,插入,逆置,删除中的区别.
- C++单链表的操作(创建,删除,打印,遍历,插入)
- C++单链表的动态创建,查找,遍历,删除,插入,添加,排序
- C++实现链表的创建、插入、删除
- 关于链表结构的基本操作 c 实现 (创建,插入删除,反转,合并链表,查找,是否有环,链表相交情况)
- 单链表的创建(头插尾插),表长,输出,插入,删除,查找,逆置,分解长两个链表(奇数偶数链表),查找倒数第k个元素,产出相同元素
- C语言各种链表操作(创建、打印、删除、插入、反转)
- C++写的带有头结点单链表创建,插入,删除,显示
- 【数据结构】用C++实现单链表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等)
- C++实现单链表的创建、插入、删除、逆置操作