zoukankan      html  css  js  c++  java
  • 【数据结构上机练习】1.链表的简单操作

    //最后附上改进版


    1
    //============================================================================ 2 // Name : shangji1.cpp 3 // Author : menglei 4 // Version : 5 // Copyright : Your copyright notice 6 // Description : Hello World in C++, Ansi-style 7 //============================================================================ 8 /* 9 1)创建单链表; 10 2)插入操作:分别在当前结点后、表头、表尾插入值为x的结点; 11 3)删除操作:分别删除表头结点、表尾结点和当前结点的后继结点; 12 4)存取操作:分别存取当前结点的值和单链表中第k个结点的值; 13 5)查找操作:查找值为x的元素在单链表中出现的位置(是链表中的第几个元素)。 14 */ 15 #include <iostream> 16 #include<stdio.h> 17 #include<stdlib.h> 18 19 #define len sizeof(struct data) 20 using namespace std; 21 /*定义一个结构体,data */ 22 typedef struct data{ 23 int num; 24 class data *next; 25 }data; 26 27 /*下面定义链表类*/ 28 class mlink{ 29 public : 30 //mlink(); //无参构造函数 31 mlink(int n); //有参构造函数,传入参数n 32 void add(int n); //添加 33 void delHead (void); //删除 34 int find(int n); //查找 35 void print(void)const; 36 void addtail(int n); //add elements at tail 37 38 private: 39 data *head; // 为链结的数据 40 }; 41 void mlink::addtail(int n){ //add at tail 42 data *temp = (data*)malloc (len); 43 data *p; 44 temp->num=n; 45 cout<<"在表尾添加元素:"<<n<<"\n"; 46 if(head==NULL){ 47 head->next=temp; 48 49 50 }else //头非空 51 { 52 p=head->next; 53 while (p->next!=NULL){ //find tail element 54 p=p->next; 55 } 56 p->next=temp; 57 temp->next=NULL; 58 } 59 } 60 void mlink::print(void)const{ //print link 61 data *p = head; 62 while(p!=NULL){ 63 printf("%d",p->num); 64 p = p->next; 65 if(p!=NULL) 66 printf("->"); 67 } 68 printf("\n"); 69 } 70 void mlink::add(int n){ //add at head 71 data *temp =(data*) malloc(len); //申请空间 72 /*在头结点后加入结点*/ 73 if(head==NULL){ 74 printf("链表为空,只有表头\n"); 75 temp->num = n ; //赋值 76 head->next = temp; 77 temp->next=NULL; 78 } 79 else // 链表非空 80 { 81 data *p1; 82 printf("链表非空,在表头添加结点:%d\n",n); 83 temp->num= n; 84 p1=head; 85 head=temp; 86 temp->next=p1; 87 } 88 } 89 void mlink::delHead(void){ //删除 90 //删除头结点 91 data *p,*q; 92 p=head->next; 93 q=head; 94 head=p; 95 q->next=NULL; 96 free(q); 97 printf("头元素删除成功!\n"); 98 } 99 int mlink::find(int n){ //元素n存在于链表中则返回位置 100 data *p = head; 101 int count = 1; 102 while(p!=NULL){ 103 if(p->num==n) 104 return count; 105 else 106 { 107 p=p->next; 108 count++; 109 } 110 } 111 return 0; 112 } 113 mlink::mlink(int n){ 114 data *first =(data*) malloc(len); //申请空间 115 head=first; //****************important********** 116 cout<<"创建链表:\n"; 117 first->num=n; //把n传入 118 first->next=NULL; 119 } 120 121 122 123 //===================main==================== 124 int main() { 125 126 mlink m1(342); //创建链表对象 127 m1.print(); 128 m1.add(32); 129 m1.print(); 130 m1.addtail(56); 131 m1.print(); 132 m1.add(33); 133 m1.print(); 134 int n = m1.find(342); 135 printf("\"342\"元素的位置为%d\n",n); 136 137 m1.delHead(); 138 m1.print(); 139 m1.delHead(); 140 m1.print(); 141 142 143 144 return 0; 145 } 146

    运行结果:

    改进版:

    //============================================================================
       // Name        : shangji1.cpp
       // Author      : menglei
       // Version     :
       // Copyright   : Your copyright notice
       // Description : Hello World in C++, Ansi-style
       //============================================================================
       /*
       1)创建单链表;
       2)插入操作:分别在当前结点后、表头、表尾插入值为x的结点;
       3)删除操作:分别删除表头结点、表尾结点和当前结点的后继结点;
       4)存取操作:分别存取当前结点的值和单链表中第k个结点的值;
       5)查找操作:查找值为x的元素在单链表中出现的位置(是链表中的第几个元素)。
       */
       #include <iostream>
       #include<stdio.h>
       #include<stdlib.h>
     
       #define len sizeof(struct data)
       using namespace std;
       /*定义一个结构体,data  */
       typedef struct data{
           int num;
           class data *next;
       }data;
     
       /*下面定义链表类*/
       class mlink{
       public :
           //mlink();    //无参构造函数
           mlink(int n);    //有参构造函数,传入参数n
           void add(int n);  //添加
           void delHead (void);  //删除
           int  find(int n);   //查找
           void print(void)const;
           void addtail(int n);   //add elements at tail
     
           int findValue(int pos){   //查找指定位置的元素
         	  data *p;
         	  p = head;
         	  int count=1;
         	  if(pos<=0)
         	  {
         		  cout<<"不存在的位置\n";
         		  return 0;
         	  }
         	  while(p!=NULL){
         		  if(count == pos)
         			  return p->num;
         		  p = p->next;
         		  count ++;
         	  }
           }
     
     
       private:
           data *head;   //   为链结的数据
       };
       void mlink::addtail(int n){   //add at tail
           data *temp = (data*)malloc (len);
           data *p;
           temp->num=n;
           cout<<"【添加】在表尾添加元素:"<<n<<"\n";
           if(head==NULL){
               head->next=temp;
     
     
           }else  //头非空
           {
               p=head->next;
               while (p->next!=NULL){  //find tail element
                   p=p->next;
               }
               p->next=temp;
               temp->next=NULL;
           }
       }
       void mlink::print(void)const{    //print link
           data *p = head;
           while(p!=NULL){
               printf("%d",p->num);
               p = p->next;
               if(p!=NULL)
                   printf("->");
           }
           printf("\n");
       }
       void mlink::add(int n){          //add at head
           data *temp =(data*) malloc(len);   //申请空间
           /*在头结点后加入结点*/
           if(head==NULL){
               printf("链表为空,只有表头\n");
               temp->num = n ;   //赋值
               head->next = temp;
               temp->next=NULL;
           }
           else   // 链表非空
           {
               data *p1;
               printf("【添加】链表非空,在表头添加结点:%d\n",n);
               temp->num= n;
               p1=head;
               head=temp;
               temp->next=p1;
           }
       }
       void mlink::delHead(void){   //删除
           //删除头结点
           data *p,*q;
           p=head->next;
           q=head;
           head=p;
           q->next=NULL;
           free(q);
           printf("【删除】头元素删除成功!\n");
       }
       int  mlink::find(int n){  //元素n存在于链表中则返回位置
           data *p = head;
           int count = 1;
           while(p!=NULL){
               if(p->num==n)
                   return count;
               else
               {
                   p=p->next;
                   count++;
               }
           }
           return 0;
       }
       mlink::mlink(int n){
           data *first =(data*) malloc(len);   //申请空间
           head=first;  //****************important**********
           cout<<"【创建】创建链表:\n";
           first->num=n;    //把n传入
           first->next=NULL;
       }
     
     
     
       //===================main====================
       int main() {
     
           mlink m1(342);   //创建链表对象
           m1.print();
           m1.add(32);//在表头添加元素
           m1.print();
           m1.addtail(56);// 在表尾部添加元素
           m1.print();
           m1.add(33);
           m1.print();
           cout<<"【查找位置】第二个链结的元素为:"<<m1.findValue(2)<<endl;
     
           int n = m1.find(342);    //查找元素342的位置
           printf("【查找元素】\"342\"元素的位置为%d\n",n);
     
           m1.delHead();//删除头元素
           m1.print();
           m1.delHead();
           m1.print();
     
     
     
           return 0;
       }
     
    

      运行结果:

    转载文章请注明出处: http://www.cnblogs.com/menglei/
  • 相关阅读:
    day 7-5 守护线程
    小练习:思考下述代码的执行结果有可能是哪些情况?为什么?
    深浅copy详解
    练习题,使用多线程编写一个简单的文本处理工具
    harbor搭建v1.8.3
    mysql常用命令
    windows安装MySQL
    centos用户和用户组的管理及简单操作
    CentOS 7下安装谷歌浏览器
    typecho管理员修改密码
  • 原文地址:https://www.cnblogs.com/menglei/p/2728007.html
Copyright © 2011-2022 走看看