ImageVerifierCode 换一换
格式:DOCX , 页数:27 ,大小:35.20KB ,
资源ID:18054393      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/18054393.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(线性表栈和队列Word下载.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

线性表栈和队列Word下载.docx

1、1819 int length()20 21 return l.numinlist ;22 2324 void append(ELEMTYPE item)25 26 if (l.numinlist MAXSIZE)27 exit(0);28 l.elementl.numinlist+ = item;29 3031 void insert(int i ,ELEMTYPE item)32 33 int j;34 if(i l.numinlist|l.numinlist 35 exit(0);36 for(j = l.numinlist;j i;j-)37 l.elementj = l.elemen

2、tj-1;38 l.elementi = item;39 l.numinlist+;40 41 42 ELEMTYPE del(int i)43 44 int j;45 ELEMTYPE temp;46 if(i = l.numinlist|l.numinlist = 0)47 exit(0);48 temp = l.elementi;49 for(j = i;j l.numinlist - 1;j+)50 l.elementj = l.elementj+1;51 l.numinlist-;52 return temp;53 54 55 int search(ELEMTYPE item)56

3、57 int i;58 for (i = 0;i l. numinlist;i+)59 if (l.elementi = item)60 return i;61 return -1;62 6364 void traversal()65 66 int i;67 for (i = 0; l.numinlist;68 printf(%d ,l.elementi);69 printf(n);70 7172 void main()73 74 init();75 append(10); /* L is (10) */76 append(20); /* L is (10,20) */77 append(30

4、); /* L is (10,20,30) */78 traversal(); /* L is (10,20,30) */79 insert(2,15); /* L is (10,20,15,30) */80 traversal();81 if (search(15) != -1)82 printf(element 15 is in list!83 else84 printf(element 15 is not in list!85 printf(n%dn,del(1);86 traversal(); /* L is (10,15,30) */87 图2.1 顺序表表示法的线性表操作的实现图2

5、.1所示程序的输出结果为:10 20 3010 20 15 3020 10 15 30单链表基本操作的实现在线性表的顺序表示中,由于逻辑上相邻的两个元素在物理位置上也相邻,则每个元素的存储地址都可从线性表的起始地址计算得到。而在单链表中,任何两个元素的存储地址之间没有固定的联系,表中每个元素的存储地址都包含在其前驱结点的指针域中,所以,单链表的运算与顺序表的运算一般有所不同。设head和tail分别为带表头结点的单链表的头指针和尾指针。图2.6给出了单链表基本操作的实现。1 #include 3 struct node 4 ELEMTYPE element;5 struct node *nex

6、t;7 struct node *head;8 struct node *tail;910 void init()11 12 head = (struct node *)malloc(sizeof(struct node);13 if (!head) exit(0);14 head-next = NULL;15 tail = head;16 1718 int isEmpty()19 20 if (head = tail) return 1;21 else return 0;24 int length()26 struct node *p;27 int cnt = 0;28 for (p = h

7、ead-next;p != NULL;p = p-next)29 cnt+;30 return cnt;31 32 33 void append(ELEMTYPE item)34 35 struct node *p;36 p = (struct node *)malloc(sizeof(struct node);37 if (!p) exit(0);38 p-element = item;39 p-next = tail-40 tail-next = p;41 tail = p;42 4344 int insert(int i,ELEMTYPE item)45 46 struct node *

8、q,*ltemp;47 int j;48 ltemp = (struct node *)malloc(sizeof(struct node);49 if (!ltemp) exit(0);50 ltemp-51 q = head;52 j = 1;53 while (q != NULL) & (j 55 j+;56 57 if(!q)|(ji) exit(0);58 ltemp-next = q-59 q-next = ltemp;60 if (tail = q) tail = ltemp;61 62 63 ELEMTYPE del(int i)64 65 struct node *p,*q;

9、66 ELEMTYPE temp;67 int j;68 q = head;69 p = head-70 j = 1;71 while (p !72 q = p;73 p = p-74 j+;75 76 if(!p)|(j i) exit(0);77 temp = p-element;78 q-next = p-79 if (tail = p) tail = q;80 free(p);81 return temp;82 8384 struct node *search(ELEMTYPE item)85 86 struct node *p;87 p = head-88 while(p != NU

10、LL)89 if (p-element = item)90 return p;91 else92 p = p-93 94 return NULL;95 9697 struct node *get(int i)98 99 struct node *p;100 int j;101 p = head-102 for(j = 1;(p ! i);103 p = p-104 if(! i) return NULL;105 return p;106 107 108 void traversal()109 110 struct node *p;111 printf(list is : 112 for (p

11、= head-113 printf(,p-element);114 printf(115 116 117 void main()118 119 struct node *p;120 121 init();122 append(10); /* list is 10 */123 append(20); /* list is 10 20 */124 append(30); /* list is 10 20 30 */125 append(40); /* list is 10 20 30 40 */126 traversal();127 printf(length is : %dn,length();

12、128129 insert(2,35);130 traversal(); /* list is 10 35 20 30 40 */131132 printf(,del(2);133 traversal();134135 p = search(30);136 if(!p)137 printf(nNot find!138 else139 printf(n%d140141 p = get(3);142 if(!143 printf(144 else145 printf(147 图2.6 单链表的基本操作的实现图2.6所示单链表基本操作的输出内容为:List is : 10 20 30 40Lengt

13、h is : 4 10 35 20 30 403530 在图2.6中,第2行把ELEMTYPE设置为int的一个别名,这样,这个单链表中结点的元素值就为整数了。第3行到第8行包含了线性表的说明,其中element用来存放结点的数据信息,next为指针域,指明结点的唯一后继结点在内存中的存放地址。head和tail分别表示单链表的头指针和尾指针。接下来从第10行到第115行是线性表运算函数的定义。函数init(第10行到第16行)实现单链表的初始化。函数首先通过C语言提供的malloc函数申请一个结点作为表头结点,并由头指针head指向,如果申请空间失败,程序结束。否则将该结点的next置成空(

14、NULL),然后将尾指针tail也指向该表头结点。函数isEmpty(第18行到第22行)判断单链表是否为空,如果头指针head和尾指针tail相等,则表示单链表为空,说明表中无元素。函数返回1,否则,函数返回0。函数length(第24行到第31行)统计单链表中结点的数目。函数通过一个for循环从第一个结点开始(p=head-next)计数,如果不是最后一个结点(p!=NULL),计数器cnt就加1,然后到下一个结点(p=p-next),直到最后一个结点为止。计数器cnt的值就是单链表的结点个数。第33行到第42行的函数append实现在单链表的最后追加一个新结点,新结点的元素值为item。

15、函数首先申请一个空结点(第36行),如果申请失败,程序结束。否则将item和NULL分别填入该结点的element域和next域。然后将新结点链入单链表中(第39行和第40行),最后将单链表尾指针tail指向新结点,使其成为新的最后结点(tail = p)。设p是指向单链表结点的指针,在p指向的结点前面插入一个结点包括三个步骤。首先,要创建一个新结点,并且赋给它一个值。其次,新结点的next指向指针p指向的结点。第三,指针p指向的结点的前趋结点的next指向新插入的结点。图2.7给出了这三个步骤的图示。 (a)插入前的链表 (b)插入后的链表图2.7 在单链表中插入一个结点的过程假设ltemp

16、为指向新插入结点的指针,指针q指向p结点的前趋结点,则上述指针修改的代码为ltemp-(或者ltemp-)q-函数insert(第44行到第61行)实现了上述过程。该函数在单链表的第i个结点前插入一个新结点,item为新结点的元素值。算法在实现时,首先申请一个结点,指针ltemp指向该结点(48行)。如果申请失败,则程序结束(49行)。否则用item初始化该结点element域(50行)。接着从表头开始(q=head),通过while循环定位新结点插入位置(53行到56行)。如果插入位置不合法,程序结束(57行)。否则指针q停留在被插入位置的前趋结点,最后根据上面所述修改相应指针。如果是在最后

17、结点后插入结点,还需要修改尾指针,使其指向新插入结点(60行)。从单链表删去一个结点很简单,只需将被删结点的前趋结点的next域指向被删结点的后继结点即可。图2.8给出了删除一个结点的指针变化情况。但必须注意,被删结点占据的内存空间应该返还给存储器,可调用C语言提供的标准函数free将被删去结点所占据的内存空间返还给存储器。(a) 删除值为12的结点前的单链表 (b) 删去结点后指针的变化情况图2.8 删去一个结点的过程设指针q为被删除结点p的前驱结点指针,删除结点p的代码为: q- free(p);实现上述过程的代码包含在函数del中(第63行到第82行)。指针p被用来指向被删除结点,指针q

18、被用来指向被删除结点的前趋结点,temp用来存放被删除结点的元素值。算法首先从表头开始寻找被删除结点的前趋结点,如果没有找到被删除的结点,则程序结束。否则,将被删除结点的元素值保存到临时变量temp中(77行),并修改相应指针(78行)。如果被删除的结点是最后一个结点,还需要将尾指针指向被删除结点的前趋(79行)。第80行归还被删结点所占据的存储空间,81行返回被删除结点的元素值。在单链表中查找特定值(item)的元素过程由函数search完成(84行到95行)。函数首先从表头开始(87行),通过一个while循环实现查找过程。如果表中还有元素(p != NULL),则判断该元素是否是要查找的

19、元素,如果是,则返回该元素地址,否则到下一个结点(92行)。如果表中没有要找的元素,函数返回NULL。由于单链表中任何两个元素的存储位置之间没有固定的联系,每个元素的存储位置只能通过其前趋结点得到。因此,在单链表中寻找第i个结点就不像顺序表那么容易。在单链表中,取得第i个元素必须从单链表头结点出发寻找。函数get(第97行到第106行)从链表表头结点开始寻找第i个结点,若结点i不存在,函数返回空(NULL),否则返回指向该结点的指针。单链表的遍历和顺序表的遍历非常相似,顺序表使用下标值,而链表则是使用指针来处理每个结点。最大的不同在于顺序表可以随机存取元素,可是链表结构一定要用遍历的方式来存取

20、其中的每一个结点。因为头指针只能获得第一个结点的内容,如果要知道第i个结点的内容,一定要遍历到第i-1个结点才能知道它的地址。函数traversal(第108行到第115行)实现链表的遍历。在循环的开始,首先将指针p指向第一个结点,接着进入循环,循环的条件是测试指针p是否已指向链表的结尾。因为链表的最后一个结点的指针会指向NULL,所以当指针指向NULL时,表示已经走到了链表的最后。而在循环中的语句p=p-next就是移动指针指向下一个结点。第117行到第147行是main函数,说明了线性表的链式存储结构下操作函数的使用。121行调用init 函数将链表置成空表。第122到125的四行调用ap

21、pend函数追加四个元素,此时线性表为(10,20,30,40)。127行输出线性表的长度(此时输出4)。insert(2,35)(129行)在位置2插入一个元素35,线性表变为(10,35,20,30,40)。132行输出被删除的第2个结点的值(35)。135行在表中查找元素30。第141行调用get函数定位第3个元素。顺序栈在图3.2中,第3行定义了一个常数值MAXSIZE,这是因为数组的大小需要提前声明。在顺序栈的实现中,MAXSIZE表示栈的最大长度,示例中将其设为999。第4行把ELEMTYPE设置为char的一个别名,这样,这个示例栈就可以使用一组字符了。第5行到第9行包含了顺序栈

22、的定义,s为顺序栈。接下来从第11行到第64行是顺序栈操作函数的实现。第11到第14行完成栈的初始化。顺序栈的初始化很简单,只需将栈顶指针top置为0即可。函数EmptyStack(第16行到第19行)判断顺序栈是否为空,如果为空(没有元素),函数返回1,否则返回0。第21到第31行实现入栈操作。进栈函数PushStack完成在顺序栈的栈顶插入一个元素。函数首先检查顺序栈是否已满,如果已满,程序结束,否则将新元素插入到栈顶位置,并移动栈顶指针。第33行到第43行完成出栈操作。出栈函数PopStack首先判断栈中是否有元素,如果为空栈(意味着没有元素),程序结束。否则先移动栈顶指针,然后将栈顶元

23、素的值返回。注意,出栈操作,需要先判栈是否为空,为空时不能操作,否则产生错误。通常栈空时常作为一种控制转移的条件。第45行到第53行的函数TopStack实现取栈顶元素,如果栈为空,则退出程序,否则返回栈顶元素的值。取栈顶元素操作与出栈操作类似,不同的是出栈操作需要修改栈顶指针,而取栈顶元素操作不需要修改栈顶指针。函数LengthStack(第55到第58行)返回顺序栈中元素个数。由于栈顶指针记录的就是栈中元素个数,因此函数只是简单返回top的值。第60行到第71行说明了顺序栈的应用。62行调用InitStack 函数建立一个空栈,第63到第67行调用PushStack函数将五个字符元素入栈。

24、第68行调用LengthStack 函数输出栈中元素个数,第69行调用PopStack函数删除栈顶元素。第70行调用TopStack函数输出栈顶元素。stdlib.h2 #include 3 #define MAXSIZE 999 4 typedef char ELEMTYPE;5 struct SeqStack 6 ELEMTYPE elementMAXSIZE;7 int top;8 ;9 struct SeqStack s;1011 void InitStack( )12 13 s.top = 0; 14 1516 int EmptyStack( )17 18 return (s.top = 0);19 2021 void PushSta

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1