链表的增删改查
功能函数:创建函数
link* creat_linklist()
{
link* head=(link*)malloc(sizeof(link));
if(NULL==head){
printf("创建链表失败\n");
return (link*)-1;
}
head->text.len=0;
head->next=NULL;
return head;
}
功能函数:头部插入数据
void insert_linkDataBefore(link* head,datatype data)
{
link* temp=(link*)malloc(sizeof(link));
temp->next=NULL;
temp->text.data=data;
temp->next=head->next;
head->next=temp;
head->text.len++;
return;
}
功能函数:尾部插入数据
void insert_linkDataAfter(link* head,datatype data)
{
link* temp=(link*)malloc(sizeof(link));
temp->text.data=data;
temp->next=NULL;
link* p=head;
while(p->next!=NULL){
p=p->next;
}
p->next=temp;
head->text.len++;
return;
}
功能函数:根据指定位置插入数据
void insert_linkDataByIndex(link* head,int index,datatype data)
{
if(index>head->text.len+1 || index<0){
printf("插入位置不合法\n");
return;
}
if(NULL==head){
printf("链表不合法\n");
return;
}
link* temp=(link*)malloc(sizeof(link));
temp->next=NULL;
temp->text.data=data;
link* p=head;
for(int i=0;i<index-1;i++){ //找到前一个
p=p->next;
}
temp->next=p->next;
p->next=temp;
head->text.len++;
return;
}
功能函数:从头部删除数据
void delete_linkDataBefore(link* head)
{
if(NULL==head->next||NULL==head){
printf("链表为空,删除失败\n");
return;
}
link* temp=head->next;
head->next=head->next->next;
free(temp);
head->text.len--;
return;
}
功能函数:从尾部插入数据
void delete_linkDataAfter(link* head)
{
if(NULL==head->next||NULL==head){
printf("链表为空,删除失败\n");
return;
}
link* p=head;
while(p->next->next!=NULL){
p=p->next;
}
link* temp=p->next;
p->next=NULL;
head->text.len--;
free(temp);
return;
}
功能函数:从指定位置插入数据
void delete_linkDataByIndex(link* head,int index)
{
if(index<=0 || index>head->text.len){
printf("删除位置不合法\n");
return;
}
if(NULL==head){
printf("链表不合法\n");
return;
}
link* p=head;
for(int i=0;i<index-1;i++){ //找到前一个
p=p->next;
}
link* temp=p->next;
p->next=p->next->next;
head->text.len--;
free(temp);
temp=NULL;
return;
}
功能函数:根据指定位置查询链表数据
void search_linkDataByIndex(link* head,int index)
{
link* p=head;
for(int i=0;i<index;i++){
p=p->next;
}
printf("%d\n",p->text.data);
return;
}
功能函数:遍历链表
void show_linklist(link* head)
{
if(NULL==head){
printf("链表错误\n");
}
link* p=head->next;
while(p!=NULL){
printf("%d ",p->text.data);
p=p->next;
}
putchar(10);
printf("%d\n",head->text.len);
return;
}
功能函数:按升序排列数据
void insert_linkAndSort(link* head,datatype data)
{
link* temp=(link*)malloc(sizeof(link));
temp->next=NULL;
temp->text.data=data;
if(NULL==head){
printf("链表错误\n");
return;
}
link* p=head;
while(p->next!=NULL){
if(p->next->text.data>temp->text.data){
break;//退出做插入
}
p=p->next;
}
temp->next=p->next; //尾部插入也满足
p->next=temp;
head->text.len++;
return;
}
功能函数:快慢指针查找中间数据
link* find_centerIndex(link* head)
{
if(NULL==head){
printf("链表错误\n");
return NULL;
}
link* slow,*fast;
slow=fast=head->next; //从第一个位置开始
while( fast !=NULL&&fast->next!=NULL){
slow=slow->next; //slow一次偏移1位
fast=fast->next->next; //fast一次偏移两位
}
return slow;
}
功能函数:链表翻转
思路:将head头结点独立出来,并将后面的结点一个一个取出来进行头插
由于断链会导致找不到后面的链,需要将后面的第一个存起来,使用p
由于p是移动中的结点,当它头插后,后面的链又找不到了,于是需要再往后存,用q
void rever_link(link* head)
{
//将head独立出来
link* p,*q;
p=head->next; //保存第一个节点
// q=p->next; //保存第二个节点
head->next=NULL; //独立head
while(p!=NULL){//当移动的节点为空时退出
q=p->next; //往后移动一位
p->next=head->next;//头插
head->next=p;
p=q; //往后移动一位
}
return;
}
头文件
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct Link{
union{
int len;
datatype data;
} text;
struct Link* next;
} link;
link* creat_linklist();
void insert_linkDataBefore(link* head,datatype data);
void insert_linkDataAfter(link* head,datatype data);
void insert_linkDataByIndex(link* head,int index,datatype data);
void delete_linkDataBefore(link* head);
void delete_linkDataAfter(link* head);
void delete_linkDataByIndex(link* head,int index);
void search_linkDataByIndex(link* head,int index);
void show_linklist(link* head);
void insert_linkAndSort(link* head,datatype data);
link* find_centerIndex(link* head);
void rever_link(link* head);
#endif
主函数
#include "./03_linklist.h"
int main(int argc, const char *argv[])
{
link* head=creat_linklist();
insert_linkAndSort(head,20);
insert_linkAndSort(head,300);
insert_linkAndSort(head,25);
insert_linkAndSort(head,70);
show_linklist(head);
link* slow=find_centerIndex(head);
printf("slow=%d\n",slow->text.data);
return 0;
insert_linkDataBefore(head,10);
insert_linkDataBefore(head,11);
insert_linkDataBefore(head,12);
insert_linkDataAfter(head,13);
insert_linkDataAfter(head,14);
insert_linkDataAfter(head,15);
insert_linkDataByIndex(head,3,100);
delete_linkDataByIndex(head,4);
// delete_linkDataBefore(head);
// delete_linkDataAfter(head);
search_linkDataByIndex(head,1);
show_linklist(head);
return 0;
}