• 创建单线性链表的不同表示方法和操作


              创建单线性链表,常见的有头插法、尾插法创建线性链表,常见的操作有:创建链表、查找、删除、添加元素、求逆链等操作。

    这里首先用头插法创建链表:

    //头指针唯一确定一个单链表

      #define MaxSize 15 
       typedef int elem_type ;
       typedef struct linklist
       {
         elem_type data;
         struct linklist *next;
       } Linklist;
       
      //头插入法建立链表:每次将头结点的指针赋值给新结点,然后将新节点赋值给头结点指针
          Linklist *CreateList ()
          {
            Linklist *head,*p;
            head =(Linklist *)malloc(sizeof(Linklist));
    		head->next=NULL;
           // p =(Linklist *)malloc(sizeof(Linklist));
            
    		int i;
    		cout<<"随机产生一个数字:"<<endl;
            for(i=0;i<MaxSize;i++)
            {
              int data;
              data =rand()%100;
    		  p =(Linklist *)malloc(sizeof(Linklist));
    
    		  cout<<"第"<<i<<"个数是"<<data<<endl;
              p->data =data;
              p->next=head->next;
              head->next=p;
            }
           return head;
          }
          //利用头插法创建的链表有什么特点呢?

      这里能够写个查找函数来说明:

         定义一个查找函数:

    //查找(取出第i个数的值)
      elem_type Get_Elem(Linklist *L, int i)      
    {
       int j;
       Linklist *p;
       p=L->next;
       if((i>MaxSize) && (i< 0))
         cout<<"输入有效的i值";
       for(j=0;j<i-1;j++)	
           {
    		   p=p->next;
         	//flag->next++;  //链表不是矩阵。指针自加1不是指向下一个结点,那是矩阵里能够这样。
         	}
       return p->data;
    }
             编译一下:结果例如以下

    //主函数例如以下:

    int main()
    {
      Linklist *Q;
      Q=CreateList();
      int i;
      cout<<"输入想要查找的元素号i=";
      cin>>i;
      int getNum = Get_Elem( Q , i);
      cout<<"第"<<i<<"个元素是"<<getNum<<endl;
    
      //Insert_Elem(Q, 3,5);
      while(1);
      return 0;
    }
        
                 依据执行结果可知道:对于头插法,输入的结点次序和生成的链表次序相反。

           还有能够有:删除元素和增添元素的函数体:

    //删除链表中的某个结点
    void Delete_Linklist(Linklist *L,elem_type i) 
      {
      	Linklist *p,*q;
      	p=L->next;
      	int j=0;
      	if(i<0 && i>MaxSize )
      		cout<<"j输入有效的i值";
      	else
      		{
      			while((p->next != NULL)&&(j<i-1))
      			{
      				p=p->next;  //寻找第i个结点  
      				++j;
      				}
      			 q=p->next;
      			 p->next=q->next;
      			 free(q);
      		}
      }
    
    //加入结点(在第i个节点处加入一个值)
     void Insert_Elem(Linklist *L, int i, elem_type Number)      
    {
       int j;
       Linklist *p,*q;
       p=L->next;
       if((i>MaxSize) && (i< 0))
         cout<<"输入有效的i值";
       for(j=0;j<i-1;j++)	
           {
    		   p=p->next;
         	//flag->next++;  //链表不是矩阵,指针自加1不是指向下一个结点。那是矩阵里能够这样。

    } if(i==j+1) { q=(Linklist *)malloc(sizeof(Linklist)); q->data=Number; q->next=p->next; p->next=q; } // return p; }

           

          问题分析:为什么头插法的数据元素顺序和链表中结点顺序相反?

    循环第一次时:

              p->data =data;          //数据元素第一次赋值
              p->next=head->next;    //循环赋值。第一次将NULL赋给p->next,
              head->next=p;         //第一次赋值后的p赋给head->next;

    循环第二次时:

              p->data =data;         //数据元素第二次赋值
              p->next=head->next;    //循环赋值,第二次将 (第一次赋值后的<span style="font-family: Arial, Helvetica, sans-serif;">head->next</span><span style="font-family: Arial, Helvetica, sans-serif;">)赋给p->next,</span>
              head->next=p;         //第二次赋值后的p赋给head->next;

           所以新赋值进来的结点更靠近head->next.





          

  • 相关阅读:
    简化异步操作(上):使用CCR和AsyncEnumerator简化异步操作
    CentOS 6.3(x32)下安装Oracle 10g R2
    Linux Oracle服务启动&停止脚本与开机自启动
    简化异步操作(上):使用CCR和AsyncEnumerator简化异步操作
    日记 20130202 阴
    2020年8月16日
    2020年8月18日
    2020年8月15日
    2020年8月22日
    2020年8月19日
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/6803439.html
Copyright © 2020-2023  润新知