c语言单向链表

一、链表概述  

  链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。它可以根据需要开辟内存单元。链表有一个“头指针”变量,以head表示,它存放一个地址。该地址指向一个元素。链表中每一个元素称为“结点”,每个结点都应包括两个部分:一为用户需要用的实际数据,二为下一个结点的地址。因此,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。
        链表的各类操作包括:学习单向链表的创建、删除、  插入(无序、有序)、输出、  排序(选择、插入、冒泡)、反序等等。
二、链表创建、删除、插入等如下,将函数与声明定义进行分离为.h和.c:

2.1 linklist.h

 1 #pragma once
 2 typedef struct list
 3 {
 4     int data;//数据域
 5     struct list *next;//指针域
 6 }LinkList;
 7 LinkList *crate_list();    //建立一个节点
 8 void traverse(LinkList*ls);//循环遍历链表
 9 LinkList* insert_list(LinkList* ls, int n, int data);//在指定位置插入元素
10 int delete_list(LinkList* ls, int n);//删除指定位置元素
11 int count_list(LinkList* ls);//返回链表元素的个数
12 void clear_list(LinkList *ls);//清空链表,只保留首节点
13 int empty_list(LinkList *ls);//返回链表是否为空
14 LinkList *local_list(LinkList*ls, int n);//返回链表指定的位置节点
15 LinkList * elem_list(LinkList* ls, int data);//返回指定位置data
16 int elem_pos(LinkList *ls, int data);//返回数据域等于DATA的位置
17 LinkList *last_list(LinkList *ls);//得到链表的最后一个节点
18 void merge_list(LinkList * s1,LinkList* s2);//合并两个链表
19 void reverse_lsit(LinkList *ls);//链表反转

2.2  linklist.c

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include "linlist.h"
  4 //建立一个节点
  5 LinkList * crate_list()
  6 {
  7     return (LinkList*)calloc(sizeof(LinkList),1);
  8 }
  9 //循环遍历链表
 10 void traverse(LinkList * ls)
 11 {
 12     LinkList *p = ls;
 13     while (p)
 14     {
 15         printf("%d\n",p->data);
 16         p = p->next;
 17     }
 18
 19 }
 20 //插入元素
 21 LinkList * insert_list(LinkList * ls, int n, int data)
 22 {
 23     LinkList *p = ls;
 24     while (p&&n--)
 25     {
 26         p = p->next;
 27     }
 28     if (p==NULL)
 29     {
 30         return NULL;//n的位置大于链表节点数
 31     }
 32     LinkList *node = crate_list();//新建一个节点
 33     node->data = data;
 34     node->next = p->next;
 35     p->next = node;
 36     return node;
 37 }
 38 //删除节点
 39 int delete_list(LinkList * ls, int n)
 40 {
 41     LinkList *p = ls;
 42     while (p&&n--)
 43     {
 44         p = p->next;
 45     }
 46     if (p==NULL)
 47     {
 48         return -1;
 49     }
 50     LinkList *tmp = p->next;
 51     p->next = p->next->next;
 52     free(tmp);
 53     return 0;
 54 }
 55 //返回链表元素的个数
 56 int count_list(LinkList * ls)
 57 {
 58     LinkList *p = ls;
 59     int count = 0;
 60     while (p)
 61     {
 62         count++;
 63         p = p->next;
 64     }
 65     return count;
 66 }
 67 //清空链表,只保留首节点
 68 void clear_list(LinkList * ls)
 69 {
 70     LinkList* p = ls->next;
 71     while (p)
 72     {
 73         LinkList * tmp = p->next;
 74         free(p);
 75         p = tmp;
 76     }
 77     ls->next = NULL;//只有首节点,则首节点next实则为NULL
 78 }
 79 //返回聊表是否为空
 80 int empty_list(LinkList * ls)
 81 {
 82     if (ls->next)
 83         return 0;
 84     else
 85         return -1;
 86     return 0;
 87 }
 88 //返回链表指定位置的节点数据域
 89 LinkList * local_list(LinkList * ls, int n)
 90 {
 91     LinkList* p = ls;
 92     while (p&&n--)
 93     {
 94         p=p->next;
 95     }
 96     if (p == NULL)
 97         return NULL;
 98     return p;
 99 }
100 //返回指定位置数据域对应的节点
101 LinkList * elem_list(LinkList * ls, int data)
102 {
103     LinkList*p = ls;
104     while (p)
105     {
106         if (p->data = data)
107             return p;
108         p = p->next;
109     }
110     return NULL;//没有找到
111 }
112 //返回数据域等于data的节点位置
113 int elem_pos(LinkList * ls, int data)
114 {
115     LinkList * p = ls;
116     int index = 0;
117     while (p)
118     {
119         index++;
120         if (p->data = data)
121             return index;
122         p = p->next;
123     }
124     return -1;//没有找到索引
125 }
126
127 LinkList * last_list(LinkList * ls)
128 {
129     LinkList * p = ls;
130     while (p->next)
131     {
132         p = p->next;
133     }
134     return p;
135 }
136 //合并两个链表,将结构放在第一个链表中
137 void merge_list(LinkList * s1, LinkList * s2)
138 {
139     //合并连标点节点,不合并链表头
140     last_list(s1)->next = s2->next;
141     free(s2);
142 }
143
144 void reverse_lsit(LinkList * ls)
145 {
146     if (ls->next == NULL)
147         return;//只有只有一个头节点
148     if (ls->next->next == NULL)
149         return;
150     LinkList * last = ls->next;//ls->next为最后一个节点
151     LinkList * pre = ls;//上一个节点的指针
152     LinkList *cur = ls->next;//当前节点
153     LinkList*next = NULL;//下一个节指针
154     while (cur)
155     {
156         next = cur->next;
157         cur->next = pre;
158         pre = cur;
159         cur = next;
160     }
161     ls->next = pre;
162     last->next = NULL;
163 }

2.3  测试主函数

 1 #include<stdlib.h>
 2 #include<stdio.h>
 3 #include"linlist.h"
 4 #define Len 10
 5 int main()
 6 {
 7     LinkList *first = crate_list();//创建第一个节点
 8     LinkList *second = crate_list();//创建第二个节点
 9     LinkList *third = crate_list();//创建第三个节点
10     first->next = second;//指针域第一个节点的指针指向下一节点
11     second->next = third;//指针域第二个节点的指针指向下一节点
12     third->next = NULL;//指针域第三个节点的指针指向下一节点,只有三个元素,所以下一节点为NULL
13     first->data = 1;//数据域第一个元素
14     second->data = 2;//数据域第二个元素
15     third->data = 3;//数据域第二个元素
16     //遍历链表
17     printf("插入前:\n");
18     traverse(first);//遍历头即可打印整个链表,因为链表是靠指针连接在一起
19     insert_list(first,0,100);
20     printf("插入后:\n");
21     traverse(first);
22     printf("删除后\n");
23     delete_list(first,2);
24     traverse(first);
25     printf("--------------------------------------\n");
26     printf("链表的个数cout=%d\n", count_list(first));
27     //printf("清空链表,直保留首节点\n");
28     //clear_list(first);
29     printf("链表的个数cout=%d\n", count_list(first));
30     printf("%d\n",local_list(first,2)->data);
31     printf("data=%d\n",last_list(first)->data);
32     printf("-----------------------------------------\n");
33
34     LinkList * pp = crate_list();
35     for (int i = 0; i < Len; i++)
36     {
37         insert_list(pp,0,i);
38     }
39     merge_list(first,pp);
40     traverse(first);
41     printf("xxxxxxxxxxxxxxxxxxxx");
42     reverse_lsit(first);
43     traverse(first);
44     return 0;
45 }

2.4 结果显示:

原文地址:https://www.cnblogs.com/506941763lcj/p/11442498.html

时间: 2024-08-04 23:53:13

c语言单向链表的相关文章

C语言 单向链表

1.单向链表的定义 struct student { char name[10]; float score; struct student *next; }; next作为同类型指针,指向与它所在节点一样的节点. 2.单向链表的基本操作 1)建立链表 int main() { /*定义结构指针,pnew指向新节点,head指向头节点,tail指向尾节点*/ struct student *pnew, *head, * ptail; /* 动态分配库函数malloc,分配长度为sizeof(str

C语言通讯录系统——C语言单向链表实现

实现的通讯录功能有:查看通讯录.添加联系人.删除联系人.查询联系人.保存并退出. 通过txt文件保存和读取通讯录数据. #include <stdio.h> #include <string.h> #include <Windows.h> void showMenu(); void initL(); void addPerson(); void displayPersons(); void deletePerson(); void saveList(); void se

C语言之字符单向链表

/* * @Author: suifengtec * @Date:   2017-09-02 16:06:33 * @Last Modified by:   suifengtec * @Last Modified time: 2017-09-02 20:47:13 **/ /* 字符单向链表 gcc -o a.exe main.c && a  */ #include <stdio.h> #include <stdlib.h> #include <stdbool

写给过去的自己-No.1-数据结构篇-单向链表C语言的实现

过去的自己,你好.     今天我来教你单向链表,不知道你何时会看到这篇文章,也不知道你此刻对C语言的掌握,我会尽可能讲解细一点.     讲链表之前我先讲一下数组.相信你不管怎样肯定用过数组对吧,数组就是一种数据的组织形式,特点是所有的数据在逻辑上是顺序摆放的,通过数组名和数组下标 就可以找到某个元素,而且在内存中存放的物理地址也是连续的,定义数组时,一旦中括号中的数字确定了,数组中元素个数也就确定了.那么问题来了,因为数组 的大小需要提前确定,所以定义数组时必须统计好程序中用了多少元素,用多

C语言反转单向链表的代码

学习过程中中,把内容过程中常用的内容片段做个珍藏,下边内容段是关于C语言反转单向链表的内容,应该能对大伙有较大用处. #include "stdafx.h" enum{N = 3};class Node{public:int var;Node(int i):pNext(NULL), var(i){}}; {if(pHead->pNext->pNext != NULL)helper(pHead->pNext, reverseHead);elsereverseHead =

C语言之单向链表

1,单向链简洁.单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始:链表是使用指针进行构造的列表:又称为结点列表,因为链表是由一个个结点组装起来的:其中每个结点都有指针成员变量指列表中的下一个结点:?列表是由结点构成,由head指针指向第一个成为表头的结点而终止于最后一个指向nuLL的指针: 2,例子要求:根据示例代码中的例子,完成单向链表(single linked list)中的以字符串为数据的链表的插入.删除以及查找,并支持单向链表的反转:

C语言实现简单的单向链表(创建、插入、删除)及等效STL实现代码

实现个算法,懒得手写链表,于是用C++的forward_list,没有next()方法感觉很不好使,比如一个对单向链表的最简单功能要求: input: 1 2 5 3 4 output: 1->2->5->3->4 相当于仅仅实现了插入.遍历2个功能(当然遍历功能稍微修改就是销毁链表了) 用纯C写了份测试代码 /* 基本数据结构的定义以及函数的声明 */ typedef int ElemType; typedef struct Node { ElemType elem; struc

C语言:创建动态单向链表,创建完成后,输出每一个节点的数据信息。

// //  main.c //  dynamic_link_list // //  Created by ma c on 15/8/5. //  Copyright (c) 2015年 bjsxt. All rights reserved. //  要求:写一个函数建立有3名学生数据的动态单向链表,并输出链表中每个结点的所有内容. /* 建立动态链表的思想: 1.开辟一个新结点,并使p1,p2指向它: 2.读入一个学生数据给p1所指的结点: 3.head = NULL,n = 0; 4.判断读

C语言学习之单向链表操作

该文件为单向链表操作的一些接口:(如发现有错误的地方,及时告知,不胜感激!) list.h #ifndef  _CHAINLIST_H_ #define  _CHAINLIST_H_ typedef struct { char key[15]; char name[20]; int age; }DATATYPE_T; typedef struct Node { DATATYPE_T  data; struct Node *next; }chainListType; /* 添加节点到链表末尾 */