C++技术支持作业范例:有关动态链表的经典例题

转载 2012年03月28日 22:15:51

/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名称:  有关动态链表的经典例题                          * 作    者:李洪悬                              * 完成日期:   2012      年 4   月  4     日 * 版 本 号:         

* 对任务及求解方法的描述部分 * 输入描述: * 问题描述: * 程序输出: * 程序头部的注释结束 */

#include <stdio.h>

#include <malloc.h> #define MAXSIZE 100 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define NULL 0 struct LNode { int data; struct LNode * next; }; typedef LNode * Link, * Position, Node; struct LLink { Link head, tail; int len; }; typedef LLink LinkList; //创建一个结点,其值为value。 int MakeNode(Link &p, int value) { //p = (Link) malloc(sizeof(Node)); p = (LNode * ) malloc(sizeof(Node)); if (p == NULL) { return ERROR; } p->data = value; p->next = NULL; return OK; } //释放p所指向的结点。 void FreeNode(Link &p) { free(p); p = NULL; } //构造一个空的线性链表L。 int InitList(LinkList &L) { L.head = NULL; L.tail = NULL; L.len = 0; return OK; } //已知h指向线性链表L的第一个结点,将s所指结点插入到h之前。 int InsFirst(LinkList &L, Link h, Link s) { if (s == NULL) { return ERROR; } s->next = h; L.head = s; if (L.tail == NULL) { L.tail = s; } L.len++; return OK; } //删除线性链表L中的第一个结点,并以q返回。 int DelFirst(LinkList &L, Link &q) { if (L.head == NULL) { return ERROR; } q = L.head; L.head = q->next; if (q == L.tail) { L.head = NULL; L.tail = NULL; } L.len--; return OK; } //将指针s所指的一串结点链接在线性表L的尾部。 int Append(LinkList &L, Link s) { if (s == NULL) { return ERROR; } L.tail->next = s; L.len++; while(s->next != NULL) { s = s->next; L.len++; } L.tail = s; return OK; } //删除线性链表L中的尾结点并以q返回。 int Remove(LinkList &L, Link &q) { if (L.len == 0) { return ERROR; } Link p; p = L.head; while (p->next != L.tail) { p = p->next; } q = p->next; p->next = NULL; L.tail = p; L.len--; return OK; } //返回p指示线性链表L中第i个结点的位置,并返回OK,i值不合法时返回ERROR。 int LocatePos(LinkList L, int i, Link &p) { int j; if (i < 0 || i > L.len) { return ERROR; } p = L.head; for (j = 1; j < i; j++) { p = p->next; } return OK; } //已知p指向线性链表L中的一个结点,返回p所指结点的直接前驱的位置。若无直接前驱,则返回NULL。 Position PriorPos(LinkList L, Link p) { if (p == L.head->next) { return NULL; } Link q; q = L.head->next; while (q->next != p) { q = q->next; } return q; } //已知p指向线性链表L中的一个结点,返回p所指结点的直接后继的位置。若无直接后继,则返回NULL。 Position NextPos(LinkList L, Link p) { if (p->next == NULL) { return NULL; } return p->next; } //已知p指向线性链表L中的一个结点,将s所指结点插入在p所指结点之前。 int InsBefore(LinkList &L, Link &p, Link s) { if (s == NULL || p == NULL) { return NULL; } Link q; q = PriorPos(L, p); if (q == NULL) { q = L.head; } q->next = s; s->next = p; //p = s; L.len++; return OK; } //已知p指向线性链表L中的一个结点,将s所指结点插入在p所指结点之后。 int InsAfter(LinkList &L, Link &p, Link s) { if (s == NULL || p == NULL) { return NULL; } if (p == L.tail) { L.tail = s; } s->next = p->next; p->next = s; L.len++; return OK; } //返回线性链表L中头结点的位置。 Position GetHead(LinkList L) { return L.head; } //返回线性链表L中尾结点的位置。 Position GetLast(LinkList L) { return L.tail; } //释放线性链表L。 int FreeList(LinkList &L) { if (L.len == 0) { return OK; } Link p, q; p = GetHead(L); while (p != NULL) { q = p; p = p->next; free(q); } L.head = NULL; L.tail = NULL; L.len = 0; return OK; } //输出线性链表L中的各个结点,并输出头尾指针所指元素值。 int Display(LinkList L) { int i; if (L.head == NULL) { return ERROR; } Link p = L.head; for (i = 1; i <= L.len; i++) { printf("%d ", p->data); p = p->next; } printf("\n"); printf("head value : %d \n", L.head->data); printf("tail value : %d \n", L.tail->data); printf("\n"); return OK; } int main() { int i; Link p; Link q; LinkList La, Lb; //初始化线性链表La。 if (!InitList(La)) { return OVERFLOW; } for (i = 7; i >= 1; i = i -1) { MakeNode(p, i); InsFirst(La, La.head, p); } printf("链表La为:"); Display(La); //初始化线性链表Lb。 if (!InitList(Lb)) { return OVERFLOW; } for (i = 17; i >= 11; i = i -1) { MakeNode(p, i); InsFirst(Lb, Lb.head, p); } printf("链表Lb为:"); Display(Lb); //将链表Lb链接到链表La之后。 printf("两个线性链表想链接La + Lb: \n"); Append(La, Lb.head); Display(La); //删除首结点。 DelFirst(La, q); printf("被删除的首结点值为:%d\n", q->data); FreeNode(q); Display(La); //删除尾结点。 Remove(La, q); printf("删除链表L中的最后一个结点:%d\n",q->data); FreeNode(q); Display(La); //定位第六个元素结点,并用p指针指向该结点。 LocatePos(La, 6, p); Display(La); printf("第六个元素结点数据:%d\n",p->data); //p结点的直接前驱。 q = PriorPos(La, p); Display(La); printf("第六个元素结点数据:%d\n",p->data); printf("第六个元素结点的直接前驱数据是:%d\n",q->data); //p结点的直接后继。 q = NextPos(La, p); Display(La); printf("第六个元素结点数据:%d\n",p->data); printf("第六个元素结点的直接后继数据是:%d\n",q->data); printf("\n"); //在第六个结点前插入值为111的新结点。 printf("在第六个结点前插入值为111的新结点。\n"); MakeNode(q, 111); InsBefore(La, p, q); Display(La); //在原第六个结点后插入值为222的新结点。 printf("在原第六个结点后插入值为222的新结点。\n"); MakeNode(q, 222); InsAfter(La, p, q); Display(La); //输出线性链表La的表头结点。 q = GetHead(La); printf("线性链表La中表头结点的值为:%d\n",q->data); //输出线性链表La的表尾结点。 q = GetLast(La); printf("线性链表La中表尾结点的值为:%d\n",q->data); FreeList(La); Display(La); return 0; }


经验积累:链表是个好东西!要搞懂它!

 

 

 

[C++] 经典练习题与解析(二)

(11) #include struct A { A() { std::cout
  • ZJU_fish1996
  • ZJU_fish1996
  • 2016年08月14日 00:31
  • 1769

最小生成树 Prime算法 简单题

相比于Kruskal算法,Prime算法是以顶点
  • u011699990
  • u011699990
  • 2014年09月23日 18:15
  • 1494

动态链表节点的创建、插入、删除。

动态链表 此仅为一个简单是的动态单链表,至于循环链表和双向链表以后更新。#include #include using namespace std; struct student//定义结构体变量...
  • u012860428
  • u012860428
  • 2014年03月11日 22:26
  • 4532

【c++程序】动态链表的建立

#include using namespace std; class book { public: int num; float price; book *next; }; book *hea...
  • u012503639
  • u012503639
  • 2015年01月26日 16:04
  • 2070

C++经典程序100例(附答案)【1】(希望一些像我一样的新手能够从这些习题中取得进步)

【程序1】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去      掉不满足条件的...
  • lujiazhi0123
  • lujiazhi0123
  • 2012年12月11日 20:06
  • 1711

【C语言】动态链表和静态链表的创建

动态链表和静态链表 #include #include #include struct wep{ //char name[16]; int pwt; float price; struct ...
  • qq_15974389
  • qq_15974389
  • 2016年05月02日 02:00
  • 1364

最近对问题的分治算法(C++)

 #includestdio.h>#includesstream>#include map>#include iostream>#include math.h>using namespace std;...
  • qw_study
  • qw_study
  • 2007年08月08日 08:55
  • 1500

回溯法常用题目

//回溯法 //8*8的格子,每个颜色由1--5,给定任一一个格子,求出所有与格子相邻且颜色相同的格子的个数。 int map[8][8] = { {1,1,0,1,}, {1,1,0,1}, {1,...
  • yyhero1
  • yyhero1
  • 2016年03月12日 18:11
  • 713

c++ 经典习题源码

一直在寻求i一种记录学习历程的方式,之前在搜集资料,学习android时候,经常是求助于各位csdn大神,今天作为csdn中的第一篇博文,先回顾一下自己的c++历程吧。 1.任意输入数字然后求其阶乘...
  • tianzhiwaidexue
  • tianzhiwaidexue
  • 2014年04月24日 18:17
  • 517

各大Oj经典图论500题

=============================以下是最小生成树+并查集====================================== 【HDU】 *1213       ...
  • liujian20150808
  • liujian20150808
  • 2016年03月10日 13:28
  • 1762
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++技术支持作业范例:有关动态链表的经典例题
举报原因:
原因补充:

(最多只允许输入30个字)