数据结构--链表

本文介绍了线性表的概念,强调了线性表中数据元素一对一的关系,并详细阐述了链表的ADT(抽象数据类型),包括初始化、插入、删除、查找、获取长度和排序等基本操作。链表作为一种重要的数据结构,对于理解和实现各种算法至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.定义

线性表是具有零个或多个数据元素的有限序列。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。

线性表的基本特征:

  • 第一个数据元素没有前驱元素;
  • 最后一个数据元素没有后继元素;
  • 其余每个数据元素只有一个前驱元素和一个后继元素。

ADT 线性表(ScqucncoList)
Data
   1、线性表数据元素是一个集合{a_1,a_2,a_3...a_n},数据元素类型DataType(int、char、自定义)
   2、前驱:除了第一个元素a_1(头结点)外,每个元素有且只有一个前驱
   3、后继:除了最后一个元素a_n(尾节点)外,每个元素有且只有一个后继元素
   4、每个数据元素之间的关系是一一对应的关系
Operation
   初始化 initList(*List)   创建一个空的线性表 
   插入  InsertElement(*List,inder(插入到哪里),elem(插入什么元素)):在List的inder下标下插入elem元素
   删除  DeleteElement(*List,inder,*elem(删除元素的地址)):删除线性表List中第inder个元素,并返回删除指针e
   查找  ExsitElement(*List,elem)    在List中查找是否存在元素elem,是的话返回元素下标,否的话返回-1
   获取  GetElement(*List,i,*elem): 将第i个元素的值返回个给elem
   获取长度 GetLenght(*List)
   返回boot值 IsElement(*List) :若线性表为空,返回False;不为空,返回True 

   清空 ClearElement(*List)

   排序SelectSort(List &L)

二.具体操作

1.初始化

initList(*List)
struct  ListNode
{
     int  val ;
     ListNode  * next ;
     ListNode ( int  x ) : val ( x ) , next ( nullptr ) { }
} ;

2.插入

void InsertElement ( ListNode  * head , int  pos , int  data )  
{
      ListNode  * newNode = new  ListNode ( data ) ;
      ListNode  * p = head ;
      int  index = 1 ;
      while ( p != nullptr && index < pos )
      {
          p = p -> next ;
          ++ index ;
      }
      newNode -> next = p -> next ;
      p -> next = newNode ;
      return  head ;
}

3.删除--后边完善


void DeleteElement ( ListNode  * head , int  pos )
{
         ListNode  * p = head ;
         if ( p -> next == nullptr )   
         {
               cout << "链表为空" << endl ;
              return  nullptr ;
         }
         ListNode  * node = nullptr ;
         int  index = 1 ;
         while ( p != nullptr && index < pos )
         {
              p = p -> next ;
              ++ index ;
         }
         if ( p != nullptr && p -> next != nullptr )  
         {
         node = p -> next ;
         p -> next = node -> next ;
         delete  node ;
         }
         return  head ;

}

4.查找(查找第i个)

 void ExsitElement ( ListNode  * head , int  pos ) 
{
     if ( head -> next == nullptr || pos < 0 )
         return  nullptr ;
     if ( pos == 0 )
         return  head ;
     ListNode  * p = head -> next ;
     while ( -- pos )
     {
         p = p -> next ;
         if ( p == nullptr )
         {
              cout << "incorrect postion to search node!" << endl ;
              break ;
         }
     }
     return  p ;
}

5.查长

int  GetLenght ( ListNode  * head )   
{
     int  len = 0 ;
     ListNode  * p = head -> next ;
     while ( p != nullptr )
     {
         ++ len ;
         p = p -> next ;
        
     }
     return  len ;
}

6.排序

void SelectSort(List &L)
{
	int min;int temp;
	for(int i=0;i<L.length;i++)
	{
		min=i;
		for(int j=i+1;j<L.length;j++)
		{
			if(L.data[j]<L.data[min])min=j;
		}			
		if(min!=i)
		{
			temp=L.data[min];
			L.data[min]=L.data[i];
			L.data[i]=temp;
		}
	}
	PrintList(L);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值