Esempio n. 1
0
int main(void)
{
	ElemType site[11] = { 'a', 'n', 'o', 't', 'h', 'e', 'r', 'h', 'o', 'm', 'e' };
	LinkList *Link, *LinkR;
	ElemType e;

	CreateListF(Link, site, 11);
	CreateListR(LinkR, site, 11);
	DispList(Link);
	DispList(LinkR);
	DestroyList(LinkR);
	if (ListEmpty(Link))
	{
		printf("List is empty\n");
	}
	else
	{
		printf("List isn't empty\n");
	}
	printf("ListLength: %d\n", ListLength(Link));
	GetElem(Link, ListLength(Link), e);
	ListInsert(Link, 2, e);
	DispList(Link);
	ListDelete(Link, 3, e);
	DispList(Link);
	printf("The location of 'o' is %d\n", LocateElem(Link, 'o'));
	DestroyList(Link);

	return 0;
}
Esempio n. 2
0
// 9. 求两个单链表相交的第一个节点
ListNode * ListFirstCrossNodeOf2List(ListNode * head1, ListNode * head2)
{
	if(head1 == NULL || head2 == NULL) return NULL;
	if(!ListIsCrossed(head1, head2)) return NULL;

	int len1 = ListLength(head1);
	int len2 = ListLength(head2);
	ListNode * p = head1;
	ListNode * q = head2;
	if(len1 > len2) {
		int m = len1 - len2;
		while(m > 0) {
			p = p->next;
			m--;
		}
	} else {
		int n = len2 - len1;
		while(n > 0) {
			q = q->next;
			n--;
		}
	}

	while(p != q) {
		p = p->next;
		q = q->next;
	}

	return p;
}
Esempio n. 3
0
/**************************************************
函数功能:获取链表某一位置处的值
参数1:链表头指针
参数2:待获取元素的位置
参数3(Output):返回元素
参数4:函数指针,指出为数据赋值的方式
返回值:无
说明:
头文件: <assert.h>
        <stdlib.h>
		<stdio.h>
作者: Lee.C
完成时间:2015-05-10
修改时间:2016-05-04
修改说明:代码重构
**************************************************/
void GetLinkListItem(const LinkList L, size_t n, LinkListItem *e, void (*Assgin)(LinkListItem *dst, const LinkListItem *src))
{
	assert(L);
	assert(L->next);
	assert(n >= 1 && n <= ListLength(L));
	
	/*******************************************
	 * current : 指向链表待获取处的节点,
	             初始值为指向链表第一个元素的指针
	 * currentPos : 待获取处的节点位置,从第1个节点算起
	*******************************************/
	LNode *current = L->next;
	size_t currentPos = 1;

	while(current && currentPos < n)
	{
		current = current->next;
		currentPos++;
	}

	if(!current || currentPos > n)
	{
		fputs("Call GetItem() ERROR !\n", stdout);
		fprintf(stdout, "The List`s length is %lu,the get location %lu is overflow\n", ListLength(L), n);
		exit(EXIT_FAILURE);
	}

	Assgin(e, &current->data);
}
Esempio n. 4
0
/* 链表删除 */
Status DeleteNode(LinkList &L, int i) {
    LinkList p = (LinkList) malloc (sizeof(LNode));
    LinkList q = (LinkList) malloc (sizeof(LNode));
    if(i <= 0 || i > ListLength(L)) return ERROR;
    int j = 0;

    if (i == 1) {
        q = L;    
        L = L->next;
    } else if (i == ListLength(L) + 1) {
        for (p = L; p->next->next != NULL; p = p->next)
            q = p->next->next;
        p->next = NULL;
    } else {
        p = L;
        while (p->next && j < i - 2) {
            p = p->next; ++j;
        }
        if (!p->next || j > i - 1) return ERROR;

        q = p->next;
        p->next = q->next;
    }
    free(q);

    return OK;
}
Esempio n. 5
0
/*
 * 给定两个单链表,找出两个链表的公共节点
 * 思路:由于每个单链表节点只有一个next域,所以从第一个公共节点开始往后,链表都是重合的
 * 先遍历两个链表,得到链表的长度,并求出长度差,在长链表上先遍历长度之差个节点之后,再
 * 同步遍历两个链表,直到找到相同的节点,或者一直到链表结束
 * 时间复杂度O(len1 + len2)
 */
void search_common(LinkList La, LinkList Lb)
{
    int len1 = ListLength(La);
    int len2 = ListLength(Lb);
    int dist;
    LinkList longlist, shortlist;

    if ( len1 > len2 )
    {
        longlist = La->next;
        shortlist = Lb->next;
        dist = len1 - len2;
    }
    else
    {
        longlist = Lb->next;
        shortlist = La->next;
        dist = len2 - len1;
    }

    while ( dist-- )
        longlist = longlist->next;
    while ( longlist )
    {
        if ( longlist == shortlist )
            ListTraverse(longlist, print);
        else
        {
            longlist = longlist->next;
            shortlist = shortlist->next;
        }
    }
}
Esempio n. 6
0
 void MergeList(SqList La,SqList Lb,SqList &Lc) // 算法2.2
 { // 已知线性表La和Lb中的数据元素按值非递减排列。
   // 归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列
   int i=1,j=1,k=0;
   int La_len,Lb_len;
   ElemType ai,bj;
   InitList(Lc); // 创建空表Lc
   La_len=ListLength(La);
   Lb_len=ListLength(Lb);
   while(i<=La_len&&j<=Lb_len) // 表La和表Lb均非空
   {
     GetElem(La,i,ai);
     GetElem(Lb,j,bj);
     if(ai<=bj)
     {
       ListInsert(Lc,++k,ai);
       ++i;
     }
     else
     {
       ListInsert(Lc,++k,bj);
       ++j;
     }
   } // 以下两个while循环只会有一个被执行
   while(i<=La_len) // 表La非空且表Lb空
   {
     GetElem(La,i++,ai);
     ListInsert(Lc,++k,ai);
   }
   while(j<=Lb_len) // 表Lb非空且表La空
   {
     GetElem(Lb,j++,bj);
     ListInsert(Lc,++k,bj);
   }
 }
Esempio n. 7
0
int main(int argc, char *argv[])
{
	DataType a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9,};
	DataType b[] = {10, 11, 12, 13, 14, 15};
	DataType e;

	CirList A;	/* 声明循环链表A和B */
	CirList B;
	p_CirList C = NULL;

	InitList(&A);	/* 初始化 */
	InitList(&B);
	C = &A;

	/* 插入元素 */
	Insert_Elem(&A, a, sizeof(a) / sizeof(DataType));
	Insert_Elem(&B, b, sizeof(b) / sizeof(DataType));

	printf("循环链表A中有%d个元素\n", ListLength(A));
	ListTraverse(A, Show_Elem);
	
	putchar('\n');

	printf("循环链表B中有%d个元素\n", ListLength(B));
	ListTraverse(B, Show_Elem);

	puts("\n\n");

	if (GetElem(&A, 8, &e))
		printf("循环链表A第8个元素是%4d\n", e);
	
	if (GetElem(&B, 5, &e))
		printf("循环链表B第5个元素是%4d\n", e);
	putchar('\n');

	printf("删除链表B最后一个元素\n");
	ListDelete(&B, 6, &e);
	ListTraverse(B, Show_Elem);

	putchar('\n');

	C = Merge(&A, &B);	/* 合并 */
	
	printf("合并后的链表有%d个元素\n", ListLength(*C));
	ListTraverse(*C, Show_Elem);	

	putchar('\n');
	
	if (GetElem(C, 14, &e))
		printf("合并后的链表第14个元素是%4d\n", e);

	ClearList(&A);
	ClearList(&B);
	
	putchar('\n');
	
	exit(EXIT_SUCCESS);
}
Esempio n. 8
0
status GetElem(SqList *L, int i, ElemType e)
{
	if(ListLength(L)==0 || i>ListLength(L) || i<1) {
		return ERROR;
	}
	*e = L.data[i-1];
	
	return OK;
}
Esempio n. 9
0
Term wdbg(Term t, Term ind)
	{
	t=CompoundArg1(t);
	t=GetAtomProperty(t,PROP_TYPE);
	t=CompoundArg1(t);
	printf("%d terms %d inds\n",ListLength(CompoundArg1(t)),
			ListLength(CompoundArg2(t)));
	return 0;
	}
Esempio n. 10
0
int main(int argc, const char * argv[]) {
    int a[10] = {1,3,9,8,4,2,5,0,7.6};
    int b[4] = {2,2,3};
    int c[4] = {1,3,3,4};
    SeqList list;//这个怎么直接全部赋值

    fillList(&list, a, 10);
    
    printf("获取位置:%d\n",Locate(list, 2));//按内容查找
    
    printf("插入:%s\n",InsList(&list,2,10)==1?"OK":"ERROR");//插入
    
    int delement;
    printf("删除:%s,删除的元素:%d\n",DelList(&list,3,&delement)==1?"ok":"ERROR",delement);//删除
    
    
    SeqList list1,list2,list3;
    
    fillList(&list1,b,3);
    fillList(&list2,c,4);
    
    mergeList(&list1,&list2,&list3);//合并两个非递减有序线性表
    printf("合并后的list:%d\n",list3.elem[7]);
    
    printf("---------%s---------\n","链表");
    
    //----------链表-------
    
    LinkList L;
    InitList(&L);
    
    //CreateFromHead(L);
    CreateFormTail(&L);
    
    Node *p = Get(L, 2);
    printf("链表的第2个节点:%c\n",p->data);
    
    
    Node *pp = Located(L,'2');
    printf("key是2的节点:%c\n",pp->data);
    
    printf("链表的长度是:%d\n",ListLength(L));
    
    InseList(L,1,'5');
    printf("插入后的链表长度:%d,首节点:%c\n",ListLength(L),Get(L, 1)->data);
    
    char tem;
    DellList(L,1,&tem);
    printf("链表长度%d,删除链表元素:%c\n",ListLength(L),tem);
    
    LinkList Lb = L;
    printf("合并后的长度%d\n",ListLength(MergeLinkList(L,Lb)));
    return 0;
}
Esempio n. 11
0
void Union(List &La, List Lb) {  // 算法2.1
  // 将所有在线性表Lb中但不在La中的数据元素插入到La中
  int La_len,Lb_len,i;
  ElemType e;
  La_len = ListLength(La);          // 求线性表的长度  
  Lb_len = ListLength(Lb);
  for (i=1; i<=Lb_len; i++) {
    GetElem(Lb, i, e);              // 取Lb中第i个数据元素赋给e
    if (!LocateElem(La, e, equal))  // La中不存在和e相同的数据元素
      ListInsert(La, ++La_len, e);  // 插入
  }
} // union
void unionL(SqList *La,SqList Lb)
{
	ElemType e;
	int La_len=ListLength(*La);
	int Lb_len=ListLength(Lb);
	for (int i=1;i<=Lb_len;i++)
	{
		GetElem(Lb,i,&e);
		if (!LocateElem(*La,e))
			ListInsert(La,++La_len,e);
	}
}
Esempio n. 13
0
void GetPowerSet(int i, List A, List &B) {  // 算法6.15
   // 线性表A表示集合A,线性表B表示幂集ρ(A)的一个元素。
   // 局部量k为进入函数时表B的当前长度。
   // 第一次调用本函数时,B为空表,i=1。
   ElemType x;
   int k;
   if (i > ListLength(A)) Output(B); // 输出当前B值,即ρ(A)的一个元素
   else { 
      GetElem(A, i, x);        k = ListLength(B);
      ListInsert(B, k+1, x);   GetPowerSet(i+1, A, B);
      ListDelete(B, k+1, x);   GetPowerSet(i+1, A, B);
   }
} // GetPowerSet
Esempio n. 14
0
void unionL(SqList *La, SqList Lb) /* union Lb to La */
{				
    int La_len, Lb_len, i;
    ElemType e;
    La_len = ListLength(*La);
    Lb_len = ListLength(Lb);

    for (i = 1; i <= Lb_len; ++i) {
	GetElem(Lb, i, &e);
	if (!LocateElem(*La, e))
	    ListInsert(La, ++La_len, e);
    }
    
}
Esempio n. 15
0
static void alg1_fix_w1(Term w)
	{
	List wi;
	List l1,l2,al;
	
	if(is_empty_list(CompoundArg2(w)))
		return;
	
	wi=NewList();
	l1=CompoundArg1(w);
	while(!is_empty_list(ListTail(l1)))
		{
		wi=AppendLast(wi,CompoundArg2(ListFirst(l1)));
		l1=ListTail(l1);
		}
	al=CompoundArg2(w);
	
	if(!is_empty_list(wi))
	while(!is_empty_list(al))
		{
		Term a1;
		List wia;
		a1=ListFirst(al);
		wia=NewList();
		l1=CompoundArg2(a1);
		while(!is_empty_list(l1))
			{
			wia=AppendLast(wia,CompoundArg2(ListFirst(l1)));
			l1=ListTail(l1);
			}
		if(ListLength(wi)!=ListLength(wia))
			{
			puts("Internal error a1fw");
			longjmp(alg1_jmp_buf,1);
			}
		l1=wi;
		l2=wia;
		while(!is_empty_list(l1))
			{
			rename_ind(a1,ListFirst(l2),ListFirst(l1));
			l1=ListTail(l1);
			l2=ListTail(l2);
			}
		FreeAtomic(wia);
		al=ListTail(al);
		}
	FreeAtomic(wi);		
	
	}
Esempio n. 16
0
void union_func(SqList *La, SqList Lb)
{
	int La_length, Lb_length, i;

	ElemType e;
	La_length = ListLength(*La);
	Lb_length = ListLength(Lb);
	
	for( i=1; i <= Lb_length; i++) {
		GetElem(Lb, i, &e);
		if( !LocateElem(*La, e) ) {
			ListInsert(La, ++La_length, e);
		}
	}
}
Esempio n. 17
0
static Term finda2(List pl, int del)
{
	int pli, ii;
	List l;
	pli=ListLength(pl);
	mmmpos=0;
	for(ii=0;ii<LagrHashSize;ii++)
	{
	
		for(l=lagr_hash[ii];l;l=ListTail(l))
		{
			List cpl=CompoundArg1(ListFirst(l));
			List vpl=0;
			List ll1,ll2;
			int pos=1;

			if(cpl==0 || ListLength(cpl)!=pli)
				continue;
			for(ll1=cpl;ll1;ll1=ListTail(ll1),pos++)
			{
				Atom a,prp;
				a=CompoundArg1(ListFirst(ll1));
				prp=GetAtomProperty(a,PROP_TYPE);
				if(is_compound(prp)&&CompoundName(prp)==OPR_FIELD &&
					CompoundArg2(prp)==NewInteger(4))
					a=CompoundArg1(prp);
				if(a==mmm)
					mmmpos=pos;
				vpl=AppendLast(vpl,a);
			}
				
			vpl=SortedList(vpl, acmp);

			for(ll1=pl,ll2=vpl;ll1;ll1=ListTail(ll1),ll2=ListTail(ll2))
				if(ListFirst(ll1)!=ListFirst(ll2))
					break;
			if(is_empty_list(ll1))
				break;
		}
	if(l)
		break;
	}
	
	if(l && del)
		lagr_hash[ii]=CutFromList(lagr_hash[ii],l);
	
	return l;
}
int main()
{
    StaticLinkList L;
    Status i;
    i=InitList(L);
    printf("初始化L后:L.length=%d\n",ListLength(L));

    i=ListInsert(L,1,'F');
    i=ListInsert(L,1,'E');
    i=ListInsert(L,1,'D');
    i=ListInsert(L,1,'B');
    i=ListInsert(L,1,'A');

    printf("在L的表头依次插入FEDBA后:\nL.data=");
    ListTraverse(L);

    i=ListInsert(L,3,'C');
    printf("\n在L的“B”与“D”之间插入“C”后:\nL.data=");
    ListTraverse(L);

    i=ListDelete(L,1);
    printf("\n在L的删除“A”后:\nL.data=");
    ListTraverse(L);

    printf("\n");

    return 0;
}
Esempio n. 19
0
void main()
{
	DLinkList *h;
	ElemType e;
	printf("(1)初始化循环双链表h\n");
	InitList(h);
	printf("(2)依次采用尾插法插入a,b,c,d,e元素\n");
	ListInsert(h,1,'a');
	ListInsert(h,2,'b');
	ListInsert(h,3,'c');
	ListInsert(h,4,'d');
	ListInsert(h,5,'e');
	printf("(3)输出循环双链表h:");
	DispList(h);
	printf("(4)循环双链表h长度=%d\n",ListLength(h));
	printf("(5)循环双链表h为%s\n",(ListEmpty(h)?"空":"非空"));
	GetElem(h,3,e);
	printf("(6)循环双链表h的第3个元素=%c\n",e);
	printf("(7)元素a的位置=%d\n",LocateElem(h,'a'));
	printf("(8)在第4个元素位置上插入f元素\n");
	ListInsert(h,4,'f');
	printf("(9)输出循环双链表h:");
	DispList(h);
	printf("(10)删除h的第3个元素\n");
    	ListDelete(h,3,e);
	printf("(11)输出循环双链表h:");
	DispList(h);
	printf("(12)释放循环双链表h\n");
	DestroyList(h);
}
Esempio n. 20
0
void main()
{
	SqList *L;
	ElemType e;
	printf("(1)初始化顺序表L\n");
	InitList(L);
	printf("(2)依次采用尾插法插入a,b,c,d,e元素\n");
	ListInsert(L,1,'a');
	ListInsert(L,2,'b');
	ListInsert(L,3,'c');
	ListInsert(L,4,'d');
	ListInsert(L,5,'e');
	printf("(3)输出顺序表L:");
	DispList(L);
	printf("(4)顺序表L长度=%d\n",ListLength(L));
	printf("(5)顺序表L为%s\n",(ListEmpty(L)?"空":"非空"));
	GetElem(L,3,e);
	printf("(6)顺序表L的第3个元素=%c\n",e);
	printf("(7)元素a的位置=%d\n",LocateElem(L,'a'));
	printf("(8)在第4个元素位置上插入f元素\n");
	ListInsert(L,4,'f');
	printf("(9)输出顺序表L:");
	DispList(L);
	printf("(10)删除L的第3个元素\n");
    	ListDelete(L,3,e);
	printf("(11)输出顺序表L:");
	DispList(L);
	printf("(12)释放顺序表L\n");
	DestroyList(L);
}
Status	LinkListInsert(LinkList *L, int i, ElemType e)
/* 在带头结点的单链表L的第i个元素之前插入元素e
 */
{
	int iLen = ListLength(*L), nCnt = 0;
	Link pNode = L->head,
		pHead = L->head,
		pNewNode = NULL;

	if ((i <= 0) || (i > iLen) )	// i值不合法
	{
		return ERROR;
	}
	pNewNode = (Link)calloc(1, sizeof(LNode));
	if (pNewNode == NULL)
		return ERROR;
	pNewNode->data = e;

	while (pNode && (nCnt<i-2))
	{
		nCnt++;
		pNode = pNode->next;
	}
	pNewNode->next = pNode->next;
	pNode->next = pNewNode;

	/* Restore the head link L
	 */
	L->head = pHead;
	L->len++;

	return OK;
}
Esempio n. 22
0
void Union1(Sqlist &La, Sqlist &Lb)
{
    ElemType e;
    int i;
    int la_len, lb_len;
    la_len = ListLength(La);
    lb_len = ListLength(Lb);

    for ( i = 1; i <= lb_len; i++ )
    {
        GetElem(Lb, i, e);
        printf("e = %d\n", e);
        if ( !LocateElem(La, e, equal) )
            ListInsert_before(La, ++la_len, e);
    }
}
int main(void)
{
    /// create list
    SqList List;
    InitList(&List);
    /// insert element to list
    ListInsert(&List, 1, 1);
    ListInsert(&List, 2, 2);
    ListInsert(&List, 3, 3);
    ListInsert(&List, 4, 4);
    ListInsert(&List, 5, 5);
    /// locate element
    printf("element %d is in %d\n", 4, LocateElem(&List, 4));
    /// list length
    int length = ListLength(&List);
    printf("List length is %d\n", length);
    /// get list element
    int i, element;
    for (i = 1; i <= length; i++) {
        GetElem(&List, i, &element);
        printf("element in %d is %d\n", i, element);
    }
    /// delect element from list
    ListDelete(&List, 4, &element);
    printf("deleted element in %d is %d\n", 4, element);
    /// clear list
    ClearList(&List);
    printf("List empty is %d\n", ListEmpty(&List));
    return EXIT_SUCCESS;
}
Esempio n. 24
0
int main()
{
	struct SqList L;
	InitList(&L);
	printf("ListEmpty(L) = %d\n", ListEmpty(L));
	printSqList(L);
	
	int e;
	int index = 7;
	GetElem(L, index, &e);
	printf("the %d th number is e : %d\n", index, e);
	printf("Find %d at index %d\n", e, Locate(L, e));


	int insertNum = 100;
	ListInsert(&L, index, 100);
	printf("Insert %d at index %d  into SqList\n", insertNum, index);
	printSqList(L);

	ListDelete(&L, index, &e); 
	printf("Delete %d at index %d from SqlList\n", e, index);
	printSqList(L);
	
	printf("ListLength(L) = %d\n", ListLength(L));

    ClearList(&L);
	printf("ListEmpty(L) = %d\n", ListEmpty(L));
	printSqList(L);

	return 0;
}
Esempio n. 25
0
void unionL(sqList *La,sqList Lb)
{
	int La_len,Lb_len,i;
	ElemType e;
	
	La_len =ListLength(*La);
	Lb_len =ListLength(Lb);
	
	for (i=1; i< Lb_len;i++) {
		GetElem(Lb,i,&e);
		if(!LocateElem(*La,e))
		{
			ListInsert(La,++La_len,e);
		}
	}
}
Esempio n. 26
0
int_t ListLength(const char * nam, FObject lst)
{
    int_t ll = ListLength(lst);
    if (ll < 0)
        RaiseExceptionC(R.Assertion, nam, "expected a list", List(lst));

    return(ll);
}
Esempio n. 27
0
static int ListLength(listADT list)
{
    if (list == NULL) {
        return (0);
    } else {
        return (ListLength(ListTail(list)) + 1);
    }
}
Esempio n. 28
0
/**************************************************
函数功能:插入元素
参数1:链表头指针
参数2:插入位置
参数3:插入元素
参数4:函数指针,指出为链表数据赋值的方式
返回值:
说明:插入位置从1开始,为第n个位置;
     在第n个位置插入,原第n个元素变为第n+1个。
     当链表为空链表时,也可以在第一个位置插入;
	 不能在第 ListLength(L)+1 处插入。
头文件: <assert.h>
        <stdlib.h>
		<stdio.h>
作者: Lee.C
完成时间:2015-05-10
修改时间:2016-05-04
修改说明:代码重构
**************************************************/
void InsertLinkListItem(LinkList L, size_t n, const LinkListItem *e, void (*Assgin)(LinkListItem *dst, const LinkListItem *src))
{
	//不断言 L->next ,当只有头结点时,也可以在第一个位置插入元素
	assert(L);
	assert(n >= 1 && n <= ListLength(L));

	/*******************************************
	 * prior : 指向链表当前要插入节点位置的前一个节点,
	           初始值为指向链表头节点的指针
	 * current : 新分配的待插入的节点
	 * priorPos : 记录着哪个节点,从第1个节点算起
	*******************************************/
	LNode *prior = L;
	LNode *current = NULL;
	size_t priorPos = 1;


	//由于prior指向的是头节点,所以priorPos<n找到的是第n-1个节点
	//前一个条件保证可以最多只能指向链表最后一个节点
	while(prior && priorPos < n)
	{
		prior = prior->next;
		priorPos++;
	}
	
	
	if(!prior || priorPos > n)
	{
		fputs("Call InsertItem() ERROR(1) !\n",stdout);
		fprintf(stdout, "The List`s length is %lu,the insert location %lu is overflow\n", ListLength(L), n);
		exit(EXIT_FAILURE);
	}
		 
	current=(LNode *)malloc(sizeof(LNode));
	if(current == NULL)
	{
		fputs("Call InsertItem() ERROR(2) !\n", stdout);
		exit(EXIT_FAILURE);
	}

	Assgin(&current->data, e);
	current->next = prior->next;
	prior->next = current;

}
Esempio n. 29
0
/* 得到顺序表的第i个元素 */
bool GetElem(SeqList L, int i, DataType *e)
{
	if(i < 1 || i > ListLength(L)) /* 在查找第i个元素之前,先判断该序号是否合法*/
		return false;

	*e = L.list[i - 1];  /* 将第i个元素的值赋给e */

	return true;
}
Esempio n. 30
0
 static Status GetElem(SLinkList L,int i,ElemType &e)
 { // 用e返回L中第i个元素的值
   int l,k=MAXSIZE-1; // k指向表头序号
   if(i<1||i>ListLength(L))
     return ERROR;
   for(l=1;l<=i;l++) // 移动到第i个元素处
     k=L[k].cur;
   e=L[k].data;
   return OK;
 }