顺序表中查找问题
创建一个顺序表,输出该顺序表,然后在顺序表中查找元素X,若找到,输出X所在的序号,否则输出“无该元素”
/*********************************************************************
Copyright (c) 2012 by silent_world, All rights reserved.
*********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
////////////////////////////////////////////////////////////////////
/*** 模块配置区 ***/
////////////////////////////////////////////////////////////////////
#define HAVE_SUPPORT_HEAP
#define HAVE_FULL_MODULE
#define HAVE_TEST_AGAIN
////////////////////////////////////////////////////////////////////
/*** 模块宏定义区 ***/
////////////////////////////////////////////////////////////////////
#define TABLE_STRING_NULL (0)
#define TABLE_STRING_SUCCESS (0)
#define TABLE_STRING_FAIL (-1)
#define STR_BUF_LENGTH (128)
#define TALBE_LENGTH (128)
#define CLEAR_KEY do{fflush(stdin);}while(0);
#define PRINTF_MENU system("cls"); \
printf("*************************\n"); \
printf("1. Help\n"); \
printf("2. Need to search again!\n"); \
printf("3. Need to test again!\n"); \
printf("4. exit!\n"); \
printf("*************************\n");
////////////////////////////////////////////////////////////////////
/*** 函数声明区 ***/
////////////////////////////////////////////////////////////////////
void *table_string_create();
void table_string_destroy(void *handle);
int table_string_add(void *handle, char *cur_str);
void table_string_show(void *handle);
int table_string_search(void *handle, char *cur_str);
#ifdef HAVE_FULL_MODULE
/***测试是否存在内存泄漏***/
void *table_string_malloc(int size);
void table_string_free(void *handle);
#endif
////////////////////////////////////////////////////////////////////
int main()
{
void *table_head = 0;
char in_str[STR_BUF_LENGTH] = {0};
int ret = -1;
#ifdef HAVE_TEST_AGAIN
int flag_ch = 0;
char in_tmp = 0;
#endif
#ifdef HAVE_TEST_AGAIN
while(1)
{
#endif
table_head = table_string_create();
if(TABLE_STRING_NULL == table_head)
return TABLE_STRING_FAIL;
printf("Please input string, 输入0结束:\n");
while(1)
{
CLEAR_KEY
gets(in_str);
if(0 == strcmp(in_str, "0"))
break;
ret = table_string_add(table_head, in_str);
if(TABLE_STRING_FAIL == ret)
break;
}
#ifdef HAVE_FULL_MODULE
table_string_show(table_head);
#endif
printf("Please input search string:\n");
CLEAR_KEY
gets(in_str);
ret = table_string_search(table_head, in_str);
if(TABLE_STRING_FAIL == ret)
{
printf("Don't find!\n");
}
else
printf("The number is %d\n", ret);
#ifdef HAVE_TEST_AGAIN
printf("The Test is complete!\n");
printf("Press Enter key continue...\n");
CLEAR_KEY
scanf("%c", &in_tmp);
do{
flag_ch = 0;
PRINTF_MENU
CLEAR_KEY
scanf("%d", &flag_ch);
if(1 == flag_ch)
{
system("cls");
printf("Please set parameter correctlly!\n");
printf("HAVE_SUPPORT_HEAP -- user heap buffer!\n");
printf("HAVE_FULL_MODULE -- use whole function!\n");
printf("HAVE_TEST_AGAIN -- You can use the table_str mult!\n");
printf("Press Enter key continue...\n");
CLEAR_KEY
scanf("%c", &in_tmp);
}
else if(2 == flag_ch)
{
system("cls");
printf("Please input search string:\n");
CLEAR_KEY
gets(in_str);
ret = table_string_search(table_head, in_str);
if(TABLE_STRING_FAIL == ret)
{
printf("Don't find!\n");
}
else
printf("The number is %d\n", ret);
printf("Press Enter key continue...\n");
CLEAR_KEY
scanf("%c", &in_tmp);
}
else if(3 == flag_ch)
{
break;
}
else if(4 == flag_ch)
{
table_string_destroy(table_head);
return TABLE_STRING_SUCCESS;
}
else{
system("cls");
printf("Sorry, Error input, Please input again!\n");
printf("Press any key continue...\n");
CLEAR_KEY
scanf("%c", &in_tmp);
}
}while(1);
#endif
table_string_destroy(table_head);
system("cls");
#ifdef HAVE_TEST_AGAIN
}
#endif
return TABLE_STRING_SUCCESS;
}
/////////////////////////////////////////////////////////////////////
/*** 顺序表操作模块 ***/
/////////////////////////////////////////////////////////////////////
typedef struct _table_item_
{
char c_data[STR_BUF_LENGTH];
int flag;
int status;
}table_item;
typedef struct _talbe_example_
{
table_item table_data[TALBE_LENGTH];
}talbe_example;
enum{
TALBE_NULL,
TABLE_USING
};
////////////////////////////////////////////////////////////////////
/*** 全局变量区 ***/
////////////////////////////////////////////////////////////////////
#if !define(HAVE_SUPPORT_HEAP)
table_item table_data[TALBE_LENGTH] = {0};
#endif
#ifdef HAVE_FULL_MODULE
#define malloc table_string_malloc
#define free table_string_free
#endif
/*******************************************************************
函数功能:创建顺序表
输入参数:void
输出参数:
TABLE_STRING_NULL 创建失败,返回空指针
other 返回指向链表头指针
*******************************************************************/
void *table_string_create()
{
#ifdef HAVE_SUPPORT_HEAP
talbe_example *me = 0;
int i = 0;
me = (talbe_example *)malloc(sizeof(talbe_example));
if(TABLE_STRING_NULL == me)
return TABLE_STRING_NULL;
memset(me, 0, sizeof(talbe_example));
return me;
#else
return &table_data[0];
#endif
}
/*******************************************************************
函数功能: 销毁队列
输入参数: handle 队列指针
输出参数: void
*******************************************************************/
void table_string_destroy(void *handle)
{
#ifdef HAVE_SUPPORT_HEAP
talbe_example *me = (talbe_example *)handle;
if(TABLE_STRING_NULL != me)
free(me);
#else
memset(handle, 0, sizeof(table_item) * TALBE_LENGTH);
#endif
}
/*******************************************************************
函数功能: 添加一个结点
输入参数: handle 队列指针
cur_str 需要添加的字符
输出参数: TABLE_STRING_SUCCESS 添加成功
TABLE_STRING_FAIL 添加失败
*******************************************************************/
int table_string_add(void *handle, char *cur_str)
{
int i = 0;
#ifdef HAVE_SUPPORT_HEAP
talbe_example *head_node = (talbe_example *)handle;
table_item *me = 0;
if(TABLE_STRING_NULL != head_node)
me = head_node->table_data;
#else
table_item *me = (table_item *)handle;
#endif
for(i = 0; i < TALBE_LENGTH; i++)
{
if(me[i].status == TALBE_NULL)
{
me[i].status = TABLE_USING;
strcpy(me[i].c_data, cur_str);
return TABLE_STRING_SUCCESS;
}
else if(0 == strcmp(me[i].c_data, cur_str))
break;
}
return TABLE_STRING_FAIL;
}
/*******************************************************************
函数功能: 查找某个节点
输入参数: handle 队列指针
cur_str 需要添加的字符
输出参数: TABLE_STRING_FAIL 查找失败
other 序列号
*******************************************************************/
int table_string_search(void *handle, char *cur_str)
{
int i = 0;
#ifdef HAVE_SUPPORT_HEAP
talbe_example *head_node = (talbe_example *)handle;
table_item *me = 0;
if(TABLE_STRING_NULL != head_node)
me = head_node->table_data;
#else
table_item *me = (table_item *)handle;
#endif
for(i = 0; i < TALBE_LENGTH; i++)
{
if(me[i].status == TABLE_USING)
{
if(0 == strcmp(me[i].c_data, cur_str))
return i;
}
else
break;
}
return TABLE_STRING_FAIL;
}
/*******************************************************************
函数功能: 打印队列信息
输入参数: handle 队列头
输出参数: 无
*******************************************************************/
void table_string_show(void *handle)
{
int i = 0;
#ifdef HAVE_SUPPORT_HEAP
talbe_example *head_node = (talbe_example *)handle;
table_item *me = 0;
if(TABLE_STRING_NULL != head_node)
me = head_node->table_data;
#else
table_item *me = (table_item *)handle;
#endif
for(i = 0; i < TALBE_LENGTH; i++)
{
if(me[i].status == TABLE_USING)
{
printf("%d: %s\n", i, me[i].c_data);
}
else
break;
}
printf("\n");
}
#ifdef HAVE_FULL_MODULE
#undef malloc
#undef free
#endif
#ifdef HAVE_FULL_MODULE
void *table_string_malloc(int size)
{
return malloc(size);
}
void table_string_free(void *handle)
{
free(handle);
}
#endif