c语言链表一 ,单向链表,

很久没有用过链表,发现现在只记得思路,代码的编写已经忘得七七八八,写一篇博客回忆一下。

链表是一种常见的基础数据结构,主要使用结构体指针。

链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入,排序,反序,清空链表等操作。

链表关键节点:头结点,尾节点,中间节点。

头结点是为了处理空表的方便所引用的,用来存放链表中的第一节点的位置,它的data域(数据域)不存放任何信息

一 :单向链表

一个节点,有数据域和指针域两个块,指针域指向下一个节点的数据域,尾节点指针域指向空(单向不循环链表),如果是循环链表则指向头结点的数据域。
在这里插入图片描述
不管是什么链表都要先定义一个结构体,创建链表。

此处单向链表代码引用于一篇博客https://blog.csdn.net/Endeavor_G/article/details/80552680

1.定义一个链表结构体

typedef struct list{
int date;
struct list *next;
} codeList;

2.创建链表 //sum为链表长度

codeList*creat_list(int sum)
{
codeList *head, *node, *tail; //定义头节点,中间节点,尾节点;
head = (codeList *)malloc(sizeof(codeList )); //分配地址,申请空间
tail= head; //若是链表为空,则头尾节点是一样
for (int i = 0; i < sum; i++)
{
node = (codeList *)malloc(sizeof(codeList ));
scanf("%d", &node->date);//输入数据域的数据
tail->next = node;
tail = node;//更换为尾节点
}
tail ->next = NULL;//,尾节点指向空,结束创建
return head;
}

3.修改链表节点值 ,//n为第n个节点

void change(codeList *list,int n)
{
codeList *t = list;
int i = 0;
while (i < n && t != NULL)
{
t = t->next;
i++;
}
if (t != NULL)
{
puts(“输入要修改的值”);
scanf("%d", &t->date);
}
else
{
puts(“节点不存在”);
}
}

4.删除链表节点
删除链表的元素也就是把前节点的指针域越过要删除的节点指向下下个节点,
在这里插入图片描述
删除节点b,那么a节点的指针域就要指向c节点的数据域

a->next=b->next;
然后释放b节点的空间,既free(b)

void delet_liatnode(codeList *list, int n) //n是指第几个节点
{
codeList *b = list, *a;
int i = 0;
while (i < n && b != NULL)
{
a= b;
b= b->next;
i++;
}
if (b != NULL)
{
a->next = b->next;
free(b);
}
else
{
puts(“节点不存在”);
}
}

5.插入链表节点
插入节点就是用插入前节点的指针域链接上插入节点的数据域,再把插入节点的指针域链接上插入后节点的数据域,如图:
在这里插入图片描述
b->next=a->next;
a->next=b;

代码如下:

void insert(codeList *list, int n) //n是指第几个节点
{
codeList *a= list, *b;
int i = 0;
while (i < n && a!= NULL)
{
a = a->next;
i++;
}
if (a!= NULL)
{
b= (codeList *)malloc(sizeof(codeList ));
puts(“输入要插入的值”);
scanf("%d", &b->date);
b->next = a->next;//填充b节点的指针域,也就是说把b的指针域指向t的下一个节点
a->next = b;//填充a节点的指针域,把a的指针域重新指向b
}
else
{
puts(“节点不存在”);
}
}

6.链表反序
如图,实现逆序:从头节点开始反序
在这里插入图片描述
a->b->c->d->NULL
NULL<-a<-b<-c<-d

定义三个指针变量,*prep,*nowp,*nextp分别指向前一个结点,当前结点和下一个结点 :
codeList *fanxu(codeList *head)
{
codeList *prep,*nowp,*nextp;
prep=NULL;
nowp=head;
while(nowp != NULL)
{
nextp=nowp->next; //按顺序往下遍历
nowp->next=prep; //第一次逆序 先确定尾节点
prep=nowp; //交换 ,保持逆序
nowp=nextp; //交换,保持顺序
}
return prep; //返回逆序的头节点
}

还有其它方法实现逆序,参考博客链接https://blog.csdn.net/wujiafei_njgcxy/article/details/53470518

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值