// 修改了一些拼写错误和';',编译通过。
#include <stdio.h>
#include <stdlib.h>
typedef int Item;
typedef struct List {
int m_count;
// 线性表,以有元素数量
int m_length;
// 线性表,最大元素数量
int m_index;
// 线性表,元素索引
Item * m_pitem;
// 线性表指针
} List;
List*
destroy_list(List *p);
// 摧毁列表
int
error_list(List *p);
// 判断列表是否有错误
List*
create_list(int n);
// 创建并初始化列表
int
is_empty_list(List *p);
// 列表是否为空
int
is_full_list(List *p);
// 列表是否已满
int
len_list(List *p);
// 返回该列表的已有项目数量
int
maxlen_list(List *p);
// 返回该列表的最大项目数量
List*
push_item_list(List *p, Item *pitem);
// 把Item数据送入列表
List*
pop_item_list(List *p, Item *pitem);
// 后进先出
List*
out_item_list(List *p, Item *pitem);
// 先进先出
Item
get_item_list(List*p, int i);
// 以索引形式访问列表数据
//---------------------------------------------
#define MAX_LEN 5
int main(void)
{
List * mylist;
Item a;
printf("创建列表,可容纳%d个项目。\n", MAX_LEN);
mylist = create_list(MAX_LEN);
printf("现在列表中共有%d个项目。\n", len_list(mylist));
printf("插入2。\n");
a = 2;
push_item_list(mylist, &a);
printf("插入6。\n");
a = 6;
push_item_list(mylist, &a);
printf("输出第1个元素%d。\n", get_item_list(mylist, 0));
printf("现在列表中共有%d个项目。\n", len_list(mylist));
out_item_list(mylist, &a);
printf("删除并输出第一个项目%d。\n", a);
printf("现在列表中共有%d个项目。\n", len_list(mylist));
getchar();
return 0;
}
//---------------------------------------------
Item* create_item_array(int n)
// 创建项目数组
{
if (n > 0)
return (Item*)malloc(n * sizeof(Item));
else if (n < 0) {
puts("Item error: Qty < 0");
exit(1);
}
return NULL;
}
List* destroy_list(List *p)
{
if (p) {
free(p->m_pitem);
free(p);
}
return NULL;
}
int error_list(List *p)
{
if (!p) {
puts("List error: NULL pointer!");
exit(1);
}
if ( (p->m_length < 0 || p->m_length < p->m_count
|| p->m_length < p->m_index)
|| (p->m_length && !p->m_pitem)
|| (!p->m_length && p->m_pitem) ) {
p->m_count = p->m_length = p->m_index = 0;
free(p->m_pitem);
puts("List error: Member Error!");
exit(1);
}
return 0;
}
List* create_list(int n)
{
List *p = NULL;
p = (List*)malloc(n * sizeof(Item));
if (p) {
p->m_pitem = create_item_array(n);
p->m_length = n;
p->m_count = 0;
p->m_index = 0;
}
if (error_list(p))
return NULL;
return p;
}
int is_empty_list(List *p)
{
if (error_list(p))
exit(1);
if (p->m_count)
return 0;
return 1;
}
int is_full_list(List *p)
{
if (error_list(p))
exit(1);
if (is_empty_list(p) || p->m_length > p->m_count)
return 0;
return 1;
}
int
len_list(List *p)
{
if (error_list(p))
exit(1);
return p->m_count;
}
int
maxlen_list(List *p)
{
if (error_list(p))
exit(1);
return p->m_length;
}
List* push_item_list(List *p, Item *pitem)
{
if (error_list(p))
exit(1);
if (is_full_list(p))
return NULL;
++p->m_index;
if (is_empty_list(p) || p->m_index == p->m_length)
p->m_index = 0;
if (p->m_pitem == NULL && (p->m_pitem = create_item_array(5)) == NULL)
return NULL;
p->m_pitem[p->m_index] = *pitem;
++p->m_count;
return p;
}
List* pop_item_list(List *p, Item *pitem)
{
if (error_list(p))
exit(1);
if (is_empty_list(p))
return NULL;
*pitem =
p->m_pitem[p->m_index];
if (p->m_index)
--p->m_index;
else
p->m_index = p->m_length - 1;
--p->m_count;
return p;
}
List* out_item_list(List *p, Item *pitem)
{
int st = 0;
if (error_list(p))
exit(1);
if (is_empty_list(p))
return NULL;
st = (p->m_index + 1) - p->m_count;
st = (p->m_length + st) % p->m_length;
*pitem = p->m_pitem[st];
--p->m_count;
return p;
}
Item get_item_list(List*p, int i)
{
int st;
if (error_list(p))
exit(1);
if (is_empty_list(p)) {
puts("List error: Empty List!");
exit(1);
}
if (i >= p->m_count) {
exit(1);
puts("Index : Error!");
}
st = (p->m_index + 1) - p->m_count;
i = (p->m_length + i) % p->m_length;
return p->m_pitem[i];
}
[
本帖最后由 cosdos 于 2009-10-24 15:32 编辑 ]