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

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

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

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

  #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.





      

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烧技湾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值