11> 单链表按任意元素查找
12> 单链表按任意元素修改
13> 单链表按任意元素删除
16> 单链表排序
17> 单链表释放内存
1.c(主函数)
#include "head.h"
int main(int argc, const char *argv[])
{
linklst head=NULL;
int n;
datatype element;
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_head(head,element);//头插
head=insert_rear(head,element); //尾部插入
}
output(head);
// head=head_delete(head,element);//头部删除
// head=rear_delete(head); //尾部删除
// output(head);
//
/*
int pos; //插入位置
printf("please enter position you want:");
scanf("%d",&pos);
printf("please enter element");
scanf("%d",&element);
head=insert_pos(head,pos,element);
output(head);
*/
/* int pos;//按照任意位置删除
printf("please enter position you want delete:");
scanf("%d",&pos);
head=delete_pos(head,pos);
output(head);*/
/*
int pos;
printf("please enter position you want:");
scanf("%d",&pos);
printf("please enter element you want:");
scanf("%d",&element);
change_pos(head,pos,element);
output(head);*/
// find_pos(head,pos);
// inverse(head);
// output(head);
/*
printf("please enter n:");//查找倒数第n个
scanf("%d",&n);
find__n(head,n);
return 0;
*/
/*
int key; //按照输入的元素查找
printf("printf the key you want:");
scanf("%d",&key);
head=find_key(head,key);
*/
/*
int key;//单链表按照任意元素修改
printf("printf the key you want:");
scanf("%d",&key);
printf("printf the element you want replace:");
scanf("%d",&element);
replace_key(head,key,element);
output(head);
*/
/*
printf("printf the element you want delete:");//单链表按照任意元素删除
scanf("%d",&element);
delete_element(head,element);
output(head);
*/
/*
bubble(head); //冒泡排序
output(head);
*/
head=free_list(head);
output(head);
return 0;
}
2.test.c(函数调用)
#include "head.h"
//创建节点
linklst create()
{
linklst s=(linklst)malloc(sizeof(struct Node));
if(NULL == s)
{
return NULL;
}
else
s->data=0;
s->next=NULL;
}
//头部插入
linklst insert_head(linklst head,datatype element)
{
linklst s=create();
s->data=element;
if(NULL == head)
{
head=s;
}
else
{
s->next=head;
head=s;
}
return head;
}
//打印输出
void output(linklst head)
{
if(NULL==head)//
{
puts("empty");
return;
}
linklst p=head;
while(p!=NULL)
{
printf("%-5d",p->data);
p=p->next;
}
puts("");
}
//尾部插入
linklst insert_rear(linklst head,datatype element)
{
linklst s=create();
s->data=element;
if(NULL==head)
head=s;
else
{
linklst p=head;
while(p->next!=NULL)
{
p=p->next;
linklst insert_rear();
}
p->next=s;
}
return head;
}
//头部删除
linklst head_delete(linklst head)
{
if(NULL==head)
return head;
linklst del=head;
head=head->next;
free(del);
del=NULL;
return head;
}
//尾部删除
linklst rear_delete(linklst head)
{
if(NULL==head)
return head;
else if(head->next==NULL)
{
free(head);
return head;
}
else
{
linklst del=head;
while(del->next->next!=NULL)
{
del=del->next;
}
free(del->next);
del->next=NULL;
return head;
}
}
//计算长度
int length(linklst head)
{
int len=0;
linklst p=head;
while(p)
{
len++;
p=p->next;
}
return len;
}
//按任意位置插入
linklst insert_pos(linklst head,int pos,datatype element)
{
if(pos<1||pos>length(head)+1)
{
puts("pos error");
return head;
}
linklst s=create();
s->data=element;
if(pos==1)
{
head=insert_head(head,element);
return head;
}
linklst p=head;
for(int i=1;i<pos-1;i++)
{
p=p->next;
}
s->next=p->next;
p->next=s;
return head;
}
//按任意位置删除
linklst delete_pos(linklst head,int pos)
{
if(pos<1||pos>length(head))
{
puts("pos error");
return head;
}
if(NULL==head)
{
return head;
}
if(pos==1)
{
head=head_delete(head);
return head;
}
linklst p=head;
for(int i=1;i<pos-1;i++)
{
p=p->next;
}
linklst del=p->next;
p->next=del->next;
free(del);
del=NULL;
return head;
}
//按照位置查找
linklst find_pos(linklst head,int pos)
{
if(pos<1||pos>length(head))
{
puts("pos error");
}
if(NULL==head)
{
return head;
}
linklst p=head;
for(int i=1;i<pos;i++)
{
p=p->next;
}
printf("element=%d\n",p->data);
}
//按照位置修改
linklst change_pos(linklst head ,int pos ,datatype element)
{
if(pos<1||pos>length(head))
{
puts("pos error");
}
if(NULL==head)
{
return head;
}
linklst p=head;
for(int i=1;i<pos;i++)
{
p=p->next;
}
p->data=element;
}
//链表逆至
linklst inverse(linklst head)
{
if(NULL==head)
{
return head;
}
linklst p=head->next;
head->next=NULL;
while(p!=NULL)
{
linklst t=p;
p=p->next;
t->next=head;
head=t;
}
return head;
}
//查找倒数第n个
linklst find__n(linklst head,int n)
{
if(NULL==head||n<1||n>length(head))
{
return head;
}
linklst p=head;
linklst q=head;
for(int i=0;i<n;i++);
{
p=p->next;
}
while(p!=NULL)
{
p=p->next;
q=q->next;
}
printf("%d",q->data);
}
//按照输入的的元素查找
int find_key(linklst head,int key)
{
int count=0;
if(NULL==head)
{
return FLASE;
}
linklst p=head;//定义p指向头
for(int i=1;i<=length(head);i++)
{
if(key==p->data)
{
return i;
}
p=p->next;
}
}
//单链表按任意元素修改
linklst replace_key(linklst head,int key,datatype element)
{
if(NULL==head)
{
return head;
}
int i=find_key(head,element);
change_pos(head,i,key);
}
//单链表按照任意元素删除
linklst delete_element(linklst head,int element)
{
if(NULL==head)
{
return head;
}
int i=find_key(head,element);
delete_pos(head,i);
}
//单链表冒泡排序
linklst bubble(linklst head)
{
if(NULL==head)
{
return head;
}
int len=length(head);
for(int i=0;i<len-1;i++)
{
linklst p=head;
for(int j=0;j<len-i-1;j++)
{
if(p->data>p->next->data)
{
int t=p->next->data;
p->next->data=p->data;
p->data=t;
}
p=p->next;
}
}
}
//单链表释放内存
linklst free_list(linklst head)
{
if(NULL==head)
{
return head;
}
int len=length(head);
for(int i=0;i<len;i++)
{
head=head_delete(head);
}
return head;
}
ubu
3.head.h
1 #ifndef _HEAD_H_
2 #define _HEAD_H_
3
4 #include <stdio.h>
5 #include <string.h>
6 #include <stdlib.h>
7 enum{FLASE=-1,SUCCESS};//枚举
8 typedef int datatype;//类型变换
9
0 //节点机构、链表
1 typedef struct Node
2 {
3 datatype data;//数据
4
5 struct Node *next;//指针域
6 }*linklst;
7
8
9 linklst create();
0 linklst insert_head(linklst head,datatype element);
1 void output(linklst head);
2 linklst insert_rear(linklst head,datatype element);
3 linklst head_delete(linklst head);
4 linklst rear_delete(linklst head);
5 linklst insert_pos(linklst head,int pos,datatype element);
6 linklst delete_pos(linklst head,int pos);
7 linklst find_pos(linklst head,int pos);
8 linklst change_pos(linklst head ,int pos ,datatype element);
9 linklst inverse(linklst head);
0 linklst find__n(linklst head,int n);
1 int find_key(linklst head,int key);
2 linklst replace_key(linklst head,int key,datatype element);
3 linklst delete_element(linklst head,int element);
4 linklst bubble(linklst head);
5 linklst free_list(linklst head);