【C语言】链表-创建插入删除输出

【C语言】链表

下面这串代码主要解决链表的结构创建、特定位置插入、特定位置删除、输出,这四个功能

这串代码的详细解析请看我今天写的这一篇,相信我,
看了部分(二)你不可能不会链表
[https://blog.csdn.net/tianty1121/article/details/107119193/]

代码来源:于MOOC北京理工大学公开课。

#include<stdio.h>
#include<stdlib.h>
struct  node
{  char name[20],address[20],phone[15];
    struct node  * link;       /*定义node型结构指针 */
};                               /* 定义结构 */
typedef node NODE;       /* 定义结点类型 */

main() 
{
    NODE * head ;
    NODE * p;
    p = ( NODE * ) malloc ( sizeof (NODE) ) ;  /* 开辟新存储区,申请表头节点 */
    p->link = NULL;    /* 将表头节点的link置为NULL*/
    head = p;
    int create ( NODE * head , int n );
    create ( head , 2 );
    int insert_node ( NODE * head , NODE * p , int i );
     
    p = ( NODE * ) malloc ( sizeof (NODE) ) ; 
    gets(p->name);
    insert_node(head, p, 1);
 
     
    int output ( NODE * head );
    output(head);
     
    int delete_node ( NODE * head , int i );
    delete_node(head,2);
 
    output(head);
 
    getchar();
}
 
int create ( NODE * head , int n )
{   NODE * p;
    for ( ;  n>0 ;  n-- )
    { p = ( NODE * ) malloc ( sizeof(NODE)) ;
      gets ( p->name);
      p->link = head->link;   
      head->link = p;
    }
    return 0;
}
 
int output ( NODE * head )
{ 
    NODE * p;
    p = head->link;             /* p 指向第一个数据节点 */
    while ( p!=NULL )
    {   puts (  p->name ) ;   /* 输出 p 所指向节点的数据 */
        p = p->link ;     /* p 指向下一个数据节点 */
    }
    return 0;
}
 
int insert_node ( NODE * head , NODE * p , int i )
{ 
    NODE * q;
      int n=0;
      for ( q = head;  n<i && q->link!=NULL; ++n )
        q = q->link;   /* ① 定位 */
      p->link = q->link;    /* ② 链接后面指针 */
      q->link = p;       /* ③ 链接前面指针 */
    return 0;
}
 
int delete_node ( NODE * head , int i )
{
    NODE * q, * p;
   int n;
    for ( n=0, q = head;  n<i-1 && q->link!=NULL; ++n )
       q = q->link;                /* ① 定位 */
    if  ( i>0 && q->link != NULL )   
    { 
        p = q->link;             /* p 指向被删除节点 */
        q->link = p->link;  /* ② 摘链 */
       free ( p );      /* ③ 释放 p节点 */
    }
}

另外这个是约瑟夫问题的代码,也来源于MOOC,大家可以看一下。看懂了我上面的文章就不可能看不懂下面这串代码。这些都是理解更复杂问题的基础。

#include<stdio.h>/*约瑟夫问题*/
#include<stdlib.h> 
struct node {
        int no;
        struct node * next;
    };
 
main( )
{   int i, k;  struct node *head, *p, *q;
    head = (struct node *)malloc(sizeof(struct node));
    head->no   = -1;
    head->next = head;
    for ( i=30; i>0; i-- )                        /* 生成循环链表 */
    {   p = (struct node *)malloc(sizeof(struct node));
        p->next = head->next;  p->no   = i;  head->next = p;
    }
    printf("\nThe original circle is :");
    while ( p->next != head )               /* 循环链跳过表头结点 */
        p = p->next;
    p->next = head->next;                        /* p 指向 30 */
    for ( i=0; i<15; i++ )
    {   for ( k=1 ; k<9 ; k++ )
         p = p->next;
        q = p->next;                     /* p 的下一个结点是要出列的结点 */
        p->next = q->next;          /* 循环链表跳过要出列的结点 */
        printf("%3d", q->no);    /* 输出 q 结点的编号 */
        free(q);                              /* 释放 q 结点 */
    }
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值