C语言的顺序表访问小代码

逛游论坛,看个帖子,手痒痒,照着写点代码。


帖子:

http://bbs.csdn.net/topics/391091587


功能变更如下:

  • 每次输入一组数据:name, id, location/inde
  • 输入过程中,如果直接回车,则表示结束输入
  • 当输入最大门限(示例代码为10),则程序自动结束输入。


特别提及:

代码中pnode同时为数据类型的名称和变量的名称,这在C语法上是合法的,但实际上从可读性来讲,可能并不推荐。不过在Linux的诸多代码中,这种风格倒是比较常见。


代码如下:

/*
see: http://bbs.csdn.net/topics/391091587
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

struct node
{
    int max_count;
    int current_count;
    int id[100];
    char *name[100];
};

typedef struct node *pnode;

//创建一个空的顺序表,最大值为m。n为0
pnode create(int max_count)
{
    pnode node = (pnode)malloc(sizeof(struct node));
    if (NULL == node) {
        printf("failed to create!");
        return NULL;
    }
    
    node->max_count = max_count;
    node->current_count = 0;
    printf("success to create\n");
    
    return node;
}

//查询一个表是否为空表
int is_empty(pnode pnode)
{
    if (pnode->current_count == 0) {
        //printf("empty\n");
        return 1;
    }

    //printf("not empty\n");
    return 0;
}

//插入一个信息到顺序表,插入到第index个元素之前
void insert(pnode pnode, int index, int id, char name[10])
{
    if (index < 0 || index > pnode->current_count) index = pnode->current_count;
    
    for(int q = pnode->current_count - 1; q >= index; q--) {
        pnode->id[q + 1] = pnode->id[q];
        pnode->name[q + 1] = pnode->name[q];
    }
    
    pnode->current_count++;
    pnode->id[index] = id;
    //pnode->name[index] = strdup(name); #MinGW's error
    pnode->name[index] = (char*)malloc(sizeof(char) * sizeof(strlen(name) + 1));
    if (NULL == pnode->name[index]) {
        printf("malloc failed.\n");
    } else {
        strcpy(pnode->name[index], name);
    }
    
    //return pnode;
}

int visit(pnode pnode)
{
    int i;
    
    if (is_empty(pnode)) return 0;
    
    for (i = 0; i < pnode->current_count; i++) {
        printf("%d:[%d, %s] ", i, pnode->id[i], pnode->name[i]);
    }
    
    printf("\n");
}

void delete(pnode pnode)
{
    int i;
    for (i = 0; i < pnode->current_count; i++) {
        free(pnode->name[i]);
        pnode->name[i] = NULL;
    }
    
    pnode->current_count = 0;
}

static void test1()
{   
    pnode pnode;
    char buffer[1024]; // Assume the input string will not exceed 1024.
    char name[1024];
    int loc = -1;
    int id = -1;
    int max_count = 10;
    int current_count = 0;
    pnode = create(max_count);
    
    if (NULL == pnode) return;
    
    while(1) {
        printf("Please enter: [name, id, index]. Enter directly to exit.\n");
        
        int index = 0;
        for (; (buffer[index] = getchar()) != '\n' && index < 1024; index++) {
            //printf("index=%d, buffer[%d]=0x%02x\n", index, index, buffer[index]);
        }
        
        //printf("index=%d\n", index);
        
        if (index == 0) {
            break;
        }
        
        //printf("User's input: %s\n", buffer);
        
        if (3 != sscanf(buffer, "%s %d %d", &name, &id, &loc)) {
            printf("Error input. The input should be, e.g., \"John 35 0\"\n");
            continue;
        }
        
        insert(pnode, loc, id, name);
        
        visit(pnode);
        
        current_count++;
        if (current_count == max_count) {
            printf("Now is the max count! Stop automatically!\n");
            break;
        }
    }
    
    delete(pnode);
}

int main()
{
    test1();
    
    return 0;
}

编译&链接:

D:\examples\cpp\sequence_list>gcc -std=c99 sequenc_list.c

D:\examples\cpp\sequence_list>


运行效果:

1. 直接回车,程序退出:

D:\examples\cpp\sequence_list>a.exe
success to create
Please enter: [name, id, index]. Enter directly to exit.


D:\examples\cpp\sequence_list>

2. 输入几组数据之后,直接回车退出:

D:\examples\cpp\sequence_list>a.exe
success to create
Please enter: [name, id, index]. Enter directly to exit.
one 1 1
0:[1, one]
Please enter: [name, id, index]. Enter directly to exit.
two 2 0
0:[2, two] 1:[1, one]
Please enter: [name, id, index]. Enter directly to exit.
three 3 1
0:[2, two] 1:[3, three] 2:[1, one]
Please enter: [name, id, index]. Enter directly to exit.
four 4 4
0:[2, two] 1:[3, three] 2:[1, one] 3:[4, four]
Please enter: [name, id, index]. Enter directly to exit.


D:\examples\cpp\sequence_list>

3. 输入最大门限10组数据之后,程序自动退出:

D:\examples\cpp\sequence_list>a.exe
success to create
Please enter: [name, id, index]. Enter directly to exit.
one 1 1
0:[1, one]
Please enter: [name, id, index]. Enter directly to exit.
two 2 2
0:[1, one] 1:[2, two]
Please enter: [name, id, index]. Enter directly to exit.
three 3 3
0:[1, one] 1:[2, two] 2:[3, three]
Please enter: [name, id, index]. Enter directly to exit.
four 4 4
0:[1, one] 1:[2, two] 2:[3, three] 3:[4, four]
Please enter: [name, id, index]. Enter directly to exit.
five 5 5
0:[1, one] 1:[2, two] 2:[3, three] 3:[4, four] 4:[5, five]
Please enter: [name, id, index]. Enter directly to exit.
six 6 6
0:[1, one] 1:[2, two] 2:[3, three] 3:[4, four] 4:[5, five] 5:[6, six]
Please enter: [name, id, index]. Enter directly to exit.
seven 7 7
0:[1, one] 1:[2, two] 2:[3, three] 3:[4, four] 4:[5, five] 5:[6, six] 6:[7, seven]
Please enter: [name, id, index]. Enter directly to exit.
eight 8 8
0:[1, one] 1:[2, two] 2:[3, three] 3:[4, four] 4:[5, five] 5:[6, six] 6:[7, seven] 7:[8, eight]
Please enter: [name, id, index]. Enter directly to exit.
nine 9 9
0:[1, one] 1:[2, two] 2:[3, three] 3:[4, four] 4:[5, five] 5:[6, six] 6:[7, seven] 7:[8, eight] 8:[9, nine]
Please enter: [name, id, index]. Enter directly to exit.
ten 10 10
0:[1, one] 1:[2, two] 2:[3, three] 3:[4, four] 4:[5, five] 5:[6, six] 6:[7, seven] 7:[8, eight] 8:[9, nine] 9:[10, ten]
Now is the max count! Stop automatically!

D:\examples\cpp\sequence_list>





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值