链表c语言语法,c语言链表函数
如何用C语言编写一个链表?
可以用结构体和指针来实现
定义:
定义一个单个元素的结构
typedef?struct?Chain_tag?{?//?这里用typedef来定义,方便使用
????int?data;?//?这里的数据可以是任意类型
????//其他数据
????struct?Chain_tag?*prev,?*next;//?由于Chain为不完全类型,故只能用指针的方式声明
}?Chain;
使用:
用单个结构体的指针作为head
#include?malloc.h
//Chain的定义写在这里
Chain?*
alloc_single_chain(int?data?/*,?(其他参数)*/)
{
????Chain?*tmp;
????
????tmp?=?malloc(sizeof(Chain));
????tmp.data?=?data;
????//...其余数据初始化
????tmp.prev?=?tmp.next?=?NULL;?//?将前后指针置为NULL
????
????return?tmp;
}
void
dispose_chain(Chain?*target)?//其实这里功能简单,用宏实现也可以
{
????free(target);
????return;
}
int?main()
{
????Chain?*head;
????Chain?*pos;
????
????head?=?alloc_single_chain(10);//初始化起始结点
????head-next?=?alloc_single_chain(11);//同理。。下一个结点
????
????for?(pos?=?head;?pos;?pos?=?pos-next)//清理垃圾好习惯
????{
???????dispose_chain(pos);
????}
????
????return?0;
}
这里有几点要注意:
由于链表用指针来实现,故不要忘记分配内存
垃圾清理时一定要从起始结点开始依次向后释放,以防内存泄漏
C语言链表
删除节点函数:
SLIST?*deletelist(SLIST?*p,int?*pvalue)
{
????SLIST?*todel,?*head?=?p;
????while(p??p-next)?{
????????if?(p-next-data?==?*pvalue)?{
????????????todel?=?p-next;
????????????p-next?=?todel-next;
????????????free(todel);
????????}?else?{
????????????p?=?p-next;
??????????}
????}
????return?head;
}
输出函数:
void?outlist(SLIST??*h)
{??
????/*这里输出链表中各个数据*/
????h?=?h-next;
????while?(h)?{
????????printf("%d",?h-data);
????????h?=?h-next;
????????if?(h)?{
????????????printf("?");
????????}
????}
????printf("\n");
}
先提交回答,然后我检查一下
---------------------------------
修改了一些bug,现在是正常的了,之前没有注意head节点是个特殊节点
另外,你的main函数里,缺少了 int a[N] 的定义,不知道是不是你漏打了,没有这个定义编译不过去的
求c语言链表的详细讲解
链表是一种常见的重要的数据结构.它是动态地进行存储分配的一种结构.我们知道,用数组存放数据时,
必须事先定义固定的长度(即元素个数).比如,有的班级有100人,而有的班只有30人,如果要用同一个数组先后存放不同班级的学生数据,则必须定义长度为100的数组.如果事先难以确定一个班的最多人数,则必须把数组定得足够大,以能存放任何班级的学生数据.显然这将会浪费内存.链表则没有这种缺点,它根据需要开辟内存单元.图10.11表示最简单的一种链表(单向链表)的结构.链表有一个"头指针"变量,图中以head表示,它存放一个地址.
该地址指向一个元素.链表中每一个元素称为"结点",每个结点都应包括两个部分:一为用户需要用的实际数据,二为下一个结点的地址.课以看出,head指向第一个元素;第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为'表尾",它的地址部分放一个"NULL"(表示"空地址").链表到此结束.
可以看到:链表中各元素在内存中可以不是连续存放的.要找某一元素,必须先找到上一个元素,根据它提供的下一元素地址才能找到下一个元素.
如果不提供"头指针"(head),则整个链表都无法访问.链表如同一条铁链一样,一环扣一环,中间是不能断开的.打个通俗的比方:幼儿园的老师带领孩子出来散步,老师牵着第一个小孩的手,第一个小孩的另一只手牵着第二个孩子,……,这就是一个"链",最后一个孩子有一只手空着,他是"链尾".要找这个队伍,必须先找到老师,然后顺序找到每一个孩子.
c语言链表
#includestdio.h
#includestdlib.h
struct chain
{
int value;
struct chain *next;
};
struct chain *create()
{
struct chain *head,*tail,*p;
int x;
head = tail = NULL;
while(scanf("%d",x)==1)
{
p=(struct chain*)malloc(sizeof(struct chain));
p-value=x;
p-next=NULL;
if(head==NULL)
head = tail = p;
else
tail=tail-next=p;
}
return head;
}
struct chain *inlink(struct chain *head,int a,int b) //int a代表要插入的节点,int b代表创建节点的数据域
{
struct chain *p,*q,*s;
s = (struct chain *)malloc(sizeof(struct chain));
s-value=b;
if(head==NULL)
{
head = s;
head-next = NULL;
}
if(head-value == a)
{
s-next=head;
head = s;
}
else
{
p=head;
while((p-value!=a)(p-next!=NULL))
{
q=p;
p=p-next;
}
if(p-value == a)
{
q-next = s;
s-next = p;
}
else
{
p-next=s;
s-next=NULL;
}
}
return (head);
}
struct chain *dellink(struct chain *head,int a) //int a代表要删除的节点
{
struct chain *q,*p;
if(head == NULL)
printf("找不到节点!\n");
else if(head-value == a)
{
p = head;
head = head-next;
}
else
{
p=head;
while((p-value!=a)(p-next!=NULL))
{
q=p;
p=p-next;
}
if(p-value != a)
printf("链表不存在此节点!\n");
else
{
q-next = p-next;
free(p);
}
}
return (head);
}
void main()
{
struct chain *p,*q;
q=create(); //链表的创建;
//q=inlink(create(),3,1); //链表的插入;
//q=dellink(create(),2); //链表的删除;
while(q){ //输出链表;
printf("%d\n",q-value);
p=q-next;
free(q);
q=p;
}
}
希望能解决您的问题。
c语言 链表
#include stdio.h
#include stdlib.h
//这里创建一个结构体用来表示链表的结点类型
struct node
{
?int data;
?struct node *next;
};
int main()
{
?struct node *head,*p,*q,*t;
?int i,n,a,b;
?
?printf("输入小朋友人数和待插入的小朋友身高:如6,97\n");
?scanf("%d,%d",n,b);
?
?printf("输入已经排好队的小朋友的身高序列:\n");
?head = NULL;// 头指针初始为空
?for(i=1;i=n;i++)// 循环读入n个数
?{
?? ?scanf("%d",a);
?// 动态申请一个空间,用来存放一个结点,并用临时指针p指向这个结点
?? ?p=(struct node *)malloc(sizeof(struct node));
?? ?p-data=a;// 将数据存储到当前结点的data域中
?? ?p-next=NULL;// 设置当前结点的后继指针指向空,也就是当前结点的下一个结点为空
?? ?if(head==NULL)
?? ??? ?head=p;// 如果这是第一个创建的结点,则将头指针指向这个结点
?? ?else
?? ?q-next=p;// 如果不是第一个创建的结点,则将上一个结点的后继指针指向当前结点
?? ?q=p;// 指针q也指向当前结点
?}
?
?t=head;// 从链表头部开始遍历
?while(t!=NULL)// 当没有到达链表尾部的时候循环
?{
?if(t-next-data b)// 如果当前结点下一个结点的值大于待插入数,将数插入到中间
?{
?p=(struct node *)malloc(sizeof(struct node));// 动态申请一个空间,用来存放新增结点
?p-data=b;
? p-next=t-next;//新增结点的后继指针指向当前结点的后继指针所指向的结点
?t-next=p;// 当前结点的后继指针指向新增结点
?break;// 插入完毕退出循环
?}
?t=t-next;// 继续下一个结点
?}
?// 输出链表中的所有数
?t=head;
?printf("插入后序列为:\n");
?while(t!=NULL)
?{
?printf("%d ",t-data);
?t=t-next;// 继续下一个结点
?}
?? ?system("pause");
?? ?return 0;
}
请采纳
C语言 链表
SLIST??*creatlist()
{
????????SLIST???*head,*tail,*cnew;
????????head=NULL;
int?num;
printf("输入数据(以-1结束):");
while(1)
{
?scanf("%d",num);
?if(num==-1)//输入为-1表示输入结束
???break;
?cnew=(SLIST*)malloc(sizeof(SLIST));
?cnew-data=num;
?cnew-next=NULL;
?if(head==NULL)//若为空则将头节点指向新节点
????head=cnew;
?else
????tail-next=cnew;//将当前节点的next指向新的节点
?tail=cnew;
}
return?head;
}
void?outlist(SLIST??*h)
{??
/*这里输出链表中各个数据*/
SLIST???*p;
if(h==NULL)
{
printf("链表为空,没有数据\n");
return;
}
printf("\n-----链表的数据元素------\n");
for(p=h;p!=NULL;p=p-next)
??printf("%d?",p-data);
printf("\n");
}
不知道 你为啥问两遍
实测编译通过 ? 望采纳