链表
单链表按任意元素查找
单链表按任意元素修改
单链表按任意元素删除
单链表排序
单链表释放内存
头文件:
#ifndef _HEAD_H_
#define _HEAD_H_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <unistd.h>
//枚举
enum
{
FALSE=-1,
SUCCESS
};
//类型重定义int
typedef int datatype;
//定义链表
typedef struct Node
{
//数据域:存储数据元素
datatype data;
//指针域:存储下一个节点的地址
struct Node *next;
}*linklist;
linklist create();
linklist insert_rear(linklist head,datatype element);
void output(linklist head);
int length(linklist head);
int search_element(linklist head,int key);
linklist updata_element(linklist head,int key,int element);
linklist delet_element(linklist head,int key);
void bubble(linklist head);
void simply_list(linklist head);
linklist free_list(linklist head);
main.c文件:
int n;
datatype element;
int key;
linklist head=NULL;//头指针指向NULL
printf("please enter n:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("please enter %d element:",i+1);
scanf("%d",&element);
head=insert_rear(head,element);//尾插
}
output(head);
printf("please enter search key:");//按任意元素查找
scanf("%d",&key);
int a=search_element(head,key);
printf("元素%d对应的位置是%d\n",key,a);
printf("please enter updata key and updata element:");//按任意元素修改
scanf("%d %d",&key,&element);
head=updata_element(head,key,element);
output(head);
printf("please enter delet key:");//按任意元素删除
scanf("%d",&key);
head=delet_element(head,key);
output(head);
bubble(head);//排序
printf("冒泡排序后链表为如下");
output(head);
head=free_list(head);//单链表释放内存
output(head);
printf("单链表成功释放内存");
return 0;
}
封装函数
#include "head.h"
//创建新节点
linklist create()
{
linklist s=(linklist)malloc(sizeof(struct Node));
if(NULL==s)
{
return NULL;
}
s->data=0;
s->next=NULL;
return s;
}
//尾插
linklist insert_rear(linklist head,datatype element)
{
linklist s=create();
s->data=element;
if(NULL==head)
head =s;
else
{
linklist p=head;
while(p->next!=NULL)
{
p=p->next;
}
p->next=s;
}
return head;
}
//遍历输出
void output(linklist head)
{
if(NULL==head)
{
puts("empty");
return;
}
linklist p=head;
while(p!=NULL)
{
printf("%-5d",p->data);
p=p->next;//后移
}
puts("");
}
//计算链表长度
int length(linklist head)
{
int len=1;
linklist p=head;
while(p->next!=NULL)
{
len++;
p=p->next;
}
return len;
}
//按任意元素查找
int search_element(linklist head,int key)
{
if(head==NULL)
{
puts("empty");
return FALSE;
}
linklist p=head;
int pos=1;
while(p!=NULL)
{
if(p->data==key)
{
return pos;
}
p=p->next;
pos++;
}
}
//按任意元素修改
linklist updata_element(linklist head,int key,int element)
{
if(head==NULL)
{
puts("empty");
return head;
}
linklist p=head;
while(p!=NULL)
{
if(p->data==key)
{
p->data=element;
return head;
}
p=p->next;
}
}
//按任意元素删除
linklist delet_element(linklist head,int key)
{
if(head==NULL)
{
puts("empty");
return head;
}
linklist p=head;
int pos=1;
while(p!=NULL)
{
if(pos==1)
{
if(p->data==key)
{ linklist del=head;
head=head->next;
free(del);
del=NULL;
return head;
}
else
{
linklist del=p->next;
p->next=del->next;
free(del);
del=NULL;
return head;
}
}
p=p->next;
}
}
//冒泡排序
void bubble(linklist head)
{
if(NULL==head)
return;
int len=length(head);
for(int i=1;i<len;i++)
{
linklist p=head;
for(int j=0;j<len-i;j++)
{
if(p->data>p->next->data)
{
datatype t=p->data;
p->data=p->next->data;
p->next->data=t;
}
p=p->next;
}
}
}
//修改后的简单选择
void simply_list(linklist head)
{
if(NULL==head)
return ;
for(linklist i=head;i->next!=NULL;i=i->next)
{
linklist min=i;
for(linklist j=i->next;j!=NULL;j=j->next)
{
if(i->data>j->data)
{
min=j;
}
}
if(min!=i)
{
datatype t=min->data;
min->data=i->data;
i->data=t;
}
}
}
//单链表释放内存
linklist free_list(linklist head)
{
if(NULL==head)
return head;
linklist p=head;
linklist del;
while(p!=NULL)
{
del=p->next;//保存节点
free(p);
p=del;//移动到下一个节点
}
return p;
}
简单选择排序
//简单选择排序
void easy(linklist head)
{
linklist p=head;
linklist q=head->next;
while(p!=NULL)
{
q=p->next;
while(q!=NULL)
{
if(p->data>q->data)
{
datatype t=p->data;
p->data=q->data;
q->data=t;
}
q=q->next;
}
p=p->next;
}
}
思维导图