头文件
#ifndef __HEAD_H__
#define __HEAD_H__
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef char datetype[20];
//定义结点结构体
typedef struct Node{
//数据域:
union{
int len;//头结点的数据域
datetype date;//其他节点的数据域数据元素
};
//指针域:下个结点的地址
struct Node *next;
}*Linklist;
//创建头结点
Linklist creat_head();
//创建其他结点
Linklist creat_node();
//头插
int insert_head(Linklist L,datetype e);
//输出
void Output(Linklist L);
//尾插
int insert_rear(Linklist L,datetype e);
//头删
int delete_head(Linklist L);
//尾删
int delete_rear(Linklist L);
//按位插入
int insert_sub(Linklist L,int sub,datetype e);
//按位删除
int delete_sub(Linklist L,int sub);
//按位修改
int update_sub(Linklist L,int sub,datetype e);
//按位查找
char *search_sub(Linklist L,int sub);
//按元素查找
int search_key(Linklist L,datetype key);
//按元素修改
void update_key(Linklist L,datetype key,datetype e);
//按元素删除
void delete_key(Linklist L,datetype key);
#endif
主函数
#include"head.h"
int main(int argc, const char *argv[])
{
//创建头结点
Linklist L=creat_head();
//头插/尾插 一次只能插入一个数据元素
//如果需要插入n个,循环调用
int n;
datetype e;//插入的数据元素
printf("请输入插入元素个数\n");
scanf("%d",&n);
for(int i=0;i<n;i++){
printf("请输入插入的字符串:");
scanf("%s",e);
// insert_head(L,e);//头插
insert_rear(L,e);//尾插
}
printf("输出结果为:\n");
Output(L);
printf("头删的结果为:\n");
delete_head(L);//头删
Output(L);
printf("尾删后的结果为:\n");
delete_rear(L);//尾删
Output(L);
//按位插入
printf("请输入你要插入的下标:\n");
scanf("%d",&n);
printf("请输入你要插入的数据\n");
scanf("%s",e);
insert_sub(L,n,e);
printf("插入后链表为\n");
Output(L);
//按位删除
printf("请输入你要删除的下标:\n");
scanf("%d",&n);
printf("删除后链表为\n");
delete_sub(L,n);
Output(L);
//按位修改
printf("请输入要修改的元素下标\n");
scanf("%d",&n);
printf("请输入要修改后的数据\n");
scanf("%s",e);
printf("修改后的链表为:\n");
update_sub(L,n,e);
Output(L);
//按位查找
printf("请输入要查找的元素下标\n");
scanf("%d",&n);
char *p=search_sub(L,n);
printf("查找的元素为:%s\n",p);
//按元素查找
datetype key;
printf("请输入要查找的元素\n");
scanf("%s",key);
printf("查找的元素下标为:\n");
printf("%d\n",search_key(L,key));
//按元素修改
printf("请输入要修改的元素\n");
scanf("%s",key);
printf("请输入修改后的元素\n");
scanf("%s",e);
update_key(L,key,e);
Output(L);
//按元素删除
printf("请输入要删除的元素\n");
scanf("%s",key);
delete_key(L,key);
Output(L);
return 0;
}
函数体
#include"head.h"
/*
*function: 在堆区创建头结点
*@param[in] 无参
*@param[out]
*@return 返回头结点地址,失败返回NULL
*/
Linklist creat_head(){
Linklist L=(Linklist)malloc(sizeof(struct Node));
if(L==NULL)
return NULL;
L->len=0;
L->next=NULL;
return L;
}
/*
*function: 创建其他结点
*@param[in] 无参数
*@param[out]
*@return 成功返回首地址,失败返回NULL
*/
Linklist creat_node(){
Linklist p=(Linklist)malloc(sizeof(struct Node));
if(p==NULL)
return NULL;
strcpy(p->date,"");
p->next=NULL;
return p;
}
/*
*function: 头插:永远是找头结点后面插入
*@param[in] 头结点 插入的数据元素
*@param[out]
*@return 成功返回0 失败返回-1;
*/
int insert_head(Linklist L,datetype e){
if(L==NULL){
printf("头插入失败\n");
return -1;
}
//2在堆区申请其他节点空间
Linklist p=creat_node();
//p的数据值为e
strcpy(p->date,e);
//p的指针域
p->next=L->next;
L->next=p;
//链表自增
L->len++;
return 0;
}
/*
*function: 链表的遍历
*@param[in] 链表
*@param[out]
*@return 无返回值
*/
void Output(Linklist L){
//1判断结点是否存在
//2判断链表是否为空
if(L==NULL||L->len==0){
printf("输出失败\n");
}
Linklist p=L;
for(int i=0;i<L->len;i++){
p=p->next;
printf("%s\t",p->date);
}
printf("\n");
/*
while(L->next!=NULL){
L=L->next;
printf("%s\t",L->date);
}*/
}
/*
*function: 永远在尾部插入,一次插入一个
*@param[in]
*@param[out]
*@return 成功返回0 失败返回-1
*/
int insert_rear(Linklist L,datetype e){
if(L==NULL)
return -1;
Linklist p=L;
while(p->next!=NULL){
p=p->next;
}
//创建新的节点
Linklist s=creat_node();
if(s==NULL)
return -1;
//s的数据yu为
strcpy(s->date,e);
//s的指针域
p->next=s;
L->len++;
return 0;
}
/*
*function: 头删
*@param[in] 链表
*@param[out]
*@return 成功返回0 失败返回-1
*/
int delete_head(Linklist L){
if(L->len==0||L==NULL){
printf("删除失败");
return -1;
}
Linklist q=L->next;
L->next=q->next;
free(q);
q=NULL;//防止野指针
L->len--;
return 0;
}
/*
*function: 尾删
*@param[in] 链表
*@param[out]
*@return 成功返回0 失败返回-1
*/
int delete_rear(Linklist L){
if(L->len==0||L==NULL){
printf("删除失败");
return -1;
}
Linklist p=L;
for(int i=0;i<L->len-1;i++){
p=p->next;
}
free(p->next);
p->next=NULL;
L->len--;
return 0;
}
/*
*function: 按位插入
*@param[in] 链表,插入的下标 插入的值
*@param[out]
*@return 成功返回0,失败返回-1
*/
int insert_sub(Linklist L,int sub,datetype e){
if(L==NULL||sub<1||sub>L->len+1){
printf("插入失败\n");
return -1;
}
Linklist p=L;
for(int i=0;i<sub-1;i++){
p=p->next;
}
//创建新节点
Linklist s=creat_node();
//s的数据域为
strcpy(s->date,e);
//s的指针域
s->next=p->next;
p->next=s;
L->len++;
return 0;
}
/*
*function: 按位删除
*@param[in] 链表 删除的下标
*@param[out]
*@return 成功返回0 失败返回-1
*/
int delete_sub(Linklist L,int sub){
if(L==NULL||L->len==0||sub<1||sub>L->len){
printf("删除失败\n" );
return -1;
}
Linklist p=L;
for(int i=0;i<sub-1;i++){
p=p->next;
}
Linklist s=p->next;
p->next=s->next;
free(s);
L->len--;
return 0;
}
/*
*function: 按位修改
*@param[in] 链表 修改的下标 修改后的数据
*@param[out]
*@return 成功返回0,失败返回-1;
*/
int update_sub(Linklist L,int sub,datetype e){
if(L==NULL||L->len==0||sub<1||sub>L->len){
printf("修改失败\n" );
return -1;
}
Linklist p=L;
for(int i=0;i<sub-1;i++){
p=p->next;
}
Linklist s=p->next;
strcpy(s->date,e);
return 0;
}
/*
*function: 按位查找
*@param[in] 链表 查找的下标
*@param[out]
*@return 成功返回查找的数据 失败无返回
*/
char *search_sub(Linklist L,int sub){
if(L==NULL||L->len==0||sub<1||sub>L->len){
printf("查找失败\n" );
}
Linklist p=L;
for(int i=0;i<sub-1;i++){
p=p->next;
}
return p->next->date;
}
/*
*function: 按元素查找
*@param[in] 链表 查找的元素
*@param[out]
*@return 失败返回-1,成功返回下标;
*/
int search_key(Linklist L,datetype key){
Linklist p=L;
for(int i=0;i<=L->len;i++){
if(strcmp(key,p->date)==0){
return i;
}
p=p->next;
}
return 0;
}
/*
*function: 按元素修改
*@param[in] 链表 要修改的元素 修改后的数据
*@param[out]
*@return 无返回值
*/
void update_key(Linklist L,datetype key,datetype e){
int flag=search_key(L,key);
update_sub(L,flag,e);
}
/*
*function: 按元素删除
*@param[in] 链表 要删除的元素
*@param[out]
*@return 无返回值
*/
void delete_key(Linklist L,datetype key){
int flag=search_key(L,key);
delete_sub(L,flag);
}