C++链表基本操作.doc_第1页
C++链表基本操作.doc_第2页
C++链表基本操作.doc_第3页
C++链表基本操作.doc_第4页
C++链表基本操作.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C+链表基本操作我们知道,数组式计算机根据事先定义好的数组类型与长度自动为其分配一连续的存储单元,相同数组的位置和距离都是固定的链表是一种动态数据结构,他的特点是用一组任意的存储单元(可以是连续的,也可以是不连续的)存放数据元素。链表中每一个元素成为“结点”,每一个结点都是由数据域和指针域组成的,每个结点中的指针域指向下一个结点。Head是“头指针”,表示链表的开始,用来指向第一个结点,而最后一个指针的指针域为NULL(空地址),表示链表的结束。可以看出链表结构必须利用指针才能实现,即一个结点中必须包含一个指针变量,用来存放下一个结点的地址。实际上,链表中的每个结点可以用若干个数据和若干个指针。结点中只有一个指针的链表称为单链表,这是最简单的链表结构。struct Nodeint Data;Node*next;这里用到了结构体类型。其中,*next是指针域,用来指向该结点的下一个结点;Data是一个整形变量,用来存放结点中的数据。当然,Data可以是任何数据类型,包括结构体类型或类类型。在此基础上,我们在定义一个链表类list,其中包含链表结点的插入,删除,输出等功能的成员函数。class listNode*head;public:list()head=NULL;void insertlist(int aDate,int bDate);/链表结点的插入void Deletelist(int aDate);/链表结点的删除void Outputlist();/链表结点的输出Node*Gethead()return head;2 链表结点的访问由于链表中的各个结点是由指针链接在一起的,其存储单元文笔是连续的,因此,对其中任意结点的地址无法向数组一样,用一个简单的公式计算出来,进行随机访问。只能从链表的头指针(即head)开始,用一个指针p先指向第一个结点,然后根据结点p找到下一个结点。以此类推,直至找到所要访问的结点或到最后一个结点(指针为空)为止。下面我们给出上述链表的输出函数;void list:outputlist()Node*current=head;while(current!=NULL)coutDatanext;coutData=bDate; /设b为此结点p=head; if(head=NULL) /若是空表,使b作为第一个结点 head=s; s-next=NULL; else if(p-Data=aDate) /若a是第一个结点 s-next=p; head=s; else while(p-Data!=aDate&p-next!=NULL)/查找结点a q=p; p=p-next; if(p-Data=aDate) /若有结点a q-next=s; s-next=p; else /若没有结点a; p-next=s; s-next=NULL; 4 链表结点的删除如果要在链表中删除结点a并释放被删除的结点所占的存储空间,则需要考虑下列几种情况。(1) 若要删除的结点a是第一个结点,则把head指向a的下一个结点。(2)若要删除的结点a存在于链表中,但不是第一个结点,则应使a得上一个结点a_k-1的指针域指向a的下一个结点a_k+1。(3) 空表或要删除的结点a不存在,则不做任何改变。void list:deletelist(int aDate) /设aDate是要删除的结点a中的数据成员Node*p,*q; /p用于指向结点a,q用于指向结a的前一个结点p=head;if(p=NULL) /若是空表return;if(p-Data=aDate) /若a是第一个结点head=p-next;delete p;elsewhile(p-Data!=aDate&p-next!=NULL) /a既不是头结点也不是终结点,则查找结点aq=p;p=p-next;if(p-Data=aDate) /若有结点aq-next=p-next;delete p;例题;利用以上三个链表操作成员函数insertlist,deletelist.outputlist,可形成以下的简单链表操作#includeiostream.hstruct Nodeint Data;Node*next;class listNode*head;public:list()head=NULL;void insertlist(int aData,int bData);void deletelist(int aData);void outputlist();Node*gethead()return head;void list:insertlist(int aData,int bData) /设aData是结点a中的数据,bData是结点b中的数据Node*p,*q,*s; /p指向结点a,q指向结点a_k,s指向结点bs=(Node*)new(Node); /动态分配一个新结点s-Data=bData; /设b为此结点p=head;if(head=NULL) /若是空表,使b作为第一个结点head=s;s-next=NULL;elseif(p-Data=aData) /若a是第一个结点s-next=p;head=s;elsewhile(p-Data!=aData & p-next!=NULL)/查找结点aq=p;p=p-next;if(p-Data=aData) /若有结点aq-next=s;s-next=p;else /若没有结点a;p-next=s;s-next=NULL;void list:deletelist(int aData) /设aData是要删除的结点a中的数据成员Node*p,*q; /p用于指向结点a,q用于指向结a的前一个结点p=head;if(p=NULL) /若是空表return;if(p-Data=aData) /若a是第一个结点head=p-next;delete p;elsewhile(p-Data!=aData&p-next!=NULL) /查找结点aq=p;p=p-next;if(p-Data=aData) /若有结点aq-next=p-next;delete p;void list:outputlist()Node*current=head;while(current!=NULL)coutDatanext;coutendl;void main()list A,B;int Data10=25,41,16,98,5,67,9,55,1,121;A.insertlist(0,Data0); /建立链表A首结点for(int i=1;i10;i+)A.insertlist(0,Datai); /顺序向后插入coutn链表A:;A.outputlist();A.deletelist(Data7);cout删除元素Data7后;A.outputlist();B.insertlist(0,Data0); /建立链表B首结点for(i=0;iData,Datai); /在首结点处顺序向后插入coutn链表B:;B.outputlist();B.deletelist(67);cout删除元素67后;B.outputlist();程序运行结果为链表A;25,41,16,98,5,67,9,55,1,121删除元素Data7后;25,41,16,98,5,67,9,1,121链表B;121,1,55,9,67,5,98,16,41,25,删除元素67后;121,1,55,9,5,98,16,41,25,下面是杨辉三角的代码:#include #include using namespace std;int main()const int n=11;int i,j,ann;for(i=1;in;i+)aii=1;ai1=1;for(i=3;in;i+)for(j=2;j=i-1;j+)aij=ai-1j-1+ai-1j;for(i=1;in;i+)for(j=1;j=i;j+)coutsetw(5)aij ;coutendl;coutendl;return 0;#include #include struct Node int num ; Node *next ;Node* Create() /链表创建 int n=0; Node *p1,*p2,*head; p1=p2=new Node; cinp1-num; head=NULL; while (p1-num!=0) if (n=1) head=p1; else p2-next=p1; p2=p1; p1=new Node; cinp1-num; n+; p2-next=NULL; return head;int ListLength(Node L) /链表的计数 Node p=L; int count=0; while(p-next) count+; p=p-next; return count;int Search(Node &L , int value) /链表的查找Node p=L; int index=0; while(p) if(p-num= value)return index; p=p-next; index+; return 0;void Print(Node *head) /输出链表 Node* p=head; while (p) coutnumnext; coutnext; delete temp; Node *ReverseList(Node *head) /链表逆序(循环方法) Node *p,*q,*r; p=head; /一开始p指向第一个节点 q=p-next; /q指向第二个节点 while (q!=NULL) /如果没到链尾 /以第一次循环为例 r=q-next; /r暂时存储第三个节点 q-next=p; /没执行此句前,q-next指向第三个节点 /执行之后,q-next指向第一个节点p p=q; /之后p指向第二个节点 q=r; /q指向第三个节点 /即.p=q=r.变为 .p=qnext=NULL; /最后原来的链头变为链尾,把它指向NULL。 head=p; /原来的链尾变成链头 return head; Node *ReverseList2(Node *head) /链表逆序(递归方法) if (!head) return NULL; Node *temp = ReverseList2 (head-next); if (!temp) return head; head-next-next = head; head-next = NULL; return temp;递归时,head可以分别用 head ,head1,head2 .headn-1, headn来表示总共n+1个节点temp = ReverseList2( head-next ); 此句的递归一直将参数传进来的。Node* head 递归到 headn 然后判断下列语句:else if( !headn-next ) return headn; 将返回值传给temp,此时temp指向链尾 ,由于在此次返回,故此次没有执行最后的else的那部分的语句,返回上一级即是 headn-1 那一级,继续执行下面的 headn-1-next-next = headn-1; headn-1-next = NULL; /此两句将最后两个逆序连接, return temp; /之后返回temp比上一层的temp即是执行temp = ReverseList2( head-next )赋值,因为递归的口都是在这里的,如果说好理解点也可以将temp来编号同理 在返回temp后,继续执行 headn-2-next-next = headn-2; headn-2-next = NULL; return temp; .一直到 head时 即是原链表的第一个节点,在对其head-next = NULL后,此时以 temp 所指向的节点为链头的逆序链表就形成了./已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序。(循环方法)/(保留所有结点,即便大小相同)Node *Merge(Node *head1 , Node *head2) if ( head1 = NULL) return head2 ; if ( head2 = NULL) return head1 ; if ( head1-num num ) head = head1 ; head1= head1-next; else head = head2 ; head2 = head2-next ; Node *temp = head ; while ( head1 != NULL & head2 != NULL) if ( head1-num num ) temp-next = head1 ; head1 = head1-next ;temp =temp-next; else temp-next = head2; head2 = head2-next ;temp =temp-next; if (head1 = NULL) temp-next = head2; if (head2 = NULL) temp-next = head1; return head;/已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序。(递归方法)Node *MergeRecursive(Node *head1 , Node *head2) if ( head1 = NULL ) return head2 ; if ( head2 = NULL) return head1 ; Node *head = NULL ; if ( head1-num num ) head = head1 ; head-next = MergeRecursive(head1-next,head2); else head = head2 ; head-next = MergeRecursive(head1,head2-next); return head ; 从递归函数的定义不难看出,这个函数定义中递归

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论