数据结构之单链表

目录:

内存特点

类型定义

操作实现

实例测试

内存特点

单向链表的内存具有随机性,不连续性,动态性这三个特点,具体来说:

随机性:单向链表首地址即头结点地址随机生成。

不连续性:存储单元之间不连续。

动态性:存储空间动态生成。

类型定义

单向链表的每个结点用结构体定义,包括两部分:数据和指针。数据用来存储该结点的数据,指针next指向下一个结点使链表的所有结点顺序相连。

typedef struct Node
{  
   int date;              //数据
   
    struct Node *next;     //地址

}Node,*linklist;          

操作实现

  • 初始化

申请头节点,将头结点的next指针指向NULL。

void list_init(linklist &L)
{  
   L=(linklist)malloc(sizeof(Node));  //申请空间
   
   if(!L) return;
  
   L->next=NULL;                      //头节点指空
}

  • 判空

判断头节点L是否指空,指空则为空,否则不空。

int list_empty(linklist &L)
{ 
   if(L->next==NULL) return 1;  
   
   else return 0;
}

  • 求长

遍历链表,直至NULL,记录步数。

int list_length(linklist L)
{ int sum=0;
  linklist p=L;
  while(p)            //指空则跳出
  { 
    sum++;
    p=p->next;
  }
  return sum;
}
  • 查找

查找表中e所在的位置,不存在e则返回-1。

遍历链表,同时j自加计数,当表空或搜到e则跳出,表空返回-1,否则返回j。

int list_seek(linklist L,int e)
{  
   int j=1;
 
   linklist p=L;

   while(p)
   {   
      j++;
 
      p=p->next;

      if(p->date==e) break;
   }

   if(!p) return -1;

   else return j;
}

  • 插入

在第i个元素之前插入e。

为e申请一个结点,之后将链表遍历到第i个结点,插入e。

void list_insert(linklist &L,int i,int e)
{  
   linklist p=L;

   linklist l=(linklist)malloc(sizeof(Node));

   l->date=e;

   for(int j=1;j<i-1;j++)
     p=p->next;
    
   l->next=(p->next);

   p->next
}

  • 删除

删除第i个元素。

修改i-1结点的指针使其指向i+1个结点,释放第i个结点。

void list_insert(linklist &L,int i,int e)
{  
   linklist p=L;

   linklist l=(linklist)malloc(sizeof(Node));

   l->date=e;

   for(int j=1;j<i-1;j++)
     p=p->next;
    
   l->next=(p->next);

   p->next
}

  • 尾插建表

顺序向后插入n个元素。

void tail_creat(linklist &L,int n)
{  
   linklist pre=L;

   for(int i=0;i<n;i++)
    { 
      linklist p=(linklist)malloc(sizeof(Node));
     
      cin>>p->date;
      
      pre->next=p;
      
      pre=p;
    }

   pre->next=NULL;       
}

  • 头插建表

逆序向后插入n个元素。

void head_creat(linklist &L,int n)
{
   for(int i=0;i<n;i++)
    {  
       linklist p=(linklist)malloc(sizeof(Node));
       
       cin>>p->date;
       
       p->next=L->next;
       
       L->next=p;
    }
}

实例测试

头插三个元素,尾插三个元素;

判空求长;

取第二个元素;

在第二个元素前插入9;

删除第三个元素;

查找2的位序;

遍历输出;

int main()
{  
   linklist L;
   
   list_init(L);

   tail_creat(L,3);

   head_creat(L,3);

     cout<<list_empty(L);cout<<"\n";
     cout<<list_length(L);cout<<"\n";

     cout<<list_get(L,2);cout<<"\n";

     list_insert(L,2,9);

     list_delete(L,3);

     cout<<list_seek(L,2);cout<<"\n";

   linklist q=L->next;
   while(q)
   { 
     cout<<q->date<<" ";
     q=q->next;
   }
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

亦木不emo

打赏一个吧亲

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

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

打赏作者

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

抵扣说明:

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

余额充值