逛游论坛,看个帖子,手痒痒,照着写点代码。
帖子:
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>