单向链表完整代码

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<time.h>
  4 #include<math.h>
  5 typedef struct node
  6 {
  7     int data;
  8     struct node * next;
  9 }linkNode;
 10 typedef linkNode *pLinkNode;
 11
 12 void creatLinkByHeadInsert(pLinkNode &head,int n);//生成n个随机数,用头插法构造链表
 13 void creatLinkByTailInsert(pLinkNode &head,int n);//生成n个随机数,用尾插法构造链表
 14 void printLink(pLinkNode head);//输出链表的结点值
 15 void delLink(pLinkNode &head);//释放整条链的所有结点
 16 void delLinkNode(pLinkNode &head,int k);//删除并释放链表的第k个结点
 17 void delLinkNodeByVal(pLinkNode &head,int k);//删除链表中所有值为k的结点
 18 void insertNode(pLinkNode &head,int data,int k);//用data构造一个结点并插入链表,使其成为链表的第k个结点(若链表节点数小于k-1则插入到链表末尾)
 19
 20 int main()
 21 {
 22     pLinkNode head;
 23     int valToDel,valToInsert;
 24
 25     /*
 26     head=NULL;
 27     creatLinkByHeadInsert(head,10);
 28     printLink(head);
 29     delLinkNode(head,1);
 30     printLink(head);
 31     delLinkNode(head,2);
 32     printLink(head);
 33     delLink(head);
 34     if(head==NULL)
 35         printf("链表所有结点释放成功.\n");
 36     else
 37         printf("在释放链表所有结点时发生未知错误,未能成功释放链表所有结点。\n");
 38     */
 39
 40
 41
 42     printf("\n\n");
 43     head=NULL;
 44     creatLinkByTailInsert(head,10);
 45     printLink(head);
 46
 47     printf("输入一个想要删除的数:");
 48     scanf("%d",&valToDel);
 49     delLinkNodeByVal(head,valToDel);
 50     printLink(head);
 51
 52     printf("输入一个想要插入的数:");
 53     scanf("%d",&valToInsert);
 54     insertNode(head,valToInsert,1);
 55     insertNode(head,valToInsert,3);
 56     insertNode(head,valToInsert,12);
 57     printf("插入第1和第3,12个位置后的序列为:\n");
 58     printLink(head);
 59
 60     delLink(head);
 61     if(head==NULL)
 62         printf("链表所有结点释放成功.\n");
 63     else
 64         printf("在释放链表所有结点时发生未知错误,未能成功释放链表所有结点。\n");
 65
 66     return 0;
 67 }
 68
 69 //生成n个随机数,用头插法构造链表
 70 void creatLinkByHeadInsert(pLinkNode &head,int n)
 71 {
 72     int i;
 73     pLinkNode p;
 74     head=NULL;
 75
 76     srand((unsigned)time(0));
 77     for(i=0;i<n;i++)
 78     {
 79         p=(pLinkNode)malloc(sizeof(linkNode));
 80         p->data=rand()%100+10;
 81         p->next=NULL;
 82         printf("%d ",p->data);
 83
 84         if(head==NULL)
 85         {
 86             head=p;
 87         }
 88         else
 89         {
 90             p->next=head;
 91             head=p;
 92         }
 93     }
 94     printf("\n");
 95 }
 96
 97 //输出链表的结点值
 98 void printLink(pLinkNode head)
 99 {
100     pLinkNode p;
101     p=head;
102     while(p!=NULL)
103     {
104         printf("%d ",p->data);
105         p=p->next;
106     }
107     printf("\n");
108 }
109
110 //生成n个随机数,用尾插法构造链表
111 void creatLinkByTailInsert(pLinkNode &head,int n)
112 {
113     pLinkNode end,p;
114     int i;
115
116     head=NULL;
117     end=NULL;
118
119     srand((unsigned)time(0));
120     for(i=0;i<n;i++)
121     {
122         p=(pLinkNode)malloc(sizeof(linkNode));
123         p->data=rand()%100+10;
124         p->next=NULL;
125         printf("%d ",p->data);
126
127         if(head==NULL)
128         {
129             head=p;
130             end=p;
131         }
132         else
133         {
134             end->next=p;
135             end=p;
136         }
137     }
138     printf("\n");
139 }
140
141 //释放整条链的所有结点
142 void delLink(pLinkNode &head)
143 {
144     pLinkNode p,q;
145     p=head;
146
147     while(p!=NULL)
148     {
149         q=p->next;
150         free(p);
151         p=q;
152     }
153     head=NULL;
154 }
155
156 //删除并释放链表的第k个结点
157 void delLinkNode(pLinkNode &head,int k)
158 {
159     pLinkNode p,q;
160     int i;
161
162     if(k==1)
163     {
164         p=head;
165         head=head->next;
166         free(p);
167     }
168     else
169     {
170         q=head;
171         p=head->next;
172         i=2;
173         while(p!=NULL&&i<k)
174         {
175             q=p;
176             p=p->next;
177             i++;
178         }
179         if(p==NULL)
180             return;
181         else
182         {
183             q->next=p->next;
184             free(p);
185         }
186     }
187 }
188
189 //删除链表中所有值为k的结点
190 void delLinkNodeByVal(pLinkNode &head,int k)
191 {
192     pLinkNode p,q;
193     while(head->data==k)
194     {
195         p=head;
196         head=head->next;
197         free(p);
198     }
199
200     p=head->next;
201     q=head;
202     while(p!=NULL)
203     {
204         if(p->data==k)
205         {
206             q->next=p->next;
207             free(p);
208             p=q->next;
209         }
210         else
211         {
212             q=p;
213             p=p->next;
214         }
215     }
216 }
217
218 //用data构造一个结点并插入链表,使其成为链表的第k个结点(若链表节点数小于k-1则插入到链表末尾)
219 void insertNode(pLinkNode &head,int data,int k)
220 {
221     pLinkNode p,q;
222     int i;
223
224     p=(pLinkNode)malloc(sizeof(linkNode));
225     p->data=data;
226     p->next=NULL;
227
228     if(k==1)
229     {
230         p->next=head;
231         head=p;
232     }
233     else
234     {
235         q=head;
236         for(i=2;i<k&&q!=NULL;i++)
237         {
238             q=q->next;
239         }
240         if(q==NULL)
241         {
242             q->next=p;
243         }
244         else
245         {
246             p->next=q->next;
247             q->next=p;
248         }
249     }
250 }
时间: 2024-11-05 18:44:21

单向链表完整代码的相关文章

单向链表JAVA代码

//单向链表类 publicclassLinkList{       //结点类     publicclassNode{         publicObject data;         publicNode next;           publicNode(Object obj,Node next){             this.data = obj;             this.next = next;         }     }       Node head; 

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 =

3、单向链表

|   版权声明:本文为博主原创文章,未经博主允许不得转载. 1. 单向链表的基础知识点. (1).链接的存储线性表的方法称为链表,可以有一组任意的存储单元来存储线性表的结点,其中这组存储单元可以是连续的,也可以是不连续的. (2).链表中结点的逻辑次序和物理次序是不一定相同的.在每个链表的节点之间通过指针来表示节点之间的关系.这个指针称为next指针. (3).链表的结构:包括数据域(data)和指针域(next):其中data域存放的是节点的数据值,next域存放的是节点的直接后继的地址(位

数据结构--单向链表

C语言中,我们在使用数组时,会需要对数组进行插入和删除的操作,这时就需要移动大量的数组元素,但在C语言中,数组属于静态内存分配,数组在定义时就必须指定数组的长度或者初始化.这样程序一旦运行,数组的长度就不能再改变,若想改变,就只能修改源代码.实际使用中数组元素的个数也不能超过数组元素的最大长度,否则就会发生下标越界的错误(这是新手在初学C语言时肯定会遇到的问题,相信老师也会反复强调!!!但这种问题肯定会遇到,找半天找不到错误在哪,怪我咯???).另外如果数组元素的使用低于最大长度,又会造成系统资

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

左神算法书籍《程序员代码面试指南》——2_07将单向链表按某值划分成左边小、中间相等、右边大的形式

Problem:[题目] 给定一个单向链表的头节点head,节点的值类型是整型,再给定一个整数pivot. 实现一个调整链表的函数,将链表调整为左部分都是值小于 pivot的节点, 中间部分都是值等于pivot的节点,右部分都是值大于 pivot的节点. 除这个要求外,对调整后的节点顺序没有更多的要求. 例如:链表9->0->4->5->1,pivot = 3. 调整后链表可以是1->0->4->9->5, 可以是0->1->9->5-&g

C#学习单向链表和接口 IList&lt;T&gt;

作者:乌龙哈里 时间:2015-11-04 平台:Window7 64bit,Visual Studio Community 2015 参考: MSDN 索引器(C# 编程指南) <数据结构(C#语言版)>下载 When to use IEnumerable, ICollection, IList and List 章节: 单向链表元素 定义单向链表操作接口 逐步实现单向链表 正文: 前面学习了 IEnumerable<T>.IComparable<T>.ICollec

单向链表反转算法——递归版和迭代版

最近在做笔试题时,遇到一道编程题:单向链表反转算法.一时紧张,没写出来就提前交卷了,然而交完卷就想出来了... 最初想出来的是递归版,遗憾的是没能做到尾递归,后来又琢磨出了迭代版.后来用实际编译运行测试了一遍,能正常运行. 递归版的灵感来源于<Haskell 趣学指南>中非常简洁的快速排序算法的实现,其思想是将单向链表分割头部和尾部.其中头部指是链表的第一个节点,尾部是指除去第一个节点后的子链表.通过递归的方法,将子链表继续分割成头部和尾部,直至尾部指剩下一个节点,无法继续分割,然后将头部和尾

C++异常机制的实现方式和开销分析 (大图,编译器会为每个函数增加EHDL结构,组成一个单向链表,非常著名的“内存访问违例”出错对话框就是该机制的一种体现)

白杨 http://baiy.cn 在我几年前开始写<C++编码规范与指导>一文时,就已经规划着要加入这样一篇讨论 C++ 异常机制的文章了.没想到时隔几年以后才有机会把这个尾巴补完 :-). 还是那句开场白:“在恰当的场合使用恰当的特性” 对每个称职的 C++ 程序员来说都是一个基本标准.想要做到这点,就必须要了解语言中每个特性的实现方式及其时空开销.异常处理由于涉及大量底层内容,向来是 C++ 各种高级机制中较难理解和透彻掌握的部分.本文将在尽量少引入底层细节的前提下,讨论 C++ 中这一