//head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
enum{FALSE=-1,SUCCESS};
typedef int datatype;
//定义节点结构体
typedef struct Node
{
//数据域
datatype data;
//指针域
struct Node *next;
}*Linklist;
Linklist create();
Linklist insert_head(Linklist head,datatype element);
void output(Linklist head);
Linklist insert_tail(Linklist head,datatype element);
Linklist delete_head(Linklist head);
Linklist delete_tail(Linklist head);
Linklist insert_pos(Linklist head,int pos,datatype element);
Linklist delete_pos(Linklist head,int pos);
void search_pos(Linklist head,int pos);
void modify_pos(Linklist head,int pos,datatype element);
Linklist rev(Linklist head);
void modify_rev(Linklist head,int n);
void Bubble(Linklist head);
void search__key(Linklist head,datatype key);
void modify_key(Linklist head,datatype key,datatype element);
int search_key_r(Linklist head,datatype key);
Linklist delete_key(Linklist head,datatype key);
Linklist my_free(Linklist head);
#endif
单链表按任意元素查找
参数:head,查找的元素key
有返(只能查找一个)
//main.c
//单链表任意元素查找(有返)
datatype key;
printf("please enter search key:");
scanf("%d",&key);
datatype value=search_key_r(head,key);
printf("%d\n",value);
//test.c
//单链表任意元素查找(有返)
int search_key_r(Linklist head,datatype key)
{
//链表为空
if(NULL==head)
{
puts("empty");
return FALSE;
}
//查找
int flag=-1;
Linklist p=head;
for(int i=0;i<length(head);i++)
{
if(key==p->data)
{
flag=i+1;
break;
}
p=p->next;
}
return flag;
}
无返
//main.c
//单链表任意元素查找
datatype key;
printf("please enter modify key:");
scanf("%d",&key);
search_key(head,key);
//test.c
//单链表任意元素查找
void search_key(Linklist head,datatype key)
{
//链表为空
if(NULL==head)
{
puts("empty");
return;
}
//循环遍历
int flag=-1;
Linklist p=head;
for(int i=0;i<length(head);i++)
{
if(key==p->data)
{
flag=i+1;
printf("%d ",flag);
}
p=p->next;
}
printf("\n");
if(flag==-1)
puts("NO!");
}
单链表按任意元素修改
//main.c
//单链表任意元素修改
datatype key;
printf("please enter modify key:");
scanf("%d",&key);
printf("please enter modify element:");
scanf("%d",&element);
modify_key(head,key,element);
output(head);
//test.c
//单链表任意元素修改
void modify_key(Linklist head,datatype key,datatype element)
{
//链表为空
if(NULL==head)
{
puts("empty");
return;
}
//查找
while(search_key_r(head,key)!=-1)
{
//调用任意位置修改函数
int pos=search_key_r(head,key);
modify_pos(head,pos,element);
}
}
单链表按任意元素删除
//main.c
//单链表任意元素删除
datatype key;
printf("please enter delete key:");
scanf("%d",&key);
head=delete_key(head,key);
output(head);
//test.c
//单链表任意元素删除
Linklist delete_key(Linklist head,datatype key)
{
//链表为空
if(NULL==head)
{
puts("empty");
return NULL;
}
//查找
while(search_key_r(head,key)!=-1)
{
//调用任意位置删除函数
int pos=search_key_r(head,key);
head=delete_pos(head,pos);
}
return head;
}
单链表排序
//Bubble
//main.c
//单链表排序
Bubble(head);
printf("Bubble:\n");
output(head);
//test.c
//单链表排序
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;//指针后移
}
}
}
//Simple_Sort
//main.c
//单链表排序(简单选择)
Simple_Sort(head);
printf("Simple_Sort:\n");
output(head);
//test.c
//单链表排序(简单选择)
void Simple_Sort(Linklist head)
{
for(Linklist i=head;i->next!=NULL;i=i->next)
{
Linklist min=i;
for(Linklist j=i->next;j;j=j->next)
{
if(min->data>j->data)
{
min=j;
}
}
if(min!=i)
{
datatype t=min->data;
min->data=i->data;
i->data=t;
}
}
}
单链表释放内存
//main.c
//单链表内存释放
head=my_free(head);
//test.c
//单链表内存释放
Linklist my_free(Linklist head)
{
if(NULL==head)
return NULL;
while(head)
{
Linklist p=head;
head=head->next;
free(p);
p=NULL;
}
return head;
}