链表c语言语法,c语言链表函数

http://www.itjxue.com  2023-01-20 15:49  来源:未知  点击次数: 

如何用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");

}

不知道 你为啥问两遍

实测编译通过 ? 望采纳

(责任编辑:IT教学网)

更多