#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char datatype[20];
//定义结构体
typedef struct Node{
//数据域
union{
int len;//头结点的数据域
datatype data;//其他结点的数据域数据元素
};
//指针域:下一个结点的地址
struct Node *next;
}*Linklist;
Linklist Create_h();
Linklist Create_m();
int insert_t(Linklist L,datatype e);
void Output(Linklist L);
int insert_w(Linklist L,datatype e);
int delete_h(Linklist L);
int delete_w(Linklist L);
int insert_pos(Linklist L,int pos,datatype e);
int delete_pos(Linklist L,int pos);
int mod_pos(Linklist L,int pos,datatype e);
int find_pos(Linklist L,int pos);
int find_e(Linklist L,datatype e);
#endif
#include "head.h"
int main(int argc,const char *argv[])
{
//创建头结点
Linklist L=Create_h();
#if 1
//单链表头插,一次只能插入一个数据元素
//如需n个,循环调用
int n;
datatype e;//插入的数据元素
printf("请输入要头插的字符串的个数:");
scanf("%d",&n);
for(int i=0;i<n;i++){
printf("请输入要头插的字符串:");
scanf("%s",e);
insert_t(L,e);
}
//遍历
printf("头插字符串后:\n");
Output(L);
#endif
#if 1
//尾插:永远在链表尾部插入,一次插入一个
//循环调用尾插函数
printf("请输入要尾插的字符串的个数:");
scanf("%d",&n);
for(int i=0;i<n;i++){
printf("请输入要尾插的字符串:");
scanf("%s",e);
insert_w(L,e);
}
printf("尾插字符串后:\n");
Output(L);
#endif
//头删:只删除头结点后面的结点
printf("请输入要头删的字符串的个数:");
scanf("%d",&n);
for(int i=0;i<n;i++){
delete_h(L);
}
printf("头删字符串后:\n");
Output(L);
//尾删:永远删除最后一个结点
printf("请输入要尾删的字符串的个数:");
scanf("%d",&n);
for(int i=0;i<n;i++){
delete_w(L);
}
printf("尾删字符串后:\n");
Output(L);
//按位置插入
int pos;
printf("请输入插入的位置:");
scanf("%d",&pos);
printf("请输入要插入的字符串:");
scanf("%s",e);
insert_pos(L,pos,e);
//按位置删除
printf("请输入要删除的位置:");
scanf("%d",&pos);
delete_pos(L,pos);
//按位置修改
printf("请输入要修改的位置:");
scanf("%d",&pos);
printf("请输入要修改为的值:");
scanf("%s",e);
mod_pos(L,pos,e);
//按位置查找
printf("请输入要查找的位置:");
scanf("%d",&pos);
find_pos(L,pos);
//按元素查找
printf("请输入要查找的元素:");
scanf("%s",e);
find_e(L,e);
return 0;
}
#include "head.h"
//在堆区创建头结点
//无参
//返回头结点地址,失败返回NULL
Linklist Create_h(){
Linklist L=(Linklist)malloc(sizeof(struct Node));
//失败
if(L==NULL){
return NULL;
}
//成功
L->len=0;
L->next=NULL;
return L;
}
//创建其他结点
//无参
//成功返首地址,失败返NULL
Linklist Create_m(){
Linklist p=(Linklist)malloc(sizeof(struct Node));
if(p==NULL){
return NULL;
}
strcpy(p->data,"");
p->next=NULL;
return p;
}
//头插:永远在头结点后面
//参数:头结点 插入的数据元素
//成功返0,失败返-1
int insert_t(Linklist L,datatype e){
if(L==NULL){
printf("头插失败\n");
return -1;
}
//2.在堆区申请其他结点空间
Linklist p=Create_m();
//p的数据赋值位e
strcpy(p->data,e);
//p的指针域
p->next=L->next;
L->next=p;
//链表长度自增
L->len++;
}
//链表的遍历
//参数:链表
//无返回值函数
void Output(Linklist L){
//判断头结点是否存在
//判断链表是否为空
if(L==NULL || L->len==0){
printf("输出失败\n");
return;
}
#if 1
Linklist p=L;
for(int i=0;i<L->len;i++){
p=p->next;
printf("%s\t",p->data);
}
#endif
#if 0
while(L->next!=NULL){
L=L->next;
printf("%s\t",L->data);
}
#endif
printf("\n");
}
//尾插:永远在尾部插入
//参数:链表 插入的数据元素
//成功返0,失败返-1
int insert_w(Linklist L,datatype e){
//判断头结点是否存在
if(L==NULL){
printf("尾插失败\n");
return -1;
}
//尾插
//先找到最后一个结点
Linklist p=L;
while(p->next!=NULL){
p=p->next;
}
//创建新结点
Linklist s=Create_m();
if(s==NULL)
return -1;
//s的数据域
strcpy(s->data,e);
//s的指针域
p->next=s;
L->len++;
return 0;
}
//头删:删除头结点后面的结点
//参数:链表
//成功返回0,失败返回-1
int delete_h(Linklist L){
//判断结点是否存在
//判断链表是否为空
if(L==NULL || L->len==0){
printf("删除失败\n");
return -1;
}
//删除
Linklist q=L->next;
L->next=q->next;
free(q);
q=NULL;
L->len--;
return 0;
}
//尾部删除
//参数:链表
//成功返回0,失败返回-1
int delete_w(Linklist L){
//判断结点是否存在
//判断链表是否为空
if(L==NULL || L->len==0){
printf("删除失败\n");
return -1;
}
//删除
Linklist q=L->next;
for(int i=0;i<L->len-1;i++){
q=q->next;
}
free(q);
q=NULL;
L->len--;
return 0;
}
//
//
//
int insert_pos(Linklist L,int pos,datatype e){
//判断结点是否存在
//判断位置是否合法
if(L==NULL || pos<=0 || pos>L->len+1){
printf("插入失败\n");
return -1;
}
//找到pos-1位置,起名p
Linklist p=L;
for(int i=0;i!=pos-1;i++){
p=p->next;
}
//创建新结点s
Linklist s=Create_m();
//s的数据域
strcpy(s->data,e);
//s的指针域
s->next=p->next;
p->next=s;
L->len++;
printf("插入字符串后:\n");
Output(L);
return 0;
}
int delete_pos(Linklist L,int pos){
if(L==NULL || pos<=0 || pos>L->len){
printf("删除失败\n");
return -1;
}
Linklist p=L;
for(int i=0;i!=pos-1;i++){
p=p->next;
}
Linklist s=Create_m();
s=p->next;
p->next=s->next;
L->len--;
printf("删除字符串后:\n");
Output(L);
return 0;
}
int mod_pos(Linklist L,int pos,datatype e){
if(L==NULL || pos<=0 || pos>L->len){
printf("修改失败\n");
return -1;
}
Linklist p=L;
for(int i=0;i!=pos;i++){
p=p->next;
}
strcpy(p->data,e);
printf("修改字符串后:\n");
Output(L);
return 0;
}
int find_pos(Linklist L,int pos){
if(L==NULL || pos<=0 || pos>L->len){
printf("查找失败\n");
return -1;
}
Linklist p=L;
for(int i=0;i!=pos;i++){
p=p->next;
}
printf("查找位置的字符串是:%s\n",p->data);
return 0;
}
int find_e(Linklist L,datatype e){
if(L==NULL)
return -1;
Linklist p=L;
for(int i=0;i<=L->len;i++){
int a=strcmp(p->data,e);
if(a==0){
printf("查找的字符串在%d的位置上\n",i);
}
p=p->next;
}
return 0;
}