线性表例题
数据结构习题及答案 (2)

第二章线性表一、选择题1.一个线性表第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是( )(A)110 (B)108(C)100 (D)120参考答案:B2. 向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动()个元素。
(A)64(B)63 (C)63.5 (D)7参考答案:C3.线性表采用链式存储结构时,其地址()。
(A) 必须是连续的 (B) 部分地址必须是连续的(C) 一定是不连续的 (D) 连续与否均可以参考答案:D4. 在一个单链表中,若p所指结点不是最后结点,在p之后插入s所指结点,则执行()(A)s->next=p;p->next=s; (B) s->next=p->next;p->next=s;(C)s->next=p->next;p=s; (D)p->next=s;s->next=p;参考答案:B5.在一个单链表中,若删除p所指结点的后续结点,则执行()(A)p->next=p->next->next; (B)p=p->next; p->next=p->next->next;(C)p->next=p->next; (D)p =p->next->next;参考答案:A6.下列有关线性表的叙述中,正确的是()(A)线性表中的元素之间隔是线性关系(B)线性表中至少有一个元素(C)线性表中任何一个元素有且仅有一个直接前趋(D)线性表中任何一个元素有且仅有一个直接后继参考答案:A7.线性表是具有n个()的有限序列(n≠0)(A)表元素(B)字符(C)数据元素(D)数据项参考答案:C二、判断题1.线性表的链接存储,表中元素的逻辑顺序与物理顺序一定相同。
()2.如果没有提供指针类型的语言,就无法构造链式结构。
()3.线性结构的特点是只有一个结点没有前驱,只有一个结点没有后继,其余的结点只有一个前驱和后继。
数据结构(线性表)习题与答案

一、单选题1、在长度为n的顺序表中的第i( 1 <= i <= n+1 )个位置上插入一个元素,其算法时间复杂度为()。
A.O(n*n)B.O(log2n)C.O(1)D.O(n)正确答案:D2、在长度为n的顺序表中的第i( 1 =< i <= n+1 )个位置上插入一个元素,需要移动的元素个数为()。
A.iB.n-i+1C.n-i-1D.n-i正确答案:B3、链表不具有的特点是()。
A.插入、删除不需要移动元素B.不必事先估计存储空间C.可随机访问任一元素D.所需存储空间与线性表程度成正比正确答案:C4、在一单链表中,删除指针p所指的后继结点,以下语句正确的是()。
A.p->next=p->next->next; free(p->next);B. p=p->next;C.free(p->next);p->next=p->next->next;D.s=p->next;p->next=s->next;free(s);正确答案:D5、假设删除长度为n的顺序表中的每个元素的概率相同,则删除一个元素平均要移动的元素个数是()。
A.nB.n/2C.(n-1)/2D.(n+1)/2正确答案:C6、设某顺序表中第一个元素的地址是Base,每个结点占m个单元,则第i个结点的地址为()。
A.Base+(i-1)×mB.Base+(i+1)×mC.Base-i×mD.Base+i×m正确答案:A7、长度为n的非空线性表采用顺序存储结构,在表的第i个位置插入一个数据元素,i 的合法值应该是()。
A.1≤i≤n-1B.0≤i≤n+1C.i>0D.1≤i≤n+1正确答案:D解析:一般插入位置从1开始。
8、非空单链表结点结构为【data,next】,若指针p所指结点是尾结点,则()表达式为真。
第二章线性表

第二章线性表第二章线性表一、选择题1.线性表是具有n个__C___的有限序列(n>0)。
A.表元素B.字符C.数据元素D.数据项2.一个顺序表所占用的存储空间大小与___B___无关。
A.表的长度C.元素的类型B.元素的存放顺序D.元素中各字段的类型3.线性表的顺序存储结构是一种__A___。
A.随机存取的存储方式C.索引存取的存储方式B.顺序存取的存储方式D.Hash存取的存储方式4. 若线性表采用顺序存储结构,每个元素占用4 个存储单元,第一个元素的存储地址为100,则第12 个元素的存储地址是__B____。
A.112 B.144 C.148 D.4125. 线性表是__A____。
A.一个有限序列,可以为空B.一个有限序列,不能为空C.一个无限序列,可以为空D.一个无限序列,不能为空6.对于顺序存储的线性表,访问结点和增加、删除结点的时间复杂度为__C____。
A.O(n)O(n)B.O(n)O(1)C.O(1)O(n)D.O(1)O(1) 7.若长度为n的非空线性表采用顺序存储结构,删除表的第i个数据元素,首先需要移动表中___A____中数据元素。
A.n-i B.n+i C.n-i+1 D.n-i-1 8.对顺序存储的线性表,设其长度为n,在任何位置插入或删除操作都是等概率的。
删除一个元素时平均要移动表中的____C____个元素。
A.n/2 B.(n+1)/2 C.(n-1)/2 D.n 9.若长度为n的线性表采用顺序存储结构,在其第i个位置插入一个新元素的算法的时间复杂度为__C____。
(1≤i≤n+1)A.O(0)B.O(1)C.O(n)D.O(n2)10.线性表中各链接点之间的地址___C____。
A.必须连续B.部分地址必须连续C.不一定连续D.连续与否无所谓11.在n个结点的线性表的数组表示中,算法的时间复杂度是O(1)的操作是_A______。
A.访问第i个结点后插入一个新结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n)B.在第i个结点后插入一个新结点(1≤i≤n)C.删除第i 个结点(1≤i≤n)D.以上都不对12.单链表中,增加一个头结点的目的是为了____C_____。
数据结构-线性表习题及解析

线性表典型例题一、单项选择题[例7-1]在数据结构中,与所使用计算机无关的数据叫( ①)结构;链表是一种采用( ②)存储结构存储的线性表;链表适用于( ③)查找;在链表中进行( ④)操作的效率比在线性表中进行该操作的效率高。
①A.存储B.物理C.逻辑D.物理和逻辑②A.顺序B.网状C.星式D.链式③A.顺序B.二分法C.顺序及二分法D.随机④A.二分法查找B.快速查找C.顺序查找D.插入解析:本题考查的是基本概念。
本题答案为:①C;②D;③A;④D。
[例7-2] 链表不具备的特点是( )。
A.插入和删除不需要移动元素B.可随机访问任一结点C.不必预分配空间D.所需空间与其长度成正比解析:线性表可随机访问任一结点,而链表必须从第一个数据结点出发逐一查找每个结点。
本题答案为:B。
[例7-3] 不带头结点的单链表head为空的判定条件是( )。
A.head==NULL B.head_>next==NULLC.head_>next==head D.head!=NULL解析:在不带头结点的单链表head中,head指向第一个数据结点。
空表即该表没有结点,head==NULL表示该单链表为空。
本题答案为:A。
[例7-4] 带头结点的单链表head为空的判定条件是( )。
A.head==NULL B.head—>next==NULLC.head—> next==head D.head!=NULL解析:在带头结点的单链表head中,head指向头结点。
空表即该表只有头结点,head —>next==NULL表示该单链表为空。
本题答案为:B。
[例7-5] 带头结点的循环单链表head中,head为空的判定条件是( )。
A.head==NULL B.head—>next==NULLC.head—> next==head D.head!=NULL解析:在带头结点的循环单链表head中,head指向头结点。
数据结构与算法(线性表)练习题

三、写一个算法合并两个已排序的线性表。
〔用两种方法:数组表示的线性表〔顺序表〕和指针表示的线性表〔链表〕〕要求:1、定义线性表节点的结构,并定义节点的型和位置的型。
2、定义线性表的基本操作3、在1,2的基础上,完成此题。
4、在main 函数中进行测试:先构建两个有序的线性表,然后合并这两个线性表。
四、已知一个单向链表,试给出复制该链表的算法。
要求:1、定义线性表的节点的结构以及节点的型和位置的型。
2、定义线性表的基本操作3、在1,2的基础上,完成此题。
4、在main 函数中进行测试:先构建一个线性表,并定义一个空线性表,然后进行复制。
五、写出从一个带表头的单链表中删除其值等于给定值x 的结点的算法函数:int delete(LIST &L, int x);如果x 在该链表中,则删除对应结点,并返回其在链表中的位置〔逻辑位置,第一个结点的逻辑位置为1〕,否则返回-1。
要求:1、定义线性表的节点的结构以及节点的型和位置的型。
2、定义线性表的基本操作3、在1,2的基础上,完成此题。
4、在main 函数中进行测试:先构建一个线性表,然后调用函数删除值等于给定值的节点。
六、写出一个将两个静态链表〔属于同一个存储池〕合并的算法函数:void Merge(cursor M, cursor N); 合并的方法是将N 链表中的所有结点添加到M 链表的后面,并将N 链表的表头结点添加到空闲结点链表中。
要求:1、定义静态链表的结点的结构以及结点的型SPACE 以及位置〔position 〕和游标〔cursor 〕的型。
2、定义静态链表的基本操作:void Initialize(); 初始化,将所有存储池中的结点设置为空闲;cursor GetNode(); 从空闲链中获取一个结点;void FreeNode(cursor q); 将结点q 加入到空闲链; void Insert ( elementtype x, position p, cursor M ); 在链表M 中的位置为p 的元素后面添加一个值为x 的结点;void Delete (cursor M, position p ); 在链表M 中删除位置为p 的元素的后一个元素。
第二章线性表例题

例3.设有一个顺序表L,其元素为整型数 据,设计一个算法将L中所有小于0的整 数放在前半部分,大于等于0的整数放在 后半部分。
算法思路 从L的两端查找,前端找大于等于0的元素 (位置为i),后端找小于0的元素(位置为 j),然后将两位置的元素交换。
9
Status Move(SqList &L) { ElemType temp; int i=0,j=L.length-1; while( i<j ) { while( i<j && L.elem[ i ]<0) i++; //从前向后找大于等于0的元素 while( i<j && L.elem[ j ]>=0 ) j--; // 从后向前找小于0的元素 if ( i<j ) //交换L.elem[i]和L.elem[j] { temp=L.elem[ i ]; L.elem[ i ]=L.elem[ j ]; L.elem[ j ]=temp; } } 10 }
19
例3:已知非空线性链表L的链结点按结点数 据域值非递减链接,请写一算法,删除链表 中数据域值相同的多余链结点。
算法思路: 算法设置一指针变量p,从链表的第一个链结点开 始到链表最后那个链结点,依次判断当前p指的链 结点与其直接后继结点的值是否相同,若相同, 则删除其后继结点,否则,p移到下一个链结点。
பைடு நூலகம்
线性表链式存储
typedef struct Lnode { elemtype data; // 数据域 struct Lnode *next; // 指针域 }Lnode, *linklist;
15
例1:已知非空线性链表L,请写一逆转该线 性链表的算法。
数据结构--线性表习题及答案

数据结构--线性表习题及答案第⼆章线性表⼀、选择题1、若长度为n的线性表采⽤顺序存储结构,在其第i个位置插⼊⼀个新元素算法的时间复杂度()。
A. O(log2n)B.O(1)C. O(n)D.O(n2)2、若⼀个线性表中最常⽤的操作是取第i个元素和找第i个元素的前趋元素,则采⽤()存储⽅式最节省时间。
A. 顺序表B. 单链表C. 双链表D. 单循环链表3、具有线性结构的数据结构是()。
A. 图B. 树C. ⼴义表D.栈4、在⼀个长度为n的顺序表中,在第i个元素之前插⼊⼀个新元素时,需向后移动()个元素。
A. n-iB. n-i+1C. n-i-1D. i5、⾮空的循环单链表head的尾结点p满⾜()。
A. p->next==headB. p->next==NULLC. p==NULLD. p==head6、链表不具有的特点是()。
A. 可随机访问任⼀元素B. 插⼊删除不需要移动元素C. 不必事先估计存储空间D. 所需空间与线性表长度成正⽐7、在双向循环链表中,在p指针所指的结点后插⼊⼀个指针q所指向的新结点,修改指针的操作是()。
A. p->next=q;q->prior=p;p->next->prior=q;q->next=q;B. p->next=q;p->next->prior=q;q->prior=p;q->next=p->next;C. q->prior=p;q->next=p->next;p->next->prior=q;p->next=q;D. q->next=p->next;q->prior=p;p->next=q;p->next=q;8、线性表采⽤链式存储时,结点的存储地址()。
A. 必须是连续的B. 必须是不连续的C. 连续与否均可D. 和头结点的存储地址相连续9、在⼀个长度为n的顺序表中删除第i个元素,需要向前移动()个元素。
数据结构线性表十道题

线性表,以前交过的十道题1.假设有两个按元素值递增次序排列的线性表,均以单链表形式存储,请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来的两个单链表的结点存放归并后的单链表。
【北京大学1998LinkedList Union(LinkedList la,lb)//la.,lb分别是带头结点的两个单链表的头指针,链表中的元素值按递增序列排列,本算法将两个链表合成一个按元素递减次序排列的单链表。
{pa=la->next;pb=lb->next;//pa,pb分别是链表la和lb的工作指针la->next=null; //la作结果链表的头指针,先将结果链表初始化为空while(pa!=null&&pb!=null) //当两链表均不为空时作if (pa->data<=pb->data){ r=pa->next; //将pa的后结继结点暂存于r。
pa->next=la->next;//将pa结点链于结果表中,同时逆置la->next=pa;pa=r; //恢复pa为当前的比较结点。
}else{ r=pb->next; //将pb的后继结点暂存于r。
pb->next=la->next; //将pb结点链接于结果表中,同时逆置la->next=pb;pb=r; //恢复pb为当前的比较结点。
}while (pa!=null){r=pa->next;pa->next=la->next;la->next=pa;pa=r;}while (pb!=null){r=pb->next;pb->next=la->next;la->next=pb;pb=r;}}2 带头结点且头指针ha和hb的两线性表A和B分别表示两个集合,两表中的元表皆为递增有序,请写一算法求A和B的并集AUB,要求该并集中的元表仍保持递增有序,且要利用A和B的原有结点空间LinkedList Union(LinkedList ha,hb)//线性表A和B代表两个集合,以链式存储结构存储,元素递增有序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例1说明在线性表的链式存储结构中,头指针与头结点之间的根本区别;头结点与首元结点的关系。
答:在线性表的链式存储结构中,头指针是指指向链表的指针,若链表有头指针则是链表的头结点的指针,头指针具有标识作用,故常用头指针冠以链表的名字。
头结点是为了操作的统一、方便而设立的,放在第一数据元素结点之前,其数据域一般无意义(当然有些情况下也可存放链表的长度、用作监视哨,等等),有了头结点后,对在第一数据元素结点前插入结点和删除第一结点,其操作与对其它结点的操作就统一了。
而且无论链表是否为空,头指针均不为空。
首元结点也就是第一数据元素结点,它是头结点后边的第一个结点。
例2 为什么在单循环链表中设置尾指针比设置头指针更好?答:尾指针是指指向终端结点的指针,用它来表示单循环链表可以使得查找链表的开始结点和终端结点都很方便,设一个带头结点的单循环链表,其尾指针是rear,则开始结点和终端结点分别为指针rear所指结点的后继结点的后继结点和指针rear所指结点(利用C语言分别描述为rear->next->next和rear,利用标准Pascal语言分别描述为rear↑.next↑.next和rear),查找时间均为O(1)。
若用头指针来表示该链表,则查找时间均为O(n)。
例3请分析含有n个结点的顺序表,在进行插入和删除操作时的时间复杂度,并对计算的结果进行分析,由此可得到线性表的适用范围的什么结论。
解:值得注意的是,插入操作是指在某个元素前面或后面插入,是针对位置的,因此可插入的位置为n+1个,而删除操作是删除线性表中某个位置上的元素,是针对元素的,因此可删除的元素为n个。
设p i为在第i个元素之前插入一个元素的概率,在等概率的条件下,其值为1/(n+1)。
在第i个元素之前插入一个元素需要移动的元素的个数为:n-i+1。
所以,在长度为n的线性表中插入一个元素所需要移动的元素次数的数学期望值(平均次数)为:E in=∑+=+ -11)1 (niiinp=n/2同理,设q i为删除第i个元素的概率,在等概率的条件下,其值为1/n。
删除第i 个元素需要移动的元素的个数为:n-i。
所以,在长度为n的线性表中删除一个元素所需要移动的元素次数的数学期望值(平均次数)为:E del=∑=-niiinq1)(=(n-1)/2由于这两个操作的时间主要消耗在数据元素的移动上,所以插入算法和删除算法的时间复杂度均为:O(n)。
从上述分析可知,在顺序存储结构下,在线性表上插入或删除一个元素时需要平均移动线性表长度一半的元素个数,因此当n的值较大时,在顺序结构下,不宜对它频繁进行插入和删除操作。
附注:分析给定算法的复杂度,是一种常见的题目。
例4请给出线性表的顺序存储和链式存储结构选择的原则。
答:在实际应用中,主要根据具体问题的要求和性质,再结合顺序存储结构和链式存储结构的特点来决定,通常从以下几个方面考虑:(1)存储空间。
顺序存储结构要求事先分配其存储空间(即静态分配),所以难以估计存储空间的大小,估计过大会浪费存储空间,估计过小会造成存储空间的溢出。
链式存储结构的存储空间是动态分配的,只要机器中有空闲空间,就不会造成存储空间的溢出。
另外,还可以从存储密度的角度考虑,存储密度定义为:存储密度=结点数据本身占用的存储量/结点结构占用的存储量一般来说,存储密度越大,存储空间的利用率就越高。
显然,顺序存储结构的存储密度为1,而链式存储结构的存储密度小于1。
(2)运算时间。
顺序存储结构是已知的随机存储结构,便于元素的随机存储,即表中每个元素都可以在O(1)时间复杂度下迅速存取。
而链式存储结构中为了访问一个结点必须从头指针开始顺序查找,时间复杂度为O(n),故对于只进行查找操作而很少进行插入和删除操作的情况,采用顺序存储是比较合适的。
但是,在顺序存储结构上进行元素的插入和删除操作时,则需要大量元素的移动,尤其是线性表较长的情况。
在这种情况下,采用链式存储结构较好,因为在这种存储结构上进行插入和删除操作时,不需要元素的移动而效率较高。
(3)程序设计语言。
在不支持指针的概念和指针类型的程序设计语言中,可以采用静态链表(即利用游标实现)的方法来模拟动态存储结构。
对于问题规模不大的问题,采用静态链表来实现更加方便。
例5假设一个单循环链表,其结点含有三个域pre、data和next,其中data为数据域;pre为指针域,它的值为空指针;next为指针域,它指向后继结点。
请设计一个算法,将此表改成双向循环链表。
解:算法的基本思想是根据已知的单链表,一边复制数据,一边产生双向链表,最后首尾相连。
假设指针head指向链表的头结点。
算法描述如下:A1.//处理头结点[ A1.1. 令指针p指向指针head所指结点的后继结点;A1.2. p.pre←head;A1.3. q←p;A1.4. p←p.next; //指针p指向其所指结点的后继结点]A2.循环:当指针p≠head时,重复执行//修改结点的指针域pre,指针p所指向的结点为需要修改的结点,指针q所指向的结点为其前一结点[ A2.1. p.pre←q;A2.2. q←p; //将指针q指向指针p所指向的结点A2.3. p←p.next;]A3. //处理头结点的pre域head.pre←q;A4.算法结束.附注:本题给出了一种带头结点的双向循环链表的表示和构造方法。
以下例题线性表的遍历及其应用线性表的遍历是一种非常重要的基本运算,线性表的其它许多运算是基于该运算的。
下面举例介绍。
(1)求线性表的长度例7编写一个递归算法,计算并输出单链表的长度。
解:假设单链表不带头结点,结点结构有数据域data和指针域next,则其长度递归定义为:当单链表为空时,其长度为0,否则其长度为:1+除第一个结点外剩余的单链表的长度。
假设list为单链表的头指针,算法描述如下:listlen(p)[ 若 p为空指针,则len←0;否则len←1+listlen(p.next); //p.next是p所指向的结点的下一结点的地址返回len;]prnlen(p)[ x←listlen(p); 输出x;](2)判断线性表是否递增例8假设p是指向一个单链表的头指针,请写一个判断该线性表是否递增的算法。
解:若线性表是递增的,则输出“线性表是递增的”;否则输出“线性表不是递增的”。
算法描述如下:A1.//准备[ A1.1.flag←1;A1.2.令指针q指向指针p所指结点的后继结点;]A2.循环:当 flag为真且链表不结束时,重复执行[ 如果q.data>p.data,则[ p←q; //将p指针指向指针q所指的结点q←q.next; //指针q向下移动,指向其后继结点]否则 flag←0;]A3.如果 flag=1,则输出“线性表是递增的”;否则输出“线性表不是递增的”;A4. 算法结束.(3)线性表的输出基于顺序结构的线性表的输出比较简单,这里就不再赘述了。
下面介绍基于单链表存储结构的线性表的输出。
例9假设la是带头结点的单链表的头指针,试写一个逆序输出线性表的各结点的算法。
解:本题可先将单链表中的数据元素存放到一个数组中,然后逆序输出数组中的元素。
算法描述如下:A1.//准备[ i←0;令指针p指向链表的第一个结点;]A2. 循环:当p≠空指针时,重复执行[ A[i]←p.data; i←i+1; p←p.next;]A3.循环:j以-1为步长,从i-1到0,重复执行 [ 输出A[j];]A4.算法结束.例10给定一个带表头结点的单链表,设head为头指针,结点的数据域为data,其为整型数据元素,next为指针域,试写一个算法完成按递增次序输出单链表中各结点的数据元素,并释放结点所占的存储空间。
要求:不允许使用数组作辅助空间。
解:基本思想是不停的查找单链表中的最小元素,找到后就删除当前结点,直到单链表为空时为止。
这里设变量min存放每一趟的最小值。
令指针s和r分别指向最小值结点及其前驱结点,以便在找到具有最小值的结点后进行删除。
算法描述如下:A1.循环:当head.next≠空指针时,重复执行[ A1.1. 令指针 p指向指针head所指结点的后继结点;A1.2. min←p.data;A1.3. s←p; //令指针s指向指针p所指向的结点A1.4. r←head; //令指针r指向指针head所指向的结点A1.5.//查找具有最小数据元素的结点循环:当p≠空指针时,重复执行[ 如果p.data<min,则[ min←p.data; r←q; s←p;]q←p;p←p.next; //指针p后移一个位置]A1.6. //删除最小数据元素的结点[ A1.6.1. r.next←s.next;A1.6.2. 输出s.data;A1.6.3. 释放指针s所指结点;]]A2.释放头结点;A3.算法结束.3.线性表中结点的插入、删除及其应用线性表的基本运算中,结点的插入与删除是最重要的两种运算,许多算法设计与其有关。
(1)线性表中结点的插入与删除例11已知长度为n的线性表A采用顺序存储结构,请写一个时间复杂度为0(n)、空间复杂度为0(1)的算法,该算法删除线性表中所有值为item的数据元素(O(1)表示算法的辅助空间为常量)。
解:在顺序存储的线性表上删除元素,通常要涉及到一系列元素的移动(若删除第i 个元素,则第i+1至第n个元素要依次前移)。
本题要求删除线性表中所有值为item的数据元素,并未要求元素间的相对位置不变。
因此可以考虑设头尾两个指针(i=1,j=n),从两端向中间移动,凡遇到值为item的数据元素时,直接将右端元素左移至值为item 的数据元素位置。
算法描述如下:A1.//准备[ i←0; j←n-1;]A2.循环:当i<j时,重复执行[ A2.1.循环:当i<j且p[i]≠item时,重复执行i←i+1;A2.2.如果i<j,则[ 循环:当i<j且 p[j]=item时,重复执行j←j-1;]A2.3.如果i<j,则 [ p[i]←p[j]; i←i+1; j←j-1;]]A3. 算法结束.例12已知一个双向循环链表,从第二个结点至表尾递增有序。
试编写一个算法将第一个结点删除并插入表中适当位置,使整个链表递增有序。
设此链表没有头结点。
解:双向循环链表自第二个结点至表尾递增有序,要求将第一结点插入到链表中,使整个链表递增有序。
由于已给条件,故应先将第一结点从链表上摘下来,再将其插入到链表中的相应位置上。
由于是双向链表,不必象单链表那样必须知道要插入结点的前驱结点。
双向循环链表的结点结构定义为:(pre,data,next)。