注:单追求代码简洁,所以写法可能有点不标准。
//第一次拿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;//作用只是方便freewhile((*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);
}