1 / 15

(第二十二讲)

高级语言. (第二十二讲). “ 击鼓传花 ” 游戏真正实现的基础. -- 新的数据存储结构 -- 动态链表的建立. 绍兴文理学院. 计算机系计算机应用教研室. 第八章 结构与联合 (2). 一、教学目的: 明确链表的概念和特点;掌握链表的建立方法及其编程;指向结构数据的指针和对链表操作的 程序设计能力训练。. 二、教学重点: 链表的特点、链表的建立方法及其编程;指向结构数据的指针和对链表操作的 程序设计能力训练。. 三、教学难点: 链表的建立、指向结构数据的指针和对链表操作的 程序设计能力训练。 四、教学过程:. §8.8 链表. TKS. 3.

caia
Download Presentation

(第二十二讲)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 高级语言 (第二十二讲) “击鼓传花”游戏真正实现的基础 --新的数据存储结构 --动态链表的建立 绍兴文理学院 计算机系计算机应用教研室

  2. 第八章 结构与联合(2) 一、教学目的:明确链表的概念和特点;掌握链表的建立方法及其编程;指向结构数据的指针和对链表操作的程序设计能力训练。 二、教学重点:链表的特点、链表的建立方法及其编程;指向结构数据的指针和对链表操作的程序设计能力训练。 三、教学难点:链表的建立、指向结构数据的指针和对链表操作的程序设计能力训练。 四、教学过程:

  3. §8.8 链表 TKS 3 1、链表的概念 (1) 链表的概念:链表(1ink)是指将若干数据(每一个数据组称为一个“结点”)按一定规则连接起来的数据结构。如下图所示: (2) 链表的特点(与数组的不同点) ①组成数组的元素是顺序存放的,它们占有一片连续的存储空间。而链表元素——称为结点,不一定存放在一片连续的存储空间中,两个相邻结点在内存中不一定相邻。 ② 在链表中,前一个结点靠指针“指向”下一个结点,只有通过前一个结点才能找到下一个结点。 13:20

  4. ③要在链表中删除一个结点,只要修改指针即可,无需移动其他元素。 ③要在链表中删除一个结点,只要修改指针即可,无需移动其他元素。 head 1244960 12445024 1244992 1245056 1244960 Wang Li Li Ling Zhang Fun Chen Bo Wang Li 50201 50203 50202 50205 50201 89.5 98 90.5 80.5 89.5 1244960 Wang Li 1244960 1244960 1245024 1244992 1245056 NULL 1245024 5020l 89.5 1244992 1244992 1244992 Zhang Fun 50202 90.5 1245024 LiLing 1245024 1245024 50203 98 1245056 1245056 ChenBO 50205 80.5 TKS 4 1244992 13:20

  5. ④要在链表中插入一个结点,只要修改指针即可,无需移动其他元素。 ④要在链表中插入一个结点,只要修改指针即可,无需移动其他元素。 1245120 head 1244960 12445024 1244992 1245056 1244960 Wang Li Li Ling Zhang Fun Chen Bo Wang Li 50201 50203 50202 50205 50201 1244960 1244960 1244960 Wang Li Wang Li Wang Li 89.5 98 90.5 80.5 89.5 5020l 5020l 5020l 89.5 89.5 89.5 1245024 1244992 1245056 NULL 1245024 Zhao qi Zhang Fun 1244992 1244992 1244992 50203 50208 86.5 98 1245024 1245024 1245024 Zhang Fun LiLing Zhang Fun 50203 50203 50202 98 98 90.5 1245056 1245056 1245056 LiLing LiLing Chen BO 50205 50202 50202 80.5 90.5 90.5 1245088 1245088 1245088 Chen BO Chen BO 50205 50205 80.5 80.5 TKS 5 1245120 1244024 13:20

  6. 2、链表结点的定义与链接关系的建立 head 1244960 12445024 1244992 1245056 1244960 Wang Li Li Ling Zhang Fun Chen Bo 50201 50203 50202 50205 89.5 98 90.5 80.5 1245024 1244992 1245056 NULL TKS 6 (1) 建立链表的关键 ①定义链表结点——在结构类型的结点变量中包含一个指向要连接结点的数据类型的指针变量; ②形成链接关系—通过初始化或赋值操作,使指针的值为要指结点的地址; ③ 设立一个头指针(head),它指向链表的第一个元素。最后一个结点称为“表尾”,表尾结点的指针为空(NULL)。 ④ 链表的一个元素称为一个“结点”(node)。结点中包含两部分内容,第一部分是结点数据本身,第二部分是一个指针,它指向下一个结点。 13:20

  7. (2) 链表结点(数据类型)的定义 TKS 7 struct StudNode {char name[16]; int num; float score; StudNode *next; }; (3) 链接关系的建立 StudNode stud1,stud2,stud3,*head; strcpy(stud1.name,"zhao");stud1.num=10101;stud1.score=89.5; strcpy(stud2.name,"qian");stud2.num=10102;stud2.score=90.5; strcpy(stud3.name,"shun");stud3.num=10103;stud3.score=94.5; head=&stud1; stud1.next=&stud2; stud2.next=&stud3; stud3.next=NULL; 13:20

  8. (4) 访问链表中每个结点的内容 1244590 1244960 1245024 1244992 1244960 zhao qian shun head 10101 10102 10103 89.5 90.5 94.5 1244502 1244992 NULL stud1 stud2 stud3 TKS 8 NULL 1244992 1245024 输出: name:zhao number:10101 score:89.5 StudNode *p=head; name:qian number:10102 score:90.5 while(p!=NULL) { } name:shun number:10103 score:94.5 printf("name:%s number:%d score:%6.2f\n",p->name, p->num,p->score); printf("name:%s number:%d score:%6.2f\n",p->name, p->num,p->score); printf("name:%s number:%d score:%6.2f\n",p->name, p->num,p->score); p=p->next; p=p->next; p=p->next; 例1 一个简单链表的建立C+22_1 13:20

  9. 4、动态链表的建立 TKS 9 所谓动态链表,就是在程序运行过程中能从无到有地建立起来的链表。如果要把一个结点插入链表,就临时为其分配内存空间。如果把一个结点从链表中删除,就释放其所占空间。 (1) 建立结构 struct StudNode { char num[10]; char name[16]; float score; StudNode *next; }; 13:20

  10. (2) 新增一个结点的过程分析 1244960 1244960 NULL NULL 1244960 head NULL 10101 Wang Li 89.5 NULL TKS 10 新增第一个结点: 新增第二个结点: 1245024 13:20

  11. StudNode *create() { StudNode *head=NULL,*newN,*thisN; char num[10],name[16];float sc; while(cin>>num>>name>>sc) { if(strcmp(num,"0")==0) break; newN=new(StudNode); strcpy(newN->num,num); strcpy(newN->name,name); newN->score=sc; newN->next=NULL; if(head==NULL) head=newN; else thisN->next=newN; thisN=newN; } return head; } (3) 动态链表的建立(函数) TKS 11 13:20

  12. (4) 显示动态链表中的内容(函数) TKS 12 void ListAll(StudNode *head) { StudNode *p;int i=0; if(head==NULL) { printf("\nempty list.\n"); return; } p=head; do{ printf("record number %d:",++i); printf("num=:%s name:%s score:%6.2f\n", p->num,p->name,p->score); p=p->next; }while(p!=NULL); } 例2 动态链表的建立C+22_2 13:20

  13. (5) 在链表中插入一个结点(函数) newN->score=sc; newN->next=NULL; if(n==1) { newN->next=head; head=newN; } else { newN->next=p->next; p->next=newN; } } return head; } TKS 13 StudNode *instert(StudNode *head) { StudNode *newN,*p; int n,i; char num[10],name[16];float sc; cin>>n;getchar(); cin>>num>>name>>sc; p=head;i=1; while(p!=NULL&&i<n-1) { p=p->next; i++; } if(p!=NULL) { newN=new(StudNode); strcpy(newN->num,num); strcpy(newN->name,name); 例3 在链表中插入 一个结点 C+22_3 13:20

  14. StudNode *del(StudNode *head) { StudNode *p1,*p2; char num[10]; cin>>num; p1=p2=head; while(p1!=NULL&&strcmp(p1->num,num)!=0) { p2=p1; p1=p1->next; } if(p1!=NULL) { if(p1==head) head=p1->next; else p2->next=p1->next; delete p1; } return head; } (6) 在链表中删除一个结点(函数) TKS 14 例4 在链表中铲除一个结点 C+22_4 13:20

  15. 五、作业与实践: TKS 15 1、上机编程:6088~6090 2、实验三 结构和链表程序设计 ? 13:20

More Related