C++第2周(春)项目6 动态链表初体验(一)

2014-11-24 10:25:48 · 作者: · 浏览: 3

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759


  本文是为大一刚学习程序设计语言的同学体验动态链表设计的一组练习。动态链表用途广泛,必须重视,在学习数据结构及算法之前能有所体验,意义重大。

  不要被貌似复杂的指针操作迷惑,这正是专业学生应该具备的思维基本功。涉及到链接如何建立的操作,在纸上画一画,想一想,道理就通了。

  作为需要用脑作的实践,由画一画的形象思维,会形成头脑中不用画也很清楚的逻辑思维,这正是能力提高的一个必经的过程。

  做不出来,就多看几遍。做出来了,其间的不顺一扫而光,其乐无穷。

  下面是正题:

  下面是一个建立动态链表的程序。阅读程序,在草稿纸上画出链表建立的过程,借此学会如何建立链表。然后改造程序,完成项目6的要求

#include  
  
   
using namespace std;
struct Node
{
    int data;            //结点的数据
    struct Node *next;  //指向下一结点
};
Node *head=NULL;    //将链表头定义为全局变量,以便于后面操作
void make_list();   //建立链表
void out_list();    //输出链表
  
int main( )
{
    make_list();
    out_list();
    return 0;
}
void make_list()
{
    int n;
    Node *p;
    cout<<"输入若干正数(以0或一个负数结束)建立链表:"
    cin>>n;
    while(n>0)   //输入若干正数建立链表,输入非正数时,建立过程结束
    {
        p=new Node;  //新建结点
        p->data=n;   
        p->next=head;  //新建的结点指向原先的链表头
        head=p;    //链表头赋值为新建的节点,这样,新结点总是链表头
        cin>>n;    //输入下一个数,准备建立下一个结点
    }
    return;
}
void out_list()
{
    Node *p=head;
    cout<<"链表中的数据为:"<
   
    data<<" "; p=p->next; } cout<
    
     
IDCjrL2owaK1xMG0se3OqqO6PC9wPjxwPqGhoaGhoaGhoaE8aW1nIHNyYz0="https://www.cppentry.com/upload_files/article/49/1_8wblc__.jpg" alt="\" />

----参考解答----< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD48cD48L3A+PHByZSBjbGFzcz0="brush:java;">#include #include using namespace std; struct Node { int data; struct Node *next; }; Node *head=NULL; void make_list2(); //新结点始终在链表尾部 void out_list(); int main( ) { freopen("input.txt","r",stdin); make_list2(); out_list(); return 0; } void make_list2() { int n; Node *p,*q; //p用于指向新建立的结点, q指向链表尾部 cout<<"输入若干正数(以0或一个负数结束)建立链表:"< >n; while(n>0) { p=new Node; p->data=n; p->next=NULL; if(head==NULL) head=p; else q->next=p; q=p; cin>>n; } return; } //输出所有的节点 void out_list() { Node *p=head; cout<<"链表中的数据为:"< data<<" "; p=p->next; } cout<
  (2)编写函数void search(int x),输出链表中是否有值为x的结点。

----参考解答----

#include 
      
       
#include 
       
         using namespace std; struct Node { int data; struct Node *next; }; Node *head=NULL; void make_list2(); //新结点始终在链表尾部 void out_list(); void search(int x); //查找是否有值为x的结点 int main( ) { int x; freopen("input.txt","r",stdin);//调试中用重定向方便 make_list2(); out_list(); cin>>x; //测试中输入一个链表中有的数字 search(x); cin>>x; //测试中输入一个链表中没有的数字 search(x); return 0; } void make_list2() { int n; Node *p,*q; //p用于指向新建立的结点, q指向链表尾部 cout<<"输入若干正数(以0或一个负数结束)建立链表:"<
        
         >n; while(n>0) { p=new Node; p->data=n; p->next=NULL; if(head==NULL) head=p; else q->next=p; q=p; cin>>n; } return; } //输出所有的节点 void out_list() { Node *p=head; cout<<"链表中的数据为:"<
         
          data<<" "; p=p->next; } cout<
          
           data!=x) { p=p->next; } if(p!=NULL) //退出上一层循环一定是因为p->data==x cout<<"在链表中有值为"<
           
            
  (3)编写函数delete_first_node(),删除链表中的第一个结点。

----参考解答----

#include 
             
              
#include 
              
                using namespace std; struct Node { int data; struct Node *next; }; Node *head=NULL; void make_list2(); //新结点始终在链表尾部 void out_list(); void delete_first_node(); //删除第一个结点 int main( ) { freopen("input.txt","r",stdin);//调试中用重定向方便 make_list2(); out_list(); delete_first_node(); out_list(); return 0; } void make_list2() { int n; Node *p,*q; //p用于指向新建立的结点, q指向链表尾部 cout<<"输入若干正数(以0或一个负数结束)建立链表:"<
               
                >n; while(n>0) { p=new Node; p->data=n; p->next=NULL; if(head==NULL) head=p; else q->next=p; q=p; cin>>n; } return; } //输出所有的节点 void out_list() { Node *p=head; cout<<"链表中的数据为:"<
                
                 data<<" "; p=p->next; } cout<
                 
                  next; delete p; cout<<"删除了首结点."<
                  
                   
  (4)编写函数delete_node(int x),删除结点值为x的结点。

----参考解答----

#include 
                    
                     
#include 
                     
                       using namespace std; struct Node { int data; struct Node *next; }; Node *head=NULL; void make_list2(); //新结点始终在链表尾部 void out_list(); void delete_node(int x); //删除第一个结点 int main( ) { freopen("input.txt","r",stdin);//调试中用重定向方便 make_list2(); out_list(); delete_node(3); out_list(); return 0; } void make_list2() { int n; Node *p,*q; //p用于指向新建立的结点, q指向链表尾部 cout<<"输入若干正数(以0或一个负数结束)建立链表:"<
                      
                       >n; while(n>0) { p=new Node; p->data=n; p->next=NULL; if(head==NULL) head=p; else q->next=p