【单链表创建、查找,打印,删除等操作】

第一次写,大一,主要是当做笔记了,也经常在csdn上学习 也希望能到有需要的人吧。

也看了很多链表方面的知识和代码了  自己尝试写了一下。

 

 

#include<stdio.h>

#include<malloc.h>

#include<stdlib.h>

#include<string.h>

 typedef struct Node

 {

  int data ;

  struct Node *next;

 }Node, *Linklist;

 /*创建链表*/

 Linklist Create_Linklist(int n,int a[])

 {

  Linklist head=(Linklist)malloc(sizeof(Node));//头节点

  if (head == NULL)

  {

   printf("申请空间失败");

  }

  else {

   head->next = NULL;//头节点指针域置空,因为链表结束就是最后一个节点的指针域为空,所以头节点指针域置空就和非空表统一起来了

   Linklist p = head;//头指针指向头节点

//head是头结点指针,也就是头结点的地址,头指针指向头结点,也就是头指针保存了头结点的地址。

很明显看到p等于head,那为什么不直接用head呢?

下面你会发现,创建链表时你会发现p一直指向新创建的节点,也就是表尾,而我们的表头位置需要记录下来,所以就让p等于head,head记录表头位置,p做工作指针,随着链表的创建一直在移动 然后返回表头。

   Linklist node;//节点指针

   if (n > 0)

   {

    for (int i = 1; i <= n; i++)

    {

     node = (Linklist)malloc(sizeof(Node));

     if (node)

     {

 

 

      node->data = a[i - 1];

      p->next = node;

      p = node;

     }

     else

     {

      printf("申请空间失败");

     }

    }

   }

   p->next = NULL;//前面说过链表的结束是最后一个节点指针域为空,所以这里不要忘了把最后一个节点指针域置空。

 

   return(head);//返回头结点,也就是我们前面记录的表头位置

  }

 }

 /*打印链表*/

 void Print_Linklist(Linklist L)

 {

  Linklist head = L;

    if(head==NULL||head->next==NULL)//头指针为空或头指针所指节点的下一个地址为空,即首元节点为空,也就是说,链表不存在或链表为空

 {

  printf("链表为空");

 }

 else

 {

  while (head->next)

  {

   printf("链表元素为%d ", head->next->data);

   head = head->next;

  }

  printf(" ");

 }

 }

 /*查找元素--按照位置*/

 /*查找第i个元素*/

 void Search_elem_location(Linklist L, int i)

 {

  Linklist head = L;

  if(head==NULL||head->next==NULL)

  {

   printf("链表为空");

  }

  else

  {

   for (int j = 1; j <= i; j++)

   {

    head = head->next;

   }

   printf("该元素为:%d", head->data);

   printf(" ");

  }

 }

/*这个函数好像没什么意义,当时随手写的我也忘了对错了……尴尬*/

// /*查找元素--按照数值*/

// /*查找特定数值的元素,并返回位置*/

// void Search_elem_data(Linklist L,int elem,int l)

// {

// Linklist head = L;

 

// if(head==NULL||head->next==NULL)

// {

// printf("链表为空");

// }

// while(head->next)

// {

//

// head=head->next;

// if(head->next->data!=elem)

// {

// printf("找到了该元素,该元素是第%d个",l);

// }

//

// }

// printf("没有该元素");

// }

 /*修改数据*/

 /*修改链表上第i个位置的数据*/

 void Replace_Linklist(Linklist L,int i,int elem)

 {

  Linklist head = L;

  for(int j=1;j<=i;j++)

  {

   head=head->next;

  }

  head->data=elem;

 }

 /*删除数据*/

 void Delete_Linklist(Linklist L,int i)

 {

  Linklist head = L;

    if(head==NULL||head->next==NULL)

 {

  printf("链表为空");

 }

 else

 {

     for(int j=1;j<=i;j++)

     {

     head=head->next;

     }

 }

 free(head);

 }

 /*销毁链表*/

 void Destroy_Linklist(Linklist *head)

 {

  Linklist p=*head,q;

    if(p==NULL||p->next==NULL)

 {

  printf("链表为空");

 }

 while(p)

 {

  q=p->next;

  free(p);

  p=q;

 }

 }

 int main()

 {

  int a[5]={1,2,3,4,5};

  Linklist L=Create_Linklist(5,a);

     Print_Linklist(L);

  Search_elem_location(L,4);

  Replace_Linklist(L,3,6);

  Print_Linklist(L);

  Destroy_Linklist(&L);

 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值