最新消息:XAMPP默认安装之后是很不安全的,我们只需要点击左方菜单的 "安全"选项,按照向导操作即可完成安全设置。

C语言|单链表

XAMPP相关 admin 39浏览 0评论

使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。这篇推文主要介绍单链表的相关知识,需要有一定的理论基础。

#include "stdio.h"
#include "stdlib.h"

typedef unsigned char uint8_t;
typedef unsigned int uint16_t;

//创建节点(结构体)
struct Linked
{
  int data;            //数据域
  //因为指向的是结构体,所以定义了一个结构体指针
  struct Linked *next; //指针域(指向下一节点的指针)
}; 

//创建链表 
struct Linked *Found(uint8_t num)
{
  printf("请输入%d个数据\n",num);
  //局部变量 
  uint8_t i = 0;
  //定义头节点,普通节点,尾部节点
  struct Linked *head, *node, *end;
  //创建头节点 
  head = (struct Linked*)malloc(sizeof(struct Linked));
  //空链表头尾节点一致
  end = head;
  //新增节点 
  for ( i=0; i<num; i++ ) 
  {
    //创建普通节点 
    node = (struct Linked*)malloc(sizeof(struct Linked));
    //输入数据 
    scanf("%d",&node->data);
    //链接普通节点 
    end->next = node;
    //更新尾节点 
    end = node;
  }
  //结束创建
  end->next = NULL;
  //返回头节点  
  return head;
}

//打印链表
void DirData( struct Linked *pHead )
{
  //节点缓存 
  struct Linked *pTemp = pHead;
  //指向第一个数据 
  pTemp = pTemp->next;
  while( pTemp != NULL )
  {
    printf("%d\n",pTemp->data);
    //更新节点 
    pTemp = pTemp->next;
  }
}

//打印特定链表值 
void DirSelectData( struct Linked *pHead,uint8_t select)
{
  //节点缓存 
  struct Linked *pTemp = pHead;
  //局部变量 
  uint8_t i = 0;
  //扫描数据 
  while( i < select && pTemp != NULL)
  {
    pTemp = pTemp->next;
    i++;
  }
  if( pTemp != NULL )
  {
    printf("您获取的数据为\n");
    printf("%d\n",pTemp->data);
  }
  else
  {
    printf("节点不存在\n");
  }
}

//在特定位置添加节点 
void AddSelectData( struct Linked *pHead,uint8_t select)
{
  //节点缓存 
  struct Linked *pTemp = pHead;
  //定义新节点缓存 
  struct Linked *pNode;
  //局部变量 
  uint8_t i = 0;
  //扫描数据 
  while( i < select-1 && pTemp != NULL)
  {
    pTemp = pTemp->next;
    i++;
  }
  if( pTemp != NULL )
  {
    //创建普通节点 
    pNode = (struct Linked*)malloc(sizeof(struct Linked));
    printf("请输入数据\n");
    scanf("%d",&pNode->data);
    /*注意下面两句语句循序*/
    //pTemp节点的下一节点链接到新节点的下一节点 
    pNode->next = pTemp->next;
    //将新节点链接到pTemp节点的下一节点 
    pTemp->next = pNode;
  }
  else
  {
    printf("节点不存在\n");
  }
}

//在特定位置删除节点 
void DelSelectData( struct Linked *pHead,uint8_t select)
{
  //节点缓存 
  struct Linked *pTemp = pHead;
  struct Linked *pSaver;
  //局部变量 
  uint8_t i = 0;
  //扫描数据 
  while( i < select && pTemp != NULL)
  {
    //保持节点 
    pSaver = pTemp;
    //更新节点 
    pTemp = pTemp->next;
    i++;
  }
  if( pTemp != NULL )
  {
    //注意pSaver是pTemp的上一个节点 
    pSaver->next = pTemp->next;
    //释放普通节点 
    free( pTemp );
  }
  else
  {
    printf("节点不存在\n");
  }
}

void main(void)
{
  struct Linked *phead = NULL;
  phead = Found(5);
  printf("扫描数据 \n");
  DirData( phead );
  DirSelectData( phead, 1 );
  AddSelectData( phead, 1 );
  printf("扫描数据 \n");
  DirData( phead );
  DelSelectData( phead, 1 );
  printf("扫描数据 \n");
  DirData( phead );

–END–

 

转载请注明:XAMPP中文组官网 » C语言|单链表