C语言-链表

目录

1 基本原理

2 链表的基本操作

2.1节点构造

2.2 建立链表头

2.3 建立链表并输入数据

2.4 在链表头插入节点

2.5 在链表尾插入节点

2.6 链表排序-值交换

2.7 删除节点

2.8 释放链表

2.9 输出链表


1 基本原理

       链表是一种物理存储单元上非连续、非顺序的存储结构数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。

                                                                                 节点的构造:

                                                                         

                                                                      链表的构造:

                                   

2 链表的基本操作

2.1节点构造

typedef struct Ifodat //数据节点
{
  int data;
  char status;
}Ifodat;

typedef struct Info_Node
{
  Ifodat DAT;
  struct Info_Node *Next;
}Info_NODE;

2.2 建立链表头

Info_NODE *Create_Head()
{
  Info_NODE *Phead= (Info_NODE*)malloc(sizeof(Info_NODE));
  if(Phead == NULL)
    printf("Creat Phead fail\r\n");
  return Phead;
}

2.3 建立链表并输入数据

/**创建链表
 *
 */
Info_NODE *Create_List(Info_NODE *phead)
{
    int len;
    int i;
    Info_NODE *P1 = (Info_NODE*)malloc(sizeof(Info_NODE));
    Info_NODE *P2;
    P1 = phead;
    printf("Input lenght number:");
    scanf("%d",&len);

  for(i=0;i<len;i++)
  {
    P2 = (Info_NODE*)malloc(sizeof(Info_NODE));
    printf("Input %d number:",i+1);
    scanf("%d",&P2->DAT.data);
    P2->Next = NULL;
    P1->Next =P2 ;
    P1 = P1->Next;
  }
}

2.4 在链表头插入节点

/**插入节点到链表头部
 *
 */
List_insert_head(Info_NODE *head,Info_NODE *date_node)
{
    Info_NODE *P1;
    P1 = head->Next;
    head->Next = date_node;
    date_node->Next = P1;
}

2.5 在链表尾插入节点

/**插入节点到链表尾部
 *
 */
void List_insert_end(Info_NODE *head,Info_NODE *date_node)
{
  Info_NODE *P = head;
  while(P->Next!=NULL)
  {
      P = P->Next;
  }
  P->Next =date_node;
  date_node->Next = NULL;
}

2.6 链表排序-值交换

/**链表排序
 * 值交换 选择排序
 */
 void Sort_List(Info_NODE *head)
  {
     Info_NODE *p, *q;
     for (p = head->Next; p != NULL; p = p->Next)
         for (q = p->Next; q != NULL; q = q->Next)
             if (p->DAT.data > q->DAT.data)
             {
                 int t1 = p->DAT.data; p->DAT.data = q->DAT.data; q->DAT.data = t1;
            }
 }

2.7 删除节点

/**删除某个节点
 *
 */
void delete_List(Info_NODE *head,Ifodat ifo)
 {
     Info_NODE *p,*last;
     p = head->Next;
     last = head;
     while(p->DAT.data!=ifo.data)
     {
        last = p;
        p = p->Next;
     }
     last->Next = p->Next;
     free(p);
 }

2.8 释放链表

void Free_List(Info_NODE  *Head)
{
    Info_NODE *Pointer=NULL;
    while (NULL != Head)
    {
        Pointer = Head;
        Head = Head->Next;  // 下一个节点
        free(Pointer);
    }
}

2.9 输出链表

/**顺序输出链表
 *
 */
void Print_List(Info_NODE *head)
{
   Info_NODE *P1 = head;
   int i=1;
   while(P1->Next!= NULL)
   {
       P1 =  P1->Next;
       printf("The %d number:%d\r\n",i,P1->DAT.data);
       i++;
       //P1 =  P1->Next;
   }
}

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值