写给自己看的单链表(1):基本操作

旧巷老猫 提交于 2020-02-24 23:02:14

搬运自我的CSDN https://blog.csdn.net/u013213111/article/details/88382961

!!!Attention:以下操作中的单链表均带有头结点!!!
1.定义
定义一个eletype,便于更改元素的类型。node结构体有两个成员,一个是数据成员,一个是指向下一个节点的指针成员。给node结构体起个别名Lnode,这样就可以直接定义Lnode型变量,无需用struct node这么长的名字。

1 typedef int eletype;
2 
3 typedef struct node
4 {
5     eletype data;
6     struct node *next;
7 }Lnode;

2.创建一个有n个元素的单链表
函数的返回值应该是表头(指针),这样才能够使用所创建的单链表。所以肯定要先创建Lnode *head。创建新的元素要用到malloc函数分配内存。

 1 Lnode *CreateList(int n) //Create a single linkedlist with n elements
 2 {
 3     Lnode *head, *current, *s;
 4     head = (Lnode*)malloc(sizeof(Lnode));
 5     current = head;
 6     for (int i = 0; i < n; i++) {
 7         s = (Lnode*)malloc(sizeof(Lnode));
 8         s->data = 100 - i;
 9         current->next = s;
10         current = s;
11     }
12     current->next = NULL;
13     return head;
14 }

3.删除单链表
删除一个元素前首先把它所指向的下一个元素保存到tmp,然后free当前元素的空间,再移到下一个元素去,重复上述步骤。如果表头没有被free的话用valgrind是会检测到内存泄漏的,其实就只是清空了表,而不是真正的删除整个表。

 1 void DeleteList(Lnode *head) //Delete list
 2 {
 3     Lnode *current, *tmp;
 4     current = head->next;
 5     head->next = NULL;
 6     while (current != NULL) {
 7         tmp = current->next;
 8         free(current);
 9         current = tmp;
10     }
11     //If just want to clear the list, do not free(head)
12     free(head); //Forget to free head can lead to memory leakage.
13 }

4.打印单链表
注意遍历之前首先要检测一下是否是空表,然后逐个元素进行打印就好。

 1 void PrintList(Lnode *head) //Print list form head to end
 2 {
 3     Lnode *current;
 4     if (head->next == NULL)
 5         printf("The list is empty.\n");
 6     else {
 7         current = head->next;
 8         while (current != NULL) {
 9             printf("%d\n", current->data);
10             current = current->next;
11         }
12     }
13 }

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!