好友
阅读权限20
听众
最后登录1970-1-1
|
本帖最后由 Anekys 于 2020-2-22 17:40 编辑
准备NCRE二级C语言,学到动态链表这里心血来潮,自己仿写了一个.代码如下
[C] 纯文本查看 复制代码 #include <stdio.h>
#include <stdlib.h>
typedef struct Node //定义一个可作为数链表结点的结构体,分为数据部分,和地址部分.
{
int data; //数据部分存储数据
struct Node * pnext; //地址部分存储下一结点的地址
}N,*P; //为这种结点起名为N,其自身的内存地址取名为P
P create(void) //创建一个动态链表的头结点
{
P phead=(P)malloc(sizeof(N)); //申请一块儿内存空间
if(phead == NULL) //判断是否申请失败
{
printf("分配内存失败!\n");
return NULL;
}
phead->pnext = NULL; //将地址部分置空(因为这里只创建了一个结点而尾结点的地址部分是要为NULL的)
return phead; //返回头结点的内存地址
}
void input (P phead,int value) //在链表最后加上一个结点
{
P last = (P)malloc(sizeof(N)); //申请一块儿内存空间并把这块内存空间的地址放到last中存放
if(last==NULL) //判断内存是否申请失败
{
printf("分配内存失败");
exit(-1);
}
last->data = value; //将要加入的数据放到数据部分
last->pnext =NULL; //将地址部分置空
while(phead->pnext != NULL) //找寻添加结点前的最后一个结点
{
phead=phead->pnext;
}
phead->pnext =last; //将新创建的结点与原有链表拼合
}
int len(P phead) //取链表含有有效数据的结点的个数
{
for(int i=0;phead->pnext != NULL;++i) //遍历整个链表的有效结点
phead=phead->pnext ;
return i;
}
void show(P phead) //把整个链表中结点存放的数据输出
{
while(phead->pnext != NULL) //遍历整个链表的有效结点并输出数据部分
{
phead=phead->pnext ;
printf("%d\n",phead->data );
}
}
bool del(P phead,int index) //删除第index个结点
{
if(index < 0 || phead->pnext == NULL || index >len(phead)) //判断链表是否只有一个头结点或者index的位置不存在
return false;
for(int i=1;i<index;++i) //找到第index结点的前一个结点
phead=phead->pnext;
P p0=phead->pnext ; //将第index的结点位置保存下来
phead->pnext =p0->pnext ; //将index的后一个结点与其前一个结点拼合
free(p0); //释放原index结点的内存空间
return true;
}
bool insert(P phead,int index,int value) //在第index结点的前面插入一个结点
{
if(index < 0 || phead->pnext == NULL ) //判断链表是否只有一个头结点或者index的位置不存在
return false;
if(index>len(phead)) //如果index大于链表的有效节点数则直接在链表的最末尾添加
{
input(phead,value);
return true;
}
for(int i=1;i<index;++i) //找到index结点的前一个结点
phead=phead->pnext;
P p0=(P)malloc(sizeof(N)); //创建要插入的新结点
p0->data =value; //将数据存入新节点的数据部分
p0->pnext =phead->pnext ; //将新节点的地址部分指向被插入的结点
phead->pnext=p0; //将被插入结点的前一个结点的地址部分指向新插入的结点
return true;
}
void invert(P phead) //将链表倒置(逆序排放)
{
if(phead == NULL || phead->pnext == NULL) //判断是否只有一个头结点或头结点是否存在
return;
P p0=phead->pnext; //这里定义了三个p类型的结构体,用来存放链表中的数据
P p1=p0->pnext;
P p_0=p0,p2; //整体的思路为:
while(p1 != NULL) //先按顺序找都头结点后的三个结点
{ //将第二个结点的地址部分指向前一个结点
p2=p1->pnext; //然后这三个结点的位置一起向后移动一个位置
p1->pnext=p0; //通过循环结构遍历整个链表并完成上述操作
p0=p1;
p1=p2;
}
p_0->pnext=NULL; //将倒置后的最后一个结点(尾结点)的地址部分置空(NULL)
phead->pnext=p0; //将头结点的地址部分指向倒置后的第一个有效结点(也就是倒置前的最后一个结点)
}
void main()
{
P head=create();
//printf("%d\n",head);
input(head,1);
input(head,2);
input(head,3);
input(head,4);
// del(head,3);
// insert(head,4,5);
// invert(head);
show(head);
// printf("%d\n",len(head));
}
编写环境为VC6.0,因为我们学校的C语言课的期末考可以通过自己写一个C程序给老师讲解,让老师直接判定是否合格.
所以开贴分享,顺便做个记录. |
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|