c语言简便实现链表增删改查
【摘要】 注:单追求代码简洁,所以写法可能有点不标准。
//第一次拿c开始写数据结构,因为自己写的,追求代码量少,和学院ppt不太一样。有错请指出#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct node//定义节点{ int data; str...
注:单追求代码简洁,所以写法可能有点不标准。
-
//第一次拿c开始写数据结构,因为自己写的,追求代码量少,和学院ppt不太一样。有错请指出
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <string.h>
-
typedef struct node//定义节点
-
{
-
int data;
-
struct node * next;
-
}Node;
-
//函数介绍
-
void printlist(Node * head)//打印链表
-
int lenlist(Node * head)//返回链表长度
-
void insertlist(Node ** list,int data,int index)//插入元素
-
void pushback(Node ** head,int data)//尾部插入
-
void freelist(Node ** head)//清空链表
-
void deletelist(Node ** list,int data)//删除元素
-
Node * findnode(Node ** list,int data)//查找
-
void change(Node ** list,int data,int temp)//改变值
打印
-
void printlist(Node * head)//打印链表
-
{
-
for(;head!=NULL;head=head->next) printf("%d ",head->data);
-
printf("\n");//为了其他函数打印,最后换行
-
}
链表长度
-
int lenlist(Node * head)//返回链表长度
-
{
-
int len;
-
Node * temp = head;
-
for(len=0; temp!=NULL; len++) temp=temp->next;
-
return len;
-
}
插入元素
-
void insertlist(Node ** list,int data,int index)//插入元素,用*list将head指针和next统一表示
-
{
-
if(index<0 || index>lenlist(*list))return;//判断非法输入
-
Node * newnode=(Node *)malloc(sizeof(Node));//创建
-
newnode->data=data;
-
newnode->next=NULL;
-
while(index--)list=&((*list)->next);//插入
-
newnode->next=*list;
-
*list=newnode;
-
}
尾部增加元素
-
void pushback(Node ** head,int data)//尾插,同上
-
{
-
Node * newnode=(Node *)malloc(sizeof(Node));//创建
-
newnode->data=data;
-
newnode->next=NULL;
-
while(*head!=NULL)head=&((*head)->next);//插入
-
*head=newnode;
-
}
清空链表
-
void freelist(Node ** head)//清空链表
-
{
-
Node * temp=*head;
-
Node * ttemp;
-
*head=NULL;//指针设为空
-
while(temp!=NULL)//释放
-
{
-
ttemp=temp;
-
temp=temp->next;
-
free(ttemp);
-
}
-
}
删除
-
void deletelist(Node ** list,int data)//删除链表节点
-
{
-
Node * temp;//作用只是方便free
-
while((*list)->data!=data && (*list)->next!=NULL)list=&((*list)->next);
-
if((*list)->data==data){
-
temp=*list;
-
*list=(*list)->next;
-
free(temp);
-
}
-
}
查找
-
Node * findnode(Node ** list,int data)//查找,返回指向节点的指针,若无返回空
-
{
-
while((*list)->data!=data && (*list)!=NULL) list=&((*list)->next);
-
return *list;
-
}
改值
-
void change(Node ** list,int data,int temp)//改变
-
{
-
while((*list)->data!=data && (*list)->next!=NULL)list=&((*list)->next);
-
if((*list)->data==data)(*list)->data=temp;
-
}
最后测试
-
int main(void)//测试
-
{
-
Node * head=NULL;
-
Node ** gg=&head;
-
int i;
-
for(i=0;i<10;i++)pushback(gg,i);
-
printf("链表元素依次为: ");
-
printlist(head);
-
printf("长度为%d\n",lenlist(head));
-
freelist(gg);
-
printf("释放后长度为%d\n",lenlist(head));
-
for(i=0;i<10;i++)pushback(gg,i);
-
deletelist(gg,0);//头
-
deletelist(gg,9);//尾
-
deletelist(gg,5);
-
deletelist(gg,100);//不存在
-
printf("再次创建链表,删除节点后\n");
-
printlist(head);
-
freelist(gg);
-
for(i=0;i<5;i++)pushback(gg,i);
-
insertlist(gg,5,0);//头
-
insertlist(gg,5,5);
-
insertlist(gg,5,7);//尾
-
insertlist(gg,5,10);//不存在
-
printlist(head);
-
printf("找到%d\n把3变为100",*findnode(gg,5));
-
change(gg,3,100);
-
change(gg,11111,1);//不存在
-
printlist(head);
-
}
文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。
原文链接:fantianzuo.blog.csdn.net/article/details/81261043
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)