C语言的链表(c语言的链表实现栈的功能)
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语言 链表
记录上一个节点的位置 链表就是上一个节点的next保存着下一个结构的地址 所以第22行就是保存上一个节点的位置
第26行就是每添加一个结构并把那个节点的next设置为NULL 如果还有添加的 把新节点给next 再把next设置为NULL
C语言里面的链表是什么
C语言里面的链表是一种数据结构
是一种线形的存储结构
链表和数组一样,也是将一组同类型的数据组织在一起的一种数据结构
不同的是
数组采用的是顺序存储,依靠数组的首地址和元素的相对地址(下标)来实现访问。
优点是访问方便快捷,而缺点是数组是静态的,不利于实现元素的动态增减。
而链表采用的是离散存储,依靠节点间的指向下一个节点的指针来实现访问。
其优缺点和数组相反
c语言 链表
#include
#include
//这里创建一个结构体用来表示链表的结点类型
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;
}
请采纳