头文件和注释:
#ifndef __DANLIAN__
#define __DANLIAN__
typedef int elmType;
typedef struct Node
{
union{
elmType text;
int len;
} data;
struct Node* next;
}Node;
Node* initNode();//初始化链表
int isEmpty(Node* node);//判断是否为空
void output(Node* node);//遍历输出
void headInsert(Node* node,elmType data);//头插
void tailInsert(Node* node,elmType data);//尾巴插
elmType deNode(Node* node);//尾巴删除
elmType deDtata(Node* node,elmType data);//按值删除
elmType deHead(Node* node);//头删除
elmType deIndex(Node* node,int index);//按位删除
elmType insertIndex(Node* node,elmType data,int index);//按位插入
elmType catIndex(Node* node,int index);//按位查找
void turn(Node* node);//链表前后翻转
elmType midElem(Node* node);//找到中间节点,使用快慢指针,返回值
void Bubble_sort(int arr[], int size);//冒泡升序排列
void insertSort(Node* node,elmType data);//插入排序
#endif
函数实现:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "danlianbiao.h"
Node* initNode()//初始化节点
{
Node* node=(Node*)malloc(sizeof(Node));
if(NULL==node)
{
printf("创建单链表失败\n");
return NULL;
}
node->data.len=0;
node->next=NULL;
return node;
}
int isEmpty(Node* node)//判空
{
if(node->data.len==0)
{
return 1;
}
else
return 0;
}
void output(Node* node)//遍历打印
{
Node* temp=node->next;
while (temp)
{
printf("%d ",temp->data.text);
temp=temp->next;
}
putchar(10);
}
void headInsert(Node* node,elmType data)//头插法
{
Node* newnode=(Node*)malloc(sizeof(Node));
newnode->data.text=data;
newnode->next=node->next;
node->next=newnode;
node->data.len++;
}
void tailInsert(Node* node,elmType data)//尾巴插法
{
Node* newNode=(Node*)malloc(sizeof(Node));
newNode->data.text=data;
Node* temp=node;
while (temp->next)
{
temp=temp->next;
}
newNode->next=temp->next;
temp->next=newNode;
node->data.len++;
}
elmType deNode(Node* node)//尾巴删除
{
if(isEmpty(node))
{
printf("没有什么删除的\n");
return -1;
}
Node* temp=node->next;
Node* pre=node;
while (temp->next)
{
pre=temp;
temp=temp->next;
}
elmType x=temp->data.text;
//printf("%d\n",x);
pre->next=temp->next;
free(temp);
node->data.len--;
return x;
}
elmType deDtata(Node* node,elmType data)//按照数据删除节点
{
if(isEmpty(node))
{
printf("梅沙可以删除的\n");
return -1;
}
Node* temp=node->next;
Node* pre=node;
while (temp)
{
if(temp->data.text==data)
{
pre->next=temp->next;
free(temp);
node->data.len--;
return 1;
}
temp=temp->next;
pre=pre->next;
}
return 0;
}
elmType deHead(Node* node)//头删除
{
if(isEmpty(node))
{
printf("没有节点删除\n");
return -1;
}
Node* temp=node->next;
elmType x=temp->data.text;
node->next=temp->next;
free(temp);
node->data.len--;
return x;
}
elmType deIndex(Node* node,int index)//按位删除
{
if(isEmpty(node)||index<1||index>node->data.len)
{
printf("cuowu\n");
return -1;
}
Node* temp=node->next;
Node* pre=node;
for(int i=1;i<index;i++)
{
temp=temp->next;
pre=pre->next;
}
int x=temp->data.text;
pre->next=temp->next;
free(temp);
node->data.len--;
return x;
}
elmType insertIndex(Node* node,elmType data,int index)//按位插入
{
Node* pre=node;
Node* temp=node->next;
for(int i=1;i<index;i++)
{
temp=temp->next;
pre=pre->next;
}
Node* newNode=(Node*)malloc(sizeof(Node));
newNode->data.text=data;
newNode->next=temp;
pre->next=newNode;
node->data.len++;
}
elmType catIndex(Node* node,int index)//按位查找
{
if(index<0||index>node->data.len)
{
return -1;
}
int flag=1;
Node* temp=node->next;
while (flag!=index)
{
temp=temp->next;
flag++;
}
printf("%d\n",temp->data.text);
return temp->data.text;
}
void turn(Node* node)//反转前后
{
if(isEmpty(node)||node->data.len==1)
{
return;
}
//Node* temp=node->next;
int len=node->data.len;
elmType arr[len];
for(int i=0;i<len;i++)
{
arr[i]=deHead(node);
}
for(int i=0;i<len;i++)
{
headInsert(node,arr[i]);
}
}
elmType midElem(Node* node)//寻找中间
{
if(isEmpty(node))
{
printf("空心的你找个登中间\n");
return -1;
}
Node* fast=node;
Node* slow=node;
int index=0;
while (fast)
{
fast=fast->next->next;
slow=slow->next;
index++;
}
printf("中间的是第%d位,数值为%d\n",index,slow->data.text);
return slow->data.text;
}
void Bubble_sort(int arr[], int size)
{
int j,i,tem;
for (i = 0; i < size-1;i ++)
{
int count = 0;
for (j = 0; j < size-1 - i; j++)
{
if (arr[j] > arr[j+1])//这是升序排法
{
tem = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tem;
count = 1;
}
}
if (count == 0)
break;
}
}
void insertSort(Node* node,elmType data)//插入排序
{
if(isEmpty(node))
{
tailInsert(node,data);
return;
}
int len=node->data.len;
elmType arr[len+1];
for(int i=0;i<len;i++)
{
arr[i]=deHead(node);
}
arr[len]=data;
Bubble_sort(arr,len+1);
for(int i=0;i<len+1;i++)
{
tailInsert(node,arr[i]);
}
}
函数调用测试
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "danlianbiao.h"
int main(void)
{
Node* node=initNode();
printf("%d\n",deNode(node));
for(int i=1;i<10;i++)
{
tailInsert(node,i);
}
for(int i=9;i>0;i--)
{
headInsert(node,i);
}
output(node);
deNode(node);
output(node);
deDtata(node,8);
output(node);
deHead(node);
output(node);
deIndex(node,1);
output(node);
insertIndex(node,888,1);
output(node);
catIndex(node,1);
turn(node);
output(node);
midElem(node);
Node* nowe=initNode();
int arr[5]={77,90,46,35,86};
for(int i=0;i<5;i++)
{
insertSort(nowe,arr[i]);
}
output(nowe);
return 0;
}