typedef int status;
typedef int Elemtype;
const int ok=1;
const int error=0;
const int overflow=-2;
const int TRUE=1;
const int FALSE=0;
typedef struct LNode{
Elemtype data;
struct LNode *next;
}LNode,*Linklist; //定义单链表的结点类型;
status initlist(Linklist &L) //初始化单链表;
{
L=(Linklist) malloc(sizeof(LNode));
if(!L) exit(overflow);
L->next=NULL;
//TODO1 生成单链表的头结点;
return ok;
}
status destroylist(Linklist &L) //销毁单链表;
{ while(L)
{ Linklist p=L->next;
free(L);
L=p;
}
//TODO2
return ok;
}
status listempty(Linklist &L) //判断单链表是否为空;
{ if(L->next==NULL)
return TRUE;
else return FALSE;
//TODO3
return TRUE;
}
int listlength(Linklist L) //求单链表的长度;
{ Linklist p=L->next;
int i=0;
while(p)
return i;
//TODO4
//p先指向第一个结点;
//计数器清0;
//当p所指向的结点存在,计数器加1,同时指针下移;
//
while语句结束时,p移出单链表;
//返回单链表的长度;
}
void clearlist(Linklist &L) //清空单链表;
{while (L->next) {
Linklist p=L->next; L->next=p->next;
}
//TODO5
}
void printlist(Linklist L) //输出单链表里的每一个结点;
{
Linklist
p=L->next;
while(p)
{printf("%d",p->data);
p=p->next;
}
//TODO6
//p指向头结点;
//当p指向的结点存在,输出该结点,同时指针下移;
}
status getelem(Linklist L,int i,Elemtype &e)//取表中第i个元素放到变量e里;
{ Linklist p=L->next; int j=1;
while(p&&j<i)
e=p->data;
if(!p||j>i) return error;
//TODO7
//p首先指向第一个元素
//while语句结束时,如果第i个结点存在,p指向它;
//否则p指向表尾;
//表中不存在第i个结点或者表为空,返回出错信息;
}
status listinsert(Linklist &L,int i,Elemtype e)//向表中第i个元素的前面插入元素e;
{ Linklist p = L; int j = 0;
while (p && j < i-1)
// 寻找第 (i-1) 个结点
if (!p || j > i-1)
return error;
else
//TODO8
//p首先指向头结点;
//如果第i个结点存在,while语句结束时,p指向第i-1个结点;
//否则p指向表尾;
//生成新的结点;
//新的结点插入到p指向结点的后面(也就是插入到第i个结点的前面);
return ok;
}
status listdelete(Linklist &L,int i,Elemtype &e)//删除表L中第i个元素,结果用e返回. 操作成功返回ok,失败时返回error
{Linklist p = L; int j = 0;
while (p->next && j < i-1)
// 寻找第 i-1 个结点,并令 p 指向它。
if (p->next&& j == i-1)
{Linklist q = p->next; p->next = q->next; // 删除并释放结点
e = q->data; free(q);}
return ok;
//TODO9
}