C语言课件(链表)

合集下载

C语言程序设计实用教程_第15章链表PPT教学课件

C语言程序设计实用教程_第15章链表PPT教学课件
《C语言程序设计实用教程》
第15章 链表
Power point
1
2020/12/10
1
主要内容及难点
2
2020/12/10
2
概述
当需要动态地减少或增加数据项时,可以使用链 表这种数据结构。
链表是由若干个称作节点的数据项组成的一种数 据结构,每个节点含有一个数据和下一个节点的地址 (单链表),或含有一个数据并含有上一个节点和下 一个节点的地址(双链表)。
8
2020/12/10
8
15.3 头插法创建链表 _2
例子2(example15_2.c)使用头插法建立
了具有6个节点的链表,并输出了链表节点中 的数据 。
9
2020/12/10
9
15.4 尾插法创建链表
尾插法建立链表就是每次向链表添加的新节点将作为链表的尾节点。 尾插法的步骤如下: 1.创建一个新节点newNode,代码如下:
如果链表的节点是用malloc函数分配的内存,那么就可以使用free函数 释放该节点的内存。这样的链表也被称作动态链表。
6
2020/12/10
6
15.2.3 创建一个简单的链表
创建有3个节点的链表,步骤如下: 1.创建一个空链表head 2.添加第1个节点nodeOne 3.添加第2个节点nodeTwo 4.添加最后一个节点nodeThree。
这些变量在当前节点中所占有的内存称作节点的数据域。
4
2020/12/10
4
15.2 链表与节点
15.2.1 空链表
本节使用的结构体类型如下: typedef struct Peoson { int number; char * name; struct Peoson * next; } PERSON;

C语言链表课件

C语言链表课件

return counter;
}//Count_LinkList
Void ChangeLinkList(LinkList &L) { LinkList p, q, s, r, t; q=null; r=L; t=null; //r指示原表的表尾,q是临时表 的表头指针,t指示临时表的表尾,p指示当前正在处理的结点 p=L→next; while(p) { if(p→data %2 == 1) { // p结点是奇数结点 s = p; r→next = p→next; //从原表中删除奇 数结点 s→data = s→data + 1; s→next = null; if(!q) { q = s; t = s ; } //在临时表中插入第一 个结点 else { t→next = s; t = s; } }//if else r = r→next; p = p→next; //处理下一个结点 }//while r→next=q; //将临时表链接到原表之后 }//ChangeLinkList
链表
结点(数据元素) = 元素(数据元素的映象) + 指针(指示后继元素存储位置) 结点 元素(data) 指针(next)
用一组地址任意的存储单元存放线性表中的数据元素。
链表:以“结点的序列”表示线性表
使用内存分配函数,动态申请和释放堆中的存储空间。
P124
struct node{//定义节点类型 int data; node * next; };
void main( ) { node * h; h=CreList( ); PrintList(h); }
node *CreList()
{node A_node; node *head; //首地址 node* s; //当前结点 head = NULL; printf("\n Please input the number ( 0 the end):\t"); scanf("%d",&A_node.data);

《C语言链表》课件

《C语言链表》课件
了解如何删除链表中的指定节点
详细描述
删除链表中的节点需要找到要删除的节点,修改其前一个节点的指针,使其指向要删除节点的下一个 节点,然后将要删除节点的指针置为NULL。如果要删除的是头节点或尾节点,还需要对头指针或尾 指针进行相应的修改。
遍历链表
总结词
了解如何遍历链表中的所有节点
VS
详细描述
遍历链表需要从头节点开始,依次访问每 个节点,直到达到链表的尾部。在遍历过 程中,可以使用一个指针变量来指向当前 节点,每次循环将指针向后移动一个节点 ,即修改指针的next指针。
链表和循环链表的主要区别在于它们的最后一个节点指向的方向。在链表中,最后一个节点指向NULL; 而在循环链表中,最后一个节点指向第一个节点。循环链表具有更好的性能,但实现起来相对复杂一些 。
05
总结与展望
总结链表的重要性和应用场景
总结1
链表作为C语言中一种基本的数据结构,在计算机科学中 有着广泛的应用。通过学习链表,可以更好地理解数据 结构的基本概念,提高编程能力和解决实际问题的能力 。
详细描述
合并两个有序链表可以通过比较两个链表的 节点值来实现。从头节点开始比较,将较小 的节点添加到结果链表中,并将指针向后移 动。重复此过程直到其中一个链表为空。如 果还有剩余的节点,将其添加到结果链表的 末尾。这种方法的时间复杂度为O(n),其中
n为两个链表中节点的总数。
04
常见错误与注意事项
内存泄漏问题
内存泄漏定义
在C语言中,内存泄漏是指在使用动 态内存分配函数(如malloc、calloc 、realloc等)分配内存后,未能正确 释放这些内存,导致程序运行过程中 不断占用越来越多的内存,最终可能 导致程序崩溃或性能下降。

C语言课件 链表

C语言课件 链表

3.处理动态链表所需的函数
上例是比较简单的,所有结点都是在程序中定义 的,不是临时开辟的,也不能用完后释放,这种链表 称为“静态链表”。 前面讲过,链表结构是动态生地分配存储的,即 在需要时才开辟一个结点的存储单元 以便插入或追 加节点,删除节点后需要释放节点占用的内存单元。 C 语言提供了相应的函数。
⑴ void *malloc(unsigned int size) :在内存的动态存储区中分 配一个长度为size的连续空间。成功,则返回一个void型的空指针, 否则,返回NULL. 分配内存的字节数。
使用方法: ptr=malloc(size);
返回空类型的指针。 成功:返回内存的地址。 失败:返回NULL。 ⑵void free(ptr) 作用: 释放ptr指向的内存空间。 (3)void *calloc(unsigned n,unsigned size) 在内存的动态区 存储中分配n个长度为size的连续空间。函数返回分配域的起始 地址;如果分配不成功,返回0。
删除结点的函数: struct student *del (struct student *head,int num) {struct student *p1,*p2; if (head==NULL) {printf ("\nlist is null\n");} p1=head; while (p1->num!=num && p1->next!=NULL) {p2=p1;p1=p1->next;} if (p1->num==num) {if (p1==head) head=p1->next; else p2->next=p1->next; printf ("delete:%d\n",num); } else printf ("%ld not been found!",num); return(head); }

C语言结构体和链表

C语言结构体和链表

52
此课件下载可自行编辑修改,供参考! 感谢您的支持,我们努力做得更好!
35
完整版ppt
36
完整版ppt
37
完整版ppt
38
完整版ppt
39
完整版ppt
40
完整版ppt
41
完整版ppt
42
完整版ppt
43
完整版ppt
44
完整版pptLeabharlann 45完整版ppt46
完整版ppt
47
完整版ppt
48
完整版ppt
49
完整版ppt
50
完整版ppt
51
完整版ppt
完整版ppt
1
完整版ppt
2
完整版ppt
3
完整版ppt
4
完整版ppt
5
完整版ppt
6
完整版ppt
7
完整版ppt
8
完整版ppt
9
完整版ppt
10
完整版ppt
11
完整版ppt
12
完整版ppt
13
完整版ppt
14
完整版ppt
15
完整版ppt
16
完整版ppt
17
完整版ppt
18
完整版ppt
19
完整版ppt
20
完整版ppt
21
完整版ppt
22
完整版ppt
23
完整版ppt
24
完整版ppt
25
完整版ppt
26
完整版ppt
27
完整版ppt
28
完整版ppt
29
完整版ppt

C语言链表ppt课件

C语言链表ppt课件
11
2. calloc 函数
函数原形:void *calloc(unsigned n,unsigned size); 作用:在内存动态区中分配 n个 长度为size的
连续空间。 函数返回值:指向分配域起始地址的指针 执行失败:返回null 主要用途:为一维数组开辟动态存储空间。n 为
数组元素个数,每个元素长度为size
{ struct student *p1, *p2;
if(head==NULL) {printf("\nlist null!\n"); goto end; } p1=head;
while(num!=p1->num&&p1->next!==NULL)
{ p2=p1; p1=p1->next; }
if(num==p1->num) 找到了 { if(p1==head) head=p1->next;
27
图11.19
A B CD E (a)
A B CD E (B)
28
图11.20
p1 head
99101
99103
head
(a) p1
99101
99103
p2 (b)
99107
NULL
99107
NULL
原链表
P1指向 头结点
P2指向p1 指向的结 点。P1指 向下移一 个结点。
29
图11.20
10
11.7.3 处理动态链表所需的函数
C 语言使用系统函数动态开辟和释放存储单元 1.malloc 函数
函数原形:void *malloc(unsigned int size); 作用:在内存的动态存储区中分配 一个 长度为size 的连续空间。 返回值:是一个指向分配域起始地址的指针(基本 类型void)。 执行失败:返回NULL

语言链表详解ppt课件.ppt

语言链表详解ppt课件.ppt
6
火灾袭来 时要迅 速疏散 逃生, 不可蜂 拥而出 或留恋 财物, 要当机 立断, 披上浸 湿的衣 服或裹 上湿毛 毯、湿 被褥勇 敢地冲 出去
(4)删除操作是指,删除结点ki,使线性表的长度 减1,且ki-1、ki和ki+1之间的逻辑关系发生如下变 化:
删除前,ki是ki+1的前驱、ki-1的后继;删除后,ki-1 成为ki+1的前驱,ki+1成为ki-1的后继.
c.num=99107 ; c.score=85; 态链表”

head=&a; a.next=&b; b.next=&c; c.next=NULL; 简
p=head;

do
链 表
{ printf("%ld %5.1f\n",p->num,p->score);
p=p->next; }while(p!=NULL); }
scanf("%1d,%f",&p1->num,&p1->score); head=NULL; 假设头指向空结点
20
火灾袭来 时要迅 速疏散 逃生, 不可蜂 拥而出 或留恋 财物, 要当机 立断, 披上浸 湿的衣 服或裹 上湿毛 毯、湿 被褥勇 敢地冲 出去
while(p1->num!=0) { n=n+1;
10
火灾袭来 时要迅 速疏散 逃生, 不可蜂 拥而出 或留恋 财物, 要当机 立断, 披上浸 湿的衣 服或裹 上湿毛 毯、湿 被褥勇 敢地冲 出去
2. calloc 函数
函数原形:void *calloc(unsigned n,unsigned size); 作用:在内存动态区中分配 n个 长度为size的

C语言_链表ppt课件

C语言_链表ppt课件
} 许多问题中,有时候为了操作方便,需要在第一个节点之前增加一个
特殊的节点,称为头节点,它的data字段不含信息或根据问题的需要 存放特殊信息。
2、链表的遍历(显示链表)
一个非递归算法
以下函数disp()用于显示头节点为*h的链表的所有节点 数据域。
void disp(struct Node *h) { struct Node *p=h; printf("输出链表:"); if(p==NULL) printf("空表\n"); else { while (p->next!=NULL) { printf("%4d",p->data); p=p->next; } printf("%4d\n",p->data); }
在链表结尾出插入一个元素
p
data
首先要用一个循环语句找到q
q
q=h;
h
...
NULL
while(q->next!=NULL)
q=q->next;
p
然后执行插入语句:
data
p->next=NULL;
q
q->next=p;
h
...
NULL
p
data
q
h
...
NULL
在链表中间插入一个元素
p
data
}
单链表的插入
.
3、链表的插入(头指针的情况下)
对于插入有以下几种情况 在一个空链表上插入一个元素。 (即要插入位置前方和后方均无元素) 从链表表头处插入一个元素 (即要插入的位置前方无元素,后方有元素) 从链表结尾处处插入一个元素 (即要插入的位置后方五元素,前方有元素) 从链表的中间插入 (即要插入的位置前方和后方均有元素) 其中第三种情况可以按照第四种情况处理,但有一定特殊性所以将 其分开 注意:产生新的节点必须用malloc或者calloc开辟空间
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

链表
小结
动态数据结构 自引用的结构体 动态内存分配 链表
链表
prePtr curPtr
20 listPtr 35
42
newPtr
链表
案例分析:链表
链表
插入结点的函数
void insert(ListNodePtr *sPtr, int data) { ListNodePtr newPtr, prePtr, curPtr; newPtr = malloc(sizeof(ListNode)); if (newPtr != NULL) { newPtr->data = data; newPtr->nextPtr = NULL; prePtr = NULL; curPtr = *sPtr; while (curPtr != NULL && data > curPtr->data) { prePtr = curPtr; curPtr = curPtr->nextPtr; }
Queues(对列)
在队列的末尾删除,在队列的前面插入。
链表
自引用的结构体
自引用的结构体
包含指向相同结构类型的指针成员
struct node { int data; struct node *nextPtr; };
可以链接到一起,构成有用的数据结构:
链表 栈 队列 树
20 头指针 数据成员 指针 42
如果不调用free释放array指向的空间,则程序结束后array消失了, 但其所指的该段内存仍旧存在且不能被使用(其地址丢失了),即 出现内存泄露。
链表
链表
链表
用指针链接的自引用结构的线性集合,这些结构称为结点。
20 35 42
通过指向链表的第一个结点的指针访问链表。 后续的结点通过存储在每个结点中的链接指针成员来访问。 链表中最后一个结点的链接指针被设置为NULL,以标志 链表的结尾。

空指针
结点(node)
链表
动态内存分配
动态内存分配
在程序执行期间获取或释放内存 相关的函数(stdlib.h)
malloc() free()
相关的运算符
sizeof
链表
动态内存分配
malloc()函数
void* malloc(size_t size) 参数size :表示要分配的内存的字节数
什么时候用链表替代数组
数据成员的数目无法事先确定。 对数据进行快速的排序。
链表
案例分析:链表
链表
问题
输入任意个整数创建链表。 实现常用的操作:遍历,插入,删除,空表判断。
实现(cw1311.c)
#include <stdio.h> #include <stdlib.h>
struct listNode { int data; struct listNode *nextPtr; }; typedef struct listNode ListNode; typedef ListNode* ListNodePtr;
链表
案例分析:链表
链表
插入结点的函数
if (prePtr == NULL) { newPtr->nextPtr = curPtr;
*sPtr = newPtr;
} else { prePtr->nextPtr = newPtr; newPtr->nextPtr = curPtr; }
如果新结点是第一个 节点,则必须调整链 表的头指针
} else printf("%d not inserted. No memory available.\n", data); }
链表
案例分析:链表
链表
删除结点的函数
prePtr curPtr
20 listPtr
35
42
tempPtr
链表
案例分析:链表
链表
删除结点的函数
int delete(ListNodePtr *sPtr, int data) { ListNodePtr prePtr, curPtr, tempPtr; if (data == (*sPtr)->data) { tempPtr = *sPtr;
链表
链表
链表
动态数据结构 自引用的结构体 动态内存分配 链表 程序设计举例
链表
动态数据结构
Dynamic data structures(动态数据结构)
在程序的执行过程中可以增长和缩短的数据结构。
Linked lists(链表)
在任何地方进行插入和删除。
Stacks(栈)
在栈的顶端进行插入和删除。
案例分析:链表
链表
实现
void menu(void) { printf("Enter your choice:\n" "1 to insert an element into the list.\n" "2 to delete an element from the list.\n" "3 to ent.\n"); }
链表
案例分析:链表
链表
判空和输出链表的函数
int isEmpty(ListNodePtr listPtr) { return listPtr == NULL; }
void printList(ListNodePtr curPtr) { if (curPtr == NULL) printf("List is Empty.\n\n"); else { printf("The list is:\n"); while (curPtr != NULL) { printf("%d --> ", curPtr->data); curPtr = curPtr->nextPtr; } printf("NULL\n\n"); } }
struct node *sPtr; sPtr = malloc(sizeof(struct node));
链表
动态内存分配
free()函数
void free(void* aPtr) 释放aPtr指向的内存空间
aPtr指向的应该是用 malloc 分配的内存空间
int *array, n=30; array = (int*)malloc(n*sizeof(int)); … free(array);
链表
案例分析:链表
链表
实现
void main() { ListNodePtr listPtr = NULL; int choice; int item;
menu(); printf("? "); scanf("%d", &choice);
链表
案例分析:链表
链表
实现
while (choice != 3) { switch (choice) { case 1: printf("Enter an integer: "); scanf("%d", &item); insert(&listPtr, item); printList(listPtr); break;
链表
案stNodePtr*, int); int delete(ListNodePtr*, int); int isEmpty(ListNodePtr); void printList(ListNodePtr); void menu(void);
链表
链表
案例分析:链表
链表
实现
default: printf("Invalid choice.\n\n"); menu(); break; } printf("? "); scanf("%d", &choice); } printf("Bye-bye!\n"); }
链表
案例分析:链表
链表
插入结点的函数
*sPtr = (*sPtr)->nextPtr;
free(tempPtr); return 1;
} else { prePtr = *sPtr; curPtr = (*sPtr)->nextPtr;
如果删除的是第一个 节点,必须调整链表 的头指针
链表
案例分析:链表
链表
删除结点的函数
while (curPtr != NULL && curPtr->data != data) { prePtr = curPtr; curPtr = curPtr->nextPtr; } if (curPtr != NULL) { tempPtr = curPtr; prePtr->nextPtr = curPtr->nextPtr; free(tempPtr); return 1; } } return 0; }
size_t为sizeof返回的整数类型 一般用 sizeof 运算符确定对象的大小
返回值:指向分配内存的 void* 类型的指针
void* 类型的指针可以被赋值给任何类型的指针变量 如果没有可用内存,则返回 NULL
int *array, n=30; array = (int*)malloc(n*sizeof(int));
链表
案例分析:链表
链表
实现
case 2: if (!isEmpty(listPtr)) { printf("Enter an integer to be deleted: "); scanf("%d", &item); if (delete(&listPtr, item)) { printf("%d deleted.\n", item); printList(listPtr); } else printf("%d not found.\n", item); } else printf("List is Empty!\n"); break;
相关文档
最新文档