【数据结构】线性表的单链表存储结构表示和实现

前端之家收集整理的这篇文章主要介绍了【数据结构】线性表的单链表存储结构表示和实现前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

数据结构 线性表的单链表存储结构表示和实现

参考代码如下:

  1. /*
  2. 名称:线性表的单链表存储结构表示和实现
  3. 编译环境:VC++6.0
  4. 日期: 2014-3-27
  5. */
  6. #include <stdio.h>
  7. #include <malloc.h>
  8. #include <stdlib.h>
  9.  
  10. typedef int ElemType;
  11.  
  12. // 线性表的单链表存储结构
  13. typedef struct LNode
  14. {
  15. ElemType data; //数据域
  16. struct LNode *next; //指针域
  17. }LNode,*LinkList;
  18.  
  19. // typedef struct LNode *LinkList; // 另一种定义LinkList的方法
  20.  
  21.  
  22. // 构造一个空的线性表L
  23. int InitList(LinkList *L)
  24. {
  25. /*
  26. 产生头结点L,并使L指向此头结点,头节点的数据域为空,不放数据的。
  27. void * malloc(size_t)
  28. 这里对返回值进行强制类型转换了,返回值是指向空类型的指针类型。
  29. */
  30. (*L) = (LinkList)malloc( sizeof(struct LNode) );
  31. if( !(*L) )
  32. exit(0); // 存储分配失败
  33. (*L)->next = NULL; // 指针域为空
  34. return 1;
  35. }
  36.  
  37. // 销毁线性表L,将包括头结点在内的所有元素释放其存储空间。
  38. int DestroyList(LinkList *L)
  39. {
  40. LinkList q;
  41.  
  42. // 由于单链表的每一个元素是单独分配的,所以要一个一个的进行释放
  43. while( *L )
  44. {
  45. q = (*L)->next;
  46. free( *L ); //释放
  47. *L = q;
  48. }
  49. return 1;
  50. }
  51.  
  52. /*
  53. 将L重置为空表,即将链表中除头结点外的所有元素释放其存
  54. 储空间,但是将头结点指针域置空,这和销毁有区别哦。不改变L,所以
  55. 不需要用指针。
  56. */
  57. int ClearList( LinkList L )
  58. {
  59. LinkList p,q;
  60.  
  61. p = L->next; // p指向第一个结点
  62. while( p ) // 没到表尾则继续循环
  63. {
  64. q = p->next;
  65. free( p ); //释放空间
  66. p = q;
  67. }
  68. L->next = NULL; // 头结点指针域为空,链表成了一个空表
  69. return 1;
  70. }
  71.  
  72. // 若L为空表(根据头结点L->next来判断,为空则是空表),则返回1,
  73. // 否则返回0。
  74. int ListEmpty(LinkList L)
  75. {
  76. if( L->next ) // 非空
  77. return 0;
  78. else
  79. return 1;
  80. }
  81.  
  82. // 返回L中数据元素个数。
  83. int ListLength(LinkList L)
  84. {
  85. int i = 0;
  86. LinkList p = L->next; // p指向第一个结点
  87. while(p) // 没到表尾,则继续循环
  88. {
  89. i++;
  90. p=p->next;
  91. }
  92. return i;
  93. }
  94.  
  95. // L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并
  96. // 返回1,否则返回0。
  97. int GetElem(LinkList L,int i,ElemType *e)
  98. {
  99. int j = 1; // j为计数器
  100. LinkList p=L->next; // p指向第一个结点
  101. while(p&&j<i) // 顺指针向后查找,直到p指向第i个元素或p为空
  102. {
  103. p=p->next;
  104. j++;
  105. }
  106.  
  107. if(!p||j>i) // 第i个元素不存在
  108. return 0;
  109. *e = p->data; // 取第i个元素
  110. return 1;
  111. }
  112.  
  113. // 返回L中第1个与e满足关系compare()的数据元素的位序。
  114. // 若这样的数据元素不存在,则返回值为0
  115. int LocateElem(LinkList L,ElemType e,int(*compare)(ElemType,ElemType))
  116. {
  117. int i=0;
  118. LinkList p=L->next;
  119.  
  120. while(p) //将链表的每一个元素进行对比
  121. {
  122. i++;
  123. if(compare(p->data,e)) // 找到这样的数据元素
  124. return i;
  125. p=p->next;
  126. }
  127. return 0;
  128. }
  129.  
  130. // 若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,// 返回1;否则操作失败,pre_e无定义,返回-1
  131. int PriorElem(LinkList L,ElemType cur_e,ElemType *pre_e)
  132. {
  133. LinkList q,p=L->next; // p指向第一个结点
  134. while(p->next) // p所指结点有后继
  135. {
  136. q=p->next; // q为p的后继
  137. if(q->data==cur_e)
  138. {
  139. *pre_e=p->data;
  140. return 1;
  141. }
  142. p=q; // p向后移
  143. }
  144. return -1;
  145. }
  146.  
  147. // 若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,
  148. // 返回1;否则操作失败,next_e无定义,返回-1
  149. int NextElem(LinkList L,ElemType *next_e)
  150. {
  151. LinkList p=L->next; // p指向第一个结点
  152. while(p->next) // p所指结点有后继
  153. {
  154. if(p->data==cur_e)
  155. {
  156. *next_e=p->next->data;
  157. return 1;
  158. }
  159. p=p->next;
  160. }
  161. return -1;
  162. }
  163.  
  164. // 在带头结点的单链线性表L中第i个位置之前插入元素e
  165. int ListInsert(LinkList *L,ElemType e)
  166. {
  167. int j=0;
  168. LinkList p=*L,s;
  169. while(p && j<i-1) // 寻找第i-1个结点
  170. {
  171. p=p->next;
  172. j++;
  173. }
  174. if(!p || j>i-1) // i小于1或者大于表长
  175. return 0;
  176. s=(LinkList)malloc(sizeof(struct LNode)); // 生成新结点
  177. s->data=e; // 插入L中
  178. s->next=p->next;
  179. p->next=s;
  180. return 1;
  181. }
  182.  
  183. // 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
  184. int ListDelete(LinkList *L,ElemType *e)
  185. {
  186. int j = 0;
  187. LinkList p=*L,q;
  188. while(p->next&&j<i-1) // 寻找第i个结点,并令p指向其前趋
  189. {
  190. p=p->next;
  191. j++;
  192. }
  193. if(!p->next||j>i-1) // 删除位置不合理
  194. return 0;
  195. q=p->next; // 删除并释放结点
  196. p->next=q->next;
  197. *e=q->data;
  198. free(q);
  199. return 1;
  200. }
  201.  
  202. // 依次对L的每个数据元素调用函数vi()
  203. int ListTraverse(LinkList L,void(*vi)(ElemType))
  204. {
  205. LinkList p=L->next;
  206. //对所有元素调用函数vi
  207. while(p)
  208. {
  209. vi(p->data);
  210. p=p->next;
  211. }
  212. printf("\n");
  213.  
  214. return 1;
  215. }
  216.  
  217. // 在按非降序排列的线性表L中按非降序插入新的数据元素e
  218. void InsertAscend(LinkList L,ElemType e)
  219. {
  220. LinkList q=L,p=L->next;
  221.  
  222. while(p&&e>p->data)
  223. {
  224. q=p;
  225. p=p->next;
  226. }
  227. q->next=(LinkList)malloc(sizeof(struct LNode)); // e插在q后
  228. q->next->data=e;
  229. q->next->next=p;
  230. }
  231.  
  232. // 按非升序排列的线性表L中按非升序插入新的数据元素e
  233. void InsertDescend(LinkList L,p=L->next;
  234. while(p&&e<p->data)
  235. {
  236. q=p;
  237. p=p->next;
  238. }
  239. q->next=(LinkList)malloc(sizeof(struct LNode)); // e插在q后
  240. q->next->data=e;
  241. q->next->next=p;
  242. }
  243.  
  244. // L的头部插入新的数据元素e,作为链表的第一个元素
  245. int HeadInsert(LinkList L,ElemType e)
  246. {
  247. LinkList s;
  248. s=(LinkList)malloc(sizeof(struct LNode)); // 生成新结点
  249. s->data=e; // 给结点赋值
  250. s->next=L->next; // 插在表头
  251. L->next=s;
  252. return 1;
  253. }
  254.  
  255. // 在L的尾部插入新的数据元素e,作为链表的最后一个元素
  256. int EndInsert(LinkList L,ElemType e)
  257. {
  258. LinkList p=L;
  259. while(p->next) // 使p指向表尾元素
  260. p=p->next;
  261. p->next=(LinkList)malloc(sizeof(struct LNode)); // 在表尾生成新结点
  262. p->next->data=e; // 给新结点赋值
  263. p->next->next=NULL; // 表尾
  264. return 1;
  265. }
  266.  
  267. // 删除L的第一个数据元素,并由e返回其值
  268. int DeleteFirst(LinkList L,ElemType *e)
  269. {
  270. LinkList p=L->next;
  271. if(p)
  272. {
  273. *e=p->data;
  274. L->next=p->next;
  275. free(p);
  276. return 1;
  277. }
  278. else
  279. return 0;
  280. }
  281.  
  282. // 删除L的最后一个数据元素,并用e返回其值
  283. int DeleteTail(LinkList L,ElemType *e)
  284. {
  285. LinkList p=L,q;
  286. if(!p->next) // 链表为空
  287. return 0;
  288. while(p->next)
  289. {
  290. q=p;
  291. p=p->next;
  292. }
  293. q->next=NULL; // 新尾结点的next域设为NULL
  294. *e=p->data;
  295. free(p);
  296. return 1;
  297. }
  298.  
  299. // 删除表中值为e的元素,并返回1;如无此元素,则返回0
  300. int DeleteElem(LinkList L,ElemType e)
  301. {
  302. LinkList p=L,q;
  303. while(p)
  304. {
  305. q=p->next;
  306. if(q&&q->data==e)
  307. {
  308. p->next=q->next;
  309. free(q);
  310. return 1;
  311. }
  312. p=q;
  313. }
  314. return 0;
  315. }
  316.  
  317. // 用e取代表L中第i个元素的值
  318. int ReplaceElem(LinkList L,ElemType e)
  319. {
  320. LinkList p=L;
  321. int j=0;
  322. //找到第i个元素的位置给p
  323. while(p->next && j<i)
  324. {
  325. j++;
  326. p=p->next;
  327. }
  328. if(j==i)
  329. {
  330. p->data=e;
  331. return 1;
  332. }
  333. else // 表中不存在第i个元素
  334. return 0;
  335. }
  336.  
  337. // 按非降序建立n个元素的线性表
  338. int CreatAscend(LinkList *L,int n)
  339. {
  340. int j;
  341. LinkList p,q,s;
  342. if(n<=0)
  343. return 0;
  344. InitList(L);
  345. printf("请输入%d个元素:(空格)\n",n);
  346. s=(LinkList)malloc(sizeof(struct LNode)); // 第一个结点
  347. scanf("%d",&s->data);
  348. s->next=NULL;
  349. (*L)->next=s;
  350. for(j=1;j<n;j++)
  351. {
  352. s=(LinkList)malloc(sizeof(struct LNode)); // 其余结点
  353. scanf("%d",&s->data);
  354. q=*L;
  355. p=(*L)->next;
  356. while(p&&p->data<s->data) // p没到表尾,且所指元素值小于新值
  357. {
  358. q=p;
  359. p=p->next; // 指针后移
  360. }
  361. s->next=q->next; // 元素插在q的后面
  362. q->next=s;
  363. }
  364. return 1;
  365. }
  366.  
  367. // 按非升序建立n个元素的线性表
  368. int CreatDescend(LinkList *L,&s->data);
  369. q=*L;
  370. p=(*L)->next;
  371. while(p&&p->data>s->data) // p没到表尾,且所指元素值大于新值
  372. {
  373. q=p;
  374. p=p->next; // 指针后移
  375. }
  376. s->next=q->next; // 元素插在q的后面
  377. q->next=s;
  378. }
  379. return 1;
  380. }
  381.  
  382. // 返回表头元素的值
  383. int GetFirstElem(LinkList L,ElemType *e)
  384. {
  385. LinkList p=L->next; //第一个结点给p
  386. if(!p) // 空表
  387. return 0;
  388. else // 非空表
  389. *e=p->data;
  390. return 1;
  391. }
  392.  
  393.  
  394. // 逆位序(插在表头)输入n个元素的值,建立带表头结构的单链线性表L
  395. void CreateList(LinkList *L,int n)
  396. {
  397. int i;
  398. LinkList p;
  399. // 先建立一个带头结点的空单链表,相当于初始化单链表
  400. *L=(LinkList)malloc(sizeof(struct LNode));
  401. (*L)->next=NULL;
  402. printf("请输入%d个数据\n",n);
  403. for(i=n;i>0;--i)
  404. {
  405. p=(LinkList)malloc(sizeof(struct LNode)); // 生成新结点
  406. scanf("%d",&p->data); // 输入元素值
  407. p->next=(*L)->next; // 插入到表头
  408. (*L)->next=p;
  409. }
  410. }
  411.  
  412. // 正位序(插在表尾)输入n个元素的值,建立带表头结构的单链线性表
  413. void CreateList2(LinkList *L,int n)
  414. {
  415. int i;
  416. LinkList p,q;
  417. // 先建立一个带头结点的空单链表,相当于初始化单链表
  418. *L=(LinkList)malloc(sizeof(struct LNode)); // 生成头结点
  419. (*L)->next=NULL;
  420. q=*L;
  421. printf("请输入%d个数据\n",n);
  422. for(i=1;i<=n;i++)
  423. {
  424. p=(LinkList)malloc(sizeof(struct LNode));
  425. scanf("%d",&p->data);
  426. q->next=p;
  427. q=q->next;
  428. }
  429. p->next=NULL;
  430. }
  431.  
  432. // 已知单链线性表La和Lb的元素按值非递减排列。
  433. // 归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列
  434. void MergeList(LinkList La,LinkList *Lb,LinkList *Lc)
  435. {
  436. LinkList pa=La->next,pb=(*Lb)->next,pc;
  437. *Lc=pc=La; // 用La的头结点作为Lc的头结点
  438. while(pa&&pb)
  439. {
  440. if(pa->data <= pb->data)
  441. {
  442. pc->next=pa;
  443. *Lc=pa;
  444. pa=pa->next;
  445. }
  446. else
  447. {
  448. pc->next=pb;
  449. pc=pb;
  450. pb=pb->next;
  451. }
  452. }
  453. pc->next=pa ? pa : pb; // 插入剩余段
  454. free(*Lb); // 释放Lb的头结点
  455. Lb=NULL;
  456. }
  457.  
  458.  
  459. // 判断是否相等的函数,Union()用到
  460. int equal(ElemType c1,ElemType c2)
  461. {
  462. if(c1==c2)
  463. return 1;
  464. else
  465. return 0;
  466. }
  467.  
  468. // 将所有在线性表Lb中但不在La中的数据元素插入到La中
  469. void Union(LinkList La,LinkList Lb)
  470. {
  471. ElemType e;
  472. int La_len,Lb_len;
  473. int i;
  474. La_len=ListLength(La); // 求线性表的长度
  475. Lb_len=ListLength(Lb);
  476. for(i=1;i<=Lb_len;i++)
  477. {
  478. GetElem(Lb,i,&e); // 取Lb中第i个数据元素赋给e
  479. if(!LocateElem(La,e,equal)) // La中不存在和e相同的元素,则插入之
  480. ListInsert(&La,++La_len,e);
  481. }
  482. }
  483.  
  484. // 数据元素判定函数(相等为1,否则为0)
  485. int comp(ElemType c1,ElemType c2)
  486. {
  487. if(c1==c2)
  488. return 1;
  489. else
  490. return 0;
  491. }
  492.  
  493. void visit(ElemType c)
  494. {
  495. printf("%d ",c);
  496. }
  497.  
  498. int main()
  499. {
  500. LinkList L,La,Lb,Lc;
  501. ElemType e,e0,d;
  502. int i,j,n,k;
  503. //初始化一个单链表
  504. i=InitList(&L);
  505. //通过插入操作创建一个单链表
  506. for(j=1;j<=5;j++)
  507. i=ListInsert(&L,1,j);
  508. //调用visit函数,对单链表进行遍历
  509. printf("在L的表头依次插入1~5后:L=");
  510. ListTraverse(L,visit); // 依次对元素调用visit(),输出元素的值
  511. //判断单链表是否为空
  512. i=ListEmpty(L);
  513. printf("L是否空:i=%d(1:是 0:否)\n",i);
  514. //清空单链表
  515. i=ClearList(L);
  516. printf("清空L后:L=");
  517. ListTraverse(L,visit);
  518. //判断单链表是否为空
  519. i=ListEmpty(L);
  520. printf("L是否空:i=%d(1:是 0:否)\n",i);
  521. //再次通过插入操作创建一个单链表
  522. for(j=1;j<=10;j++)
  523. ListInsert(&L,j);
  524. printf("在L的表尾依次插入1~10后:L=");
  525. ListTraverse(L,visit);
  526. //取得单链表的第5个元素
  527. GetElem(L,5,&e);
  528. printf("第5个元素的值为:%d\n",e);
  529. //在单链表中找到和j满足comp函数关系的元素
  530. for(j=0;j<=1;j++)
  531. {
  532. k=LocateElem(L,comp);
  533. if(k)
  534. printf("第%d个元素的值为%d\n",k,j);
  535. else
  536. printf("没有值为%d的元素\n",j);
  537. }
  538. //找到某个元素的前驱
  539. for(j=1;j<=2;j++) // 测试头两个数据
  540. {
  541. GetElem(L,&e0); // 把第j个数据赋给e0
  542. i=PriorElem(L,&e); // 求e0的前驱
  543. if(i==-1)
  544. printf("元素%d无前驱\n",e0);
  545. else
  546. printf("元素%d的前驱为:%d\n",e);
  547. }
  548. //找到某个元素的后继
  549. for(j=ListLength(L)-1;j<=ListLength(L);j++)// 测试最后两个数据
  550. {
  551. GetElem(L,&e0); // 把第j个数据赋给e0
  552. i=NextElem(L,&e); // 求e0的后继
  553. if(i==-1)
  554. printf("元素%d无后继\n",e0);
  555. else
  556. printf("元素%d的后继为:%d\n",e);
  557. }
  558. //求单链表的表长
  559. k=ListLength(L); // k为表长
  560. //删除操作
  561. for(j=k+1;j>=k;j--)
  562. {
  563. i=ListDelete(&L,&e); // 删除第j个数据
  564. if(i==0)
  565. printf("删除第%d个数据失败\n",j);
  566. else
  567. printf("删除的元素为:%d\n",e);
  568. }
  569. printf("依次输出L的元素:");
  570. ListTraverse(L,visit);
  571.  
  572. //销毁单链表
  573. DestroyList(&L);
  574. printf("销毁L后:L=%u\n\n",L);
  575. printf("按非降序建立n个元素的线性表L,请输入元素个数n: ");
  576. scanf("%d",&n);
  577. CreatAscend(&L,n);
  578. printf("依次输出L的元素:");
  579. ListTraverse(L,visit);
  580. // 按非降序插入元素10
  581. InsertAscend(L,10);
  582. printf("按非降序插入元素10后,线性表L为:");
  583. ListTraverse(L,visit);
  584. // 在L的头部插入12
  585. HeadInsert(L,12);
  586. // 在L的尾部插入9
  587. EndInsert(L,9);
  588. printf("在L的头部插入12,尾部插入9后,线性表L为:");
  589. ListTraverse(L,visit);
  590. i=GetFirstElem(L,&e);
  591. printf("第1个元素是: %d\n",e);
  592. printf("请输入要删除的元素的值: ");
  593. scanf("%d",&e);
  594. i=DeleteElem(L,e);
  595. if(i)
  596. printf("成功删除%d!\n",e);
  597. else
  598. printf("不存在元素%d!\n",e);
  599. printf("线性表L为:");
  600. ListTraverse(L,visit);
  601. printf("请输入要取代的元素的序号 元素的新值: ");
  602. scanf("%d%d",&n,&e);
  603. ReplaceElem(L,visit);
  604. DestroyList(&L);
  605. printf("销毁L后,按非升序重新建立n个元素的线性表L,请输入"
  606. "元素个数n(>2): ");
  607. scanf("%d",&n);
  608. CreatDescend(&L,visit);
  609. // 按非升序插入元素10
  610. InsertDescend(L,10);
  611. printf("按非升序插入元素10后,线性表L为:");
  612. ListTraverse(L,visit);
  613. printf("请输入要删除的元素的值: ");
  614. scanf("%d",visit);
  615. DeleteFirst(L,&e);
  616. DeleteTail(L,&d);
  617. printf("删除表头元素%d和表尾元素%d后,线性表L为:",d);
  618. ListTraverse(L,visit);
  619. printf("\n");
  620. // 测试算法2.11
  621. n = 3;
  622. CreateList2(&La,n); // 正位序输入n个元素的值
  623. printf("正位创建后La="); // 输出链表La的内容
  624. ListTraverse(La,visit);
  625. CreateList(&Lb,n); // 逆位序输入n个元素的值
  626. printf("逆位创建后Lb="); // 输出链表Lb的内容
  627. ListTraverse(Lb,visit);
  628. DestroyList(&La);
  629. DestroyList(&Lb);
  630. // 测试算法2.12
  631. //初始化一个单链表La
  632. i=InitList(&La);
  633. //通过插入操作创建一个单链表
  634. for(j=2;j<=10;j+=2)
  635. i=ListInsert(&La,j);
  636. printf("La="); // 输出链表La的内容
  637. ListTraverse(La,visit);
  638. //初始化一个单链表
  639. i=InitList(&Lb);
  640. //通过插入操作创建一个单链表
  641. for(j=1;j<=10;j+=2)
  642. i=ListInsert(&Lb,j);
  643. printf("Lb="); // 输出链表Lb的内容
  644. ListTraverse(Lb,visit);
  645. // 按非递减顺序归并La和Lb,得到新表Lc
  646. MergeList(La,&Lb,&Lc);
  647. printf("合并La和Lb后,Lc = "); // 输出链表Lc的内容
  648. ListTraverse(Lc,visit);
  649. // 测试算法2.1
  650. i=InitList(&La);
  651. if(i==1) // 创建空表La成功
  652. for(j=1;j<=5;j++) // 在表La中插入5个元素
  653. i=ListInsert(&La,j);
  654. printf("La= "); // 输出表La的内容
  655. ListTraverse(La,visit);
  656. InitList(&Lb); // 也可不判断是否创建成功
  657. for(j=1;j<=5;j++) // 在表Lb中插入5个元素
  658. i=ListInsert(&Lb,2*j);
  659. printf("Lb= "); // 输出表Lb的内容
  660. ListTraverse(Lb,visit);
  661. Union(La,Lb);
  662. printf("new La= "); // 输出新表La的内容
  663. ListTraverse(La,visit);
  664. system("pause");
  665. return 0;
  666. }
  667. /*
  668. 输出效果
  669.  
  670. 在L的表头依次插入1~5后:L=5 4 3 2 1
  671. L是否空:i=0(1:是 0:否)
  672. 清空L后:L=
  673. L是否空:i=1(1:是 0:否)
  674. 在L的表尾依次插入1~10后:L=1 2 3 4 5 6 7 8 9 10
  675. 第5个元素的值为:5
  676. 没有值为0的元素
  677. 第1个元素的值为1
  678. 元素1无前驱
  679. 元素2的前驱为:1
  680. 元素9的后继为:10
  681. 元素10无后继
  682. 删除第11个数据失败
  683. 删除的元素为:10
  684. 依次输出L的元素:1 2 3 4 5 6 7 8 9
  685. 销毁L后:L=0
  686.  
  687. 按非降序建立n个元素的线性表L,请输入元素个数n: 3
  688. 请输入3个元素:(空格)
  689. 1 3 2
  690. 依次输出L的元素:1 2 3
  691. 按非降序插入元素10后,线性表L为:1 2 3 10
  692. 在L的头部插入12,尾部插入9后,线性表L为:12 1 2 3 10 9
  693. 第1个元素是: 12
  694. 请输入要删除的元素的值: 1
  695. 成功删除1!
  696. 线性表L为:12 2 3 10 9
  697. 请输入要取代的元素的序号 元素的新值: 3 4
  698. 线性表L为:12 2 4 10 9
  699. 销毁L后,请输入元素个数n(>2): 3
  700. 请输入3个元素:(空格)
  701. 1 3 2
  702. 依次输出L的元素:3 2 1
  703. 按非升序插入元素10后,线性表L为:10 3 2 1
  704. 请输入要删除的元素的值: 3
  705. 成功删除3!
  706. 线性表L为:10 2 1
  707. 删除表头元素10和表尾元素1后,线性表L为:2
  708.  
  709. 请输入3个数据
  710. 1 3 2
  711. 正位创建后La=1 3 2
  712. 请输入3个数据
  713. 1 3 2
  714. 逆位创建后Lb=2 3 1
  715. La=10 8 6 4 2
  716. Lb=9 7 5 3 1
  717. 合并La和Lb后,Lc = 9 7 5 3 1 10 8 6 4 2
  718. La= 1 2 3 4 5
  719. Lb= 2 4 6 8 10
  720. new La= 1 2 3 4 5 6 8 10
  721. 请按任意键继续. . .
  722.  
  723. */


运行结果如下:

猜你在找的数据结构相关文章