c语⾔如何⽤链表作为函数的参数,c语⾔链表的⽤法
链表是数据结构中⽐较基础也是⽐较重要的类型之⼀,那么有了数组,为什么我们还需要链表呢!或者说设计链表这种数据结构的初衷在哪⾥?下⾯⼩编就为⼤家介绍下c语⾔链表的⽤法。
c语⾔枚举的⽤法如下:
这是因为,在我们使⽤数组的时候,需要预先设定⽬标体的个数,也即数组容量的⼤⼩,然⽽实时情况下我们⽬标的个数我们是不确定
的,因此我们总是要把数组的容量设置的很⼤,这样以来就浪费了很多的空间。另外,数组在进⾏插⼊操作和删除操作的时候,在插⼊或者
删除制定元素之后,我们往往需要进⾏循环移位,这增加了我们的线性开销。
正是由于以上的两种主要原因,链表被设计出来⽤于⼀般表的操作。为了避免上⾯描述数组的两种弊端,我们希望链表有⼀下的特点
1 可以灵活的扩展⾃⼰的长度。
2 存储地址不连续,删除或者插⼊操作的时候不需要循环移位。
要实现以上两个特点,我们需既要保证每个节点的独⽴性,⼜要保存相邻两个节点的联系。
为此,链表⼀般被设计为下⾯的形式。
Node--->Node---->Node
链表是由⼀个⼀个的节点组成的,可以⽅便和⾃由的插⼊未知个Node,前⼀个节点中⽤指针保存着下⼀个节点的位置,这样以来便顺利的
完成了我们对链表的两点期望,但是唯⼀的缺点是增加了额外的空间消耗。
———————————————————————————————————————————————————————————————
链表的定义:
链表的定义⼀般使⽤结构体,在看《数据结构与算法分析》这本书的时候发现,书中频繁的使⽤typedef的关键字,结果真的很棒不仅保持
的代码的整洁程度,也让我们在下⾯的编码过程中少见了很多烦⼈的指针(当然指针还是⼀直存在的)。
所以这⾥也借⽤了书中的定义⽅法。
struct Node;
typedef struct Node* PtrNode;
typedef PtrNode Position;
typedef PtrNode List;
struct Node{
int Value;
PtrNode Next;
};
下⾯接着书写⼀个建⽴链表的函数,输⼊每个节点的值,直到这个值是-1的时候函数结束。
在这个⾥⾯,我以前⼀直搞不明⽩为什么需要定义三个Node *,现在终于了解了,最终还是复习了指针的内容明⽩的,这⾥说⼀下指针实现
链表对指针的操作很频繁,需要⽐较扎实的掌握了指针之后,在来看链表会轻松很多。在下⾯的⼀段程序⾥,我分别定义了head/p/tmp这
三个指向节点结构体的指针,head的主要作⽤就像⼀个传销头⽬,他会主动联系上⼀个下线p,然后他就什么也不⼲了,p接着去发展⼀个
⼜⼀个的下线tmp,结果⼀串以head为⾸的链表就出来了。
起先,我总觉得有了head,为什么还要p,这是因为如果直接使⽤head去指向下⼀个节点,head的位置也是不断在移动的,即它永远处于
链表的尾端,这样当我们返回链表的时候,其实是空值。所以,我们需要p这个中转环节。(其实,这种做法在指针中⾮常普遍,⼤部分有返
回指针类型的函数中,都会⾸先定义⼀个指针变量来保存函数的传⼊的参数,⽽不是对参数直接进⾏操作)。
/*
函数功能:创建⼀个链表
函数描述:每次输⼊⼀个新的整数,即把新增加⼀个节点存放该整数,当输⼊的整数为-1时,函数结束。
*/
List create()
{
int n=0;
Position p,head,tmp;
head=NULL;
tmp=malloc(sizeof(struct Node));
if(tmp==NULL)
{
printf("tmp malloc failed!\n");
return NULL;
}
else
{
p=tmp;
printf("please input the first node's message!\n");
scanf("%d",&(tmp->Value));
}
while(tmp->Value!=-1)
{
n+=1;
if(n==1)
{
head=p;
tmp->Next=NULL;
}
else
{
p->Next=tmp;
}
p=tmp;
tmp=malloc(sizeof(struct Node));
printf("please input the %d node!\n",n+1);
scanf("%d",&(tmp->Value));
}
p->Next=NULL;
free(tmp);  //free函数free掉的只是申请的空间,但是指针还是依然存在的。
tmp=NULL;
return head;
}
接下来,在写⼀个删除链表节点的函数,输⼊⼀个整数然后遍历链表节点,当链表节点的值与该整数相等的时候,即把该节点删除。
在完成这个函数⾸先⼀定要把这个过程思考清楚,不可否认我之前是⼀个上来就敲代码的⼈,看了《剑指offer》感觉这种习惯是程序员的⼤忌,甚⾄还想写⼀篇博客,名字都想好了《程序员的⾃我修
养之思考在前,代码在后》。其实想想也是,我们写程序的⽬的是为了解决问题,⽽不是为了简单的写程序,纯粹的让程序跑起来⼤概只会在上学那会存在吧!真实的程序开发中需要考虑⼏乎所有 能想到的实际问题,所以⽆论程序再下,⼀要学会先思考清楚,再下笔写程序。
关于这个函数,我们要想到的是:
1 如果链表为空,我们该怎么做,当然是直接返回。
2 如果要删除的元素为头节点该怎么办?
3 如果要删除的元素为尾节点该怎么办?
当注意到以上三个部分,我们的程序就可能避免掉了输⼊链表为空,程序直接崩溃的现象,也可以避免删除元素值为头节点时删不掉的尴尬。我们的程序就有了⼀定的鲁棒性。
下⾯着重考虑链表的删除的实现:
list:  Node_a->Node_b->Node_c->Node_d;
list ?????? tmp???????? p
-
------>  ? ? ? tmp->Next=p->Next;
list: Node_a->Node_b----------->Node_d
free(p)
假设我们要删除的节点为上图的Node_c;假设我们能够到Node_c的前⼀个位置tmp和被删除节点位置p的话;这个时候我们只需要执⾏tmp->Next=p->Next即可。
只要完成上⾯的分析以及考虑到各种情况,我们完成下⾯的代码就⽔到渠成了。
/*
函数功能:删除链表中指定值的节点(如果存在多个,只删除第⼀个)
本例中输⼊⼀个整数,删除链表节点值为这个整数的节点。
*/
List DeleteNode(List list)
{
Position p,tmp;
int value;
if(list==NULL)
{
printf("The list is null,function return!\n");
return NULL;
}
else
{
printf("please input the delete Node's value:\n"); scanf("%d",&value);
}
p=list;
if(p->Value==value)
{
list=p->Next;
free(p);
p=NULL;
return list;
}
while(p!=NULL&&p->Value!=value)
{
tmp=p;
p=p->Next;
}
if(p->Value==value)
{
if(p->Next!=NULL){
tmp->Next=p->Next;
}
else
{
tmp->Next=NULL;
}
free(p);
p=NULL;
}
return list;
}
关于链表的使⽤场景分析:
链表在程序开发中⽤到的频率还是⾮常⾼的,所以在⾼级语⾔中往往会对链表进⾏⼀些实现,⽐如STL中list以及Java中也有类似的东西。在⽬前的服务器端开发,主要运⽤链表来接收⼀些从数据中取出来的数据进⾏处理。
即使你不知道链表的底层实现,仍然可以成功的运⽤STL⾥⾯的现成的东西。但是作为⼀个学习者,我觉得会使⽤和从底层掌握仍然是两个不同的概念,linux之⽗说:“talk is less,show you code”。
以下的程序,⽤链表模拟了⼀个电话通讯录的功能,包括添加联系⼈,查联系⼈,以及删除联系⼈。
switch的用法c语言
PS:关于鲁棒性,程序中最⼤的危险是使⽤了gets这个函数,⽬前先保留使⽤gets,等待到⼯作之后在做进⼀步的程序完善。(,读书去。。。应届⽣,个⼯作他妈咋这么难呢 ⼯作经验,⼯作经验,艹,那个⼤⽜⼀出校门就什么都会。)
/**************************************************************************
Programe:
This is a phone list write by list
The programe is just prictise for list
Author: heat nan
Mail:964465194@qq
Data:2015/07/27
**************************************************************************/
#include
#include
#include
#define N 25
#define M 15
struct node;
typedef struct node* p_node;
typedef p_node List;
typedef p_node Position;
typedef struct node** PList;
struct node{

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。