单-双链表的基本操作

单链表 要求:

1)建立一张单链表,数据为11,12,13,14,15 ;

2)打印单链表中的数据

3)查找第3个数据结点的数据并打印 

4)在第5个数据结点后插入数据为16的结点,并打印单链表中的数据

5)删除第1个数据结点,并打印单链表中的数据

双链表 要求:

1)建立一张双向链表,数据为1,2,3,4,5 ;

2)打印双向链表中的数据

3)查找第3个数据结点的数据并打印 

4)在第5个数据结点后插入数据为6的结点,并打印链表中的数据

5)删除第1个数据结点,并打印链表中的数据

/*
双链表的基础操作 
  要求:1)建立一张单链表,数据为1,2,3,4,5 ;
  2)打印单链表中的数据
  3)查找第3个数据结点的数据并打印 
  4)在第5个数据结点后插入数据为6的结点,并打印单链表中的数据
  5)删除第1个数据结点,并打印单链表中的数据
*/ 

#include<stdio.h> 
#include<malloc.h>

//双链表结构体类型 
typedef struct Node{ 
    int data;   
    struct Node *next;
    struct Node *prior; 
} LinkList; 
//1.双链表建立,包含n个数据结点——1)头插法 
LinkList *CreatList_H(int n)
{   
  //1、创建头指针head,将其next置为NULL
  LinkList *head,*s;
  head = (LinkList*)malloc(sizeof(LinkList));
  head->next = NULL;
  //4、反复执行2、3,完成若干结点的插入。
  int i;
  for( i=1;i<=n;i++)
  {
       //2、生成新结点,s指向它
      s = (LinkList*)malloc(sizeof(LinkList));
      scanf("%d",&s->data);
       
      //3、头结点后插入新结点。
      s->next = head->next;
      head->next= s;
  }
  return head; 
}
//1.双链表建立,包含n个数据结点——2)尾插法 
LinkList * CreatList_T(int n)
{
  //1、创建头结点,并设为尾结点p。
  LinkList *head,*p,*s;
  head = (LinkList*)malloc(sizeof(LinkList));
  p=head;
  //5、反复执行2 3 4,完成若干结点的插入,将尾结点next置为NULL。
  int i;
  for( i=1;i<=n;i++)
  {
      //2、生成新结点,s指向它。
      s = (LinkList*)malloc(sizeof(LinkList));
      scanf("%d",&s->data);
      //3、尾结点去链接新结点。
      s->prior=p;
      p->next=s;
      //4、新结点设置成尾结点。
      p=s;
  }
  p->next=head->prior=NULL;
  return head;
}
//2.打印 head所指向的单链表中的元素 
void Display(LinkList *head) 
{
     LinkList *p=head->next;
     while(p!=NULL){
         printf("%d ",p->data);
         p=p->next;
     } 
     printf("\n");
     
}
//3.查找--1)按序号查找
LinkList  *FindKth( int K, LinkList *head )
{
    if(K<1) return NULL;
    LinkList *p=head->next;
    int i=1;
    while(p!=NULL&&i<K)
    {
        p=p->next;
        i++;
    }
    if(i==K) return p;
    else return NULL;
}
//3.查找--2)按值查找
LinkList *Find( int X, LinkList *head)
{
    LinkList *p=head->next;
 
    while(p!=NULL&&p->data!=X)
    {
        p=p->next;         
    }
    return p; 
}

//4.在链表的第 i-1(1≤i≤n+1)个数据结点后插入一个值为X的新结点(即在插入新结点为第i个数据结点) 
LinkList *Insert( int X, int i, LinkList *head )
{        
  LinkList *p,*s;   
  if(i<1) return NULL;
  //1、先找第 i-1个结点,若不存在返回NULL,若存在用p指向;
  p=head;
  int j=0;
  while(p!=NULL&&j<i-1)
  {
      p=p->next;
    j++;
  }
  if(p==NULL) return NULL;
  
 //2、再构造一个新结点,用s指向;
  s = (LinkList*)malloc(sizeof(LinkList));
  s->data=X;
 
 //3、修改指针,插入结点 (s的下一个结点是p的下一个, p的下一个结点是插入新结点 s)
  s->next = p->next;
  s->prior = p;
  if(p->next!=NULL){
      p->next->prior=s;
  }
  p->next = s; 
  return head;
        
}

//4.删除链表的第 i (1≤i≤n)个位置上的数据结点
LinkList *Delete( int  i, LinkList *head )
{    
  LinkList *p,*s;   
  if(i<1) return NULL;
  //1、先找第 i-1个结点,若不存在返回NULL,若存在用p指向;
  p=head;
  int j=0;
  while(p!=NULL&&j<i-1)
  {
      p=p->next;
    j++;
  }
  if(p==NULL) return NULL;
  //2、再找第i个结点,若不存在返回NULL,若存在用s指向要被删除的结点;
  s=p->next;
  if(s==NULL) return NULL;  
  //3、然后修改指针,删除s所指结点;( p的下一个结点变成s的下一个结点)
  p->next=s->next;
  //4、释放s所指结点的空间。
  if(s->next!=NULL){
      s->next->prior=p;
  }  
  free(s);
  return head;

}


//1 2 3 4 5
int main()
{
    //LinkList *L=CreatList_H(5);
    LinkList *L=CreatList_T(5);
    printf("初始链表的数据为:\n");
    Display(L);
    LinkList *d3=FindKth( 3, L);
    printf("第3个数据结点数据值为:%d\n",d3->data);
    L=Insert( 6, 6, L);
    printf("插入6后链表的数据为:\n");
    Display(L);
    Delete(1, L); 
    printf("删除第一个结点后链表的数据为:\n");
    Display(L);
}
 

  • 23
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值