Manchester


私信TA

用户名:wenyajie

访问量:332111

签 名:

在历史前进的逻辑中前进,这个逻辑就是人心向背的逻辑

等  级
排  名 1
经  验 65567
参赛次数 1
文章发表 188
年  龄 0
在职情况 学生
学  校 Xiamen University
专  业 计算机科学

  自我简介:

在历史前进的逻辑中前进,这个逻辑就是人心向背的逻辑

解题思路:

首先思考一下总思路
①:结点定义

typedef struct node_{

int data;
struct node_* next;

}*node,Node;

②:声明所需的函数

node creat_list(int *Count);

void get_(node L,int a);
void insert_(node L,int a,int e,int *Count);
void delete_(node L,int a,int *Count);
void show_(node L);

③:编写主函数总体框架

int main()
{
char order[7];
int n,a,e,Count;
/*Count表示结点数*/
node L=creat_list(&Count);

scanf("%d",&n);
for(int i=0;i<n;i++)
 {

   scanf("%s",order);

    if(!strcmp(order,"get"))
       {
         scanf("%d",&a);
         /*判断查找位置是否合法,*/
         if(a>Count||a<1)
         printf("get fail\n");
         else
         get_(L,a);
       }
       else
       if(!strcmp(order,"insert"))
        {
          scanf("%d%d",&a,&e);
          /*判断插入位置是否合法,若a=Count+1,表示插入在链表尾部*/
          if(a>Count+1||a<1)
           printf("insert fail\n");
           else
          insert_(L,a,e,&Count);

        }
        else
          if(!strcmp(order,"delete"))
             {
               scanf("%d",&a);
               /*判断删除位置是否合法*/
               if(a>Count||a<1)
               printf("delete fail\n");
               else
               delete_(L,a,&Count);
             }
             else
               if(!strcmp(order,"show"))
                {
                  show_(L);
                }


 }
return 0;
}

④:对前面声明的函数写出具体的实现


注意事项:
删除是删除第a位置的元素,插入是在第a位置之前

每个输出占一行,数字后面带空格


参考代码:

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

typedef struct node_ {
    int        data;
    struct node_    * next;
}*node, Node;

node creat_list( int *Count );


void get_( node L, int a );


void insert_( node L, int a, int e, int *Count );


void delete_( node L, int a, int *Count );


void show_( node L );


int main()
{
    char    order[7];
    int    n, a, e, Count;

    node L = creat_list( &Count );

    scanf( "%d", &n );
    for ( int i = 0; i < n; i++ )
    {
        scanf( "%s", order );

        if ( !strcmp( order, "get" ) )
        {
            scanf( "%d", &a );
            /*判断查找位置是否合法,*/
            if ( a > Count || a < 1 )
                printf( "get fail\n" );
            else
                get_( L, a );
        }else
        if ( !strcmp( order, "insert" ) )
        {
            scanf( "%d%d", &a, &e );
            /*判断插入位置是否合法,若a=Count+1,表示插入在链表尾部*/
            if ( a > Count + 1 || a < 1 )
                printf( "insert fail\n" );
            else
                insert_( L, a, e, &Count );
        }else
        if ( !strcmp( order, "delete" ) )
        {
            scanf( "%d", &a );
            /*判断删除位置是否合法*/
            if ( a > Count || a < 1 )
                printf( "delete fail\n" );
            else
                delete_( L, a, &Count );
        }else
        if ( !strcmp( order, "show" ) )
        {
            show_( L );
        }
    }
    return(0);
}


/*============================================*/
node creat_list( int *Count )
{
    int    n, e;
    node    p;
    scanf( "%d", &n );
    (*Count) = n;
    /*头结点*/
    node head = (node) malloc( sizeof(Node) );
    head->next = NULL;
    for ( int i = 0; i < n; i++ )
    {
        scanf( "%d", &e );
        p = (node) malloc( sizeof(Node) );
        /*前插*/
        p->data        = e;
        p->next        = head->next;
        head->next    = p;
    }
    /*返回指向头结点的指针*/
    return(head);
}


/*============================================*/
void get_( node L, int a )
{
    node p = L;

    for ( int i = 0; i < a; i++ )
        p = p->next;

    printf( "%d\n", p->data );
}


/*============================================*/
void insert_( node L, int a, int e, int *Count )
{
    node p = L;
    /*找到第a个位置之前的结点即第a-1个结点*/
    for ( int i = 1; i < a; i++ ) /* for(int i=0;i<a-1;i++) */
        p = p->next;

    node q = (node) malloc( sizeof(Node) );
    q->data = e;
    /*插入结点*/
    q->next = p->next;
    p->next = q;
    /*结点数加1*/
    (*Count)++;
    printf( "insert OK\n" );
}


/*============================================*/
void delete_( node L, int a, int *Count )
{
    node d, p = L;
    /*找到第a个位置之前的结点即第a-1个结点*/
    for ( int i = 0; i < a - 1; i++ )
        p = p->next;
    /*删除结点*/
    d    = p->next;
    p->next = d->next;
    free( d );
    /*结点数减去1*/
    (*Count)--;
    printf( "delete OK\n" );
}


/*============================================*/
void show_( node L )
{
    node p = L->next;

    if ( p == NULL )
        printf( "Link list is empty\n" );
    else{
        while ( p != NULL )
        {
            printf( "%d ", p->data );
            p = p->next;
        }
        printf( "\n" );
    }
}

别忘点赞哦-.-!

 

0.0分

63 人评分

  评论区

为什么你这删除,插入函数是void类型的,还能影响主函数中的L
2022-01-01 11:34:00
插眼:strcmp函数
2021-05-26 23:21:00
好文,推荐到咱们dotcpp微信平台~
2018-03-15 09:09:32
  • «
  • 1
  • »