main.c
#include "main.h"
int main(int argc, char const *argv[])
{
int n;
printf("请输入数据元素的个数:");
scanf("%d",&n);
datatype e;
Doublelink L = Creat_Head();
#if 0
for (size_t i = 0; i < n; i++)
{
printf("请输入第%ld个字符串:",i+1);
scanf("%s",e);
Insert_Head(L,e);
}
#else
for (size_t i = 0; i < n; i++)
{
printf("请输入第%ld个字符串:",i+1);
scanf("%s",e);
Insert_Rear(L,e);
}
#endif
Outputlink(L);
//双向链表头删
printf("\n<-----------------双向链表头删----------------->\n\n");
Delete_Head(L);
Outputlink(L);
//双向链表头删
printf("\n<-----------------双向链表尾删----------------->\n\n");
Delete_Rear(L);
Outputlink(L);
//双向链表按位置插入
printf("\n<-----------------双向链表按位置插入----------------->\n\n");
int pos;
printf("请输入插入的位置:");
scanf("%d",&pos);
printf("请输入插入的字符串:");
scanf("%s",e);
Insert_Position(L,pos,e);
Outputlink(L);
//双向链表按位置插入
printf("\n<-----------------双向链表按位置修改----------------->\n\n");
printf("请输入修改的位置:");
scanf("%d",&pos);
printf("请输入修改的字符串:");
scanf("%s",e);
Updata_Position(L,pos,e);
Outputlink(L);
//双向链表按位置删除
printf("\n<-----------------双向链表按位置删除----------------->\n\n");
printf("请输入删除的位置:");
scanf("%d",&pos);
Delete_Position(L,pos);
Outputlink(L);
//双向链表按位置查找
printf("\n<-----------------双向链表按位置查找----------------->\n\n");
printf("请输入查找的位置:");
scanf("%d",&pos);
Search_Position(L,pos);
Outputlink(L);
printf("\n<-----------------双向链表操作到此结束----------------->\n\n");
return 0;
}
main.h
#ifndef __MAIN_H
#define __MAIN_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; //指向下一个结点的指针
struct Node *prev; //指向上一个结点的指针
}*Doublelink;
Doublelink Creat_Head(); //创建头结点
Doublelink Creat_Node(); //创建普通结点
int Insert_Head(Doublelink L,datatype e);//双向链表头插
int Insert_Rear(Doublelink L,datatype e);//双向链表尾插
void Outputlink(Doublelink L); //双向链表遍历
int Delete_Head(Doublelink L); //双向链表头删
int Delete_Rear(Doublelink L); //双向链表尾删
int Insert_Position(Doublelink L,int pos,datatype e); //双向链表按位置插入
int Updata_Position(Doublelink L,int pos,datatype e); //双向链表按位置修改
int Delete_Position(Doublelink L,int pos); //双向链表按位置删除
void Search_Position(Doublelink L,int pos);//双向链表按位置查找
#endif // !__MAIN_H
doublelin.c
#include "main.h"
/**
* @brief 创建头结点
*
* @return Doublelink
*/
Doublelink Creat_Head()
{
Doublelink L = (Doublelink)malloc(sizeof(struct Node));
if (L == NULL)
return NULL;
//数据域
L->len = 0; //清空链表长度
//指针域
L->next = NULL;
L->prev = NULL;
return L;
}
/**
* @brief 创建普通结点
*
* @return Doublelink
*/
Doublelink Creat_Node()
{
Doublelink p = (Doublelink)malloc(sizeof(struct Node));
if (p == NULL)
return NULL;
//数据域
strcpy(p->data,"\0");
//指针域
p->next = NULL;
p->prev = NULL;
return p;
}
/**
* @brief 双向链表头插
*
* @param L
* @param e 插入的元素值
* @return int 成功返回0,失败返回-1
*/
int Insert_Head(Doublelink L,datatype e)
{
//判断链表头结点是否存在
if (L == NULL)
return -1;
Doublelink s = Creat_Node();
if (s == NULL)
return -1;
//指针域
s->next = L->next;
if (L->next != NULL)
{
L->next->prev = s;
}
s->prev = L;
L->next = s;
//数据域
strcpy(s->data,e);
L->len++;
return 0;
}
/**
* @brief 双向遍历输出链表
*
* @param L
*/
void Outputlink(Doublelink L)
{
if (L == NULL || L->len == 0)
{
printf("\n数据元素不存在,遍历失败!\n");
return;
}
//正向遍历
Doublelink p = L;
printf("正向遍历:");
while (p->next != NULL)
{
p = p->next;
printf("%s\t",p->data);
}
printf("\n");
//逆向遍历
printf("逆向遍历:");
while (p != L)
{
printf("%s\t",p->data);
p = p->prev;
}
printf("\n");
}
/**
* @brief 双向链表尾插
*
* @param L
* @param e 插入的元素值
* @return int 成功返回0,失败返回-1
*/
int Insert_Rear(Doublelink L,datatype e)
{
if (L == NULL)
return -1;
Doublelink s = Creat_Node();
if (s == NULL)
return -1;
Doublelink p = L;
for (size_t i = 1; i <= L->len; i++)
{
p = p->next;
}
//指针域
s->prev = p;
p->next = s;
//数据域
strcpy(s->data,e);
L->len++;
return 0;
}
/**
* @brief 双向链表头删
*
* @param L
* @return int 成功返回0,失败返回-1
*/
int Delete_Head(Doublelink L)
{
//判断链表头结点是否存在
//判断链表是否为空
if (L == NULL || L->len == 0)
{
printf("\n数据不存在,双向链表头删失败!\n");
return -1;
}
Doublelink q = L->next;
if (q->next != NULL)
{
q->next->prev = L;
}
L->next = q->next;
free(q);
q = NULL;
L->len--;
return 0;
}
/**
* @brief 双向链表尾删
*
* @param L
* @return int 成功返回0,失败返回-1
*/
int Delete_Rear(Doublelink L)
{
if (L == NULL || L->len == 0)
{
printf("\n数据不存在,双向链表尾删失败!\n");
return -1;
}
Doublelink q = L;
for (size_t i = 1; i <= L->len; i++)
{
q = q->next;
}
free(q->next);
q->prev->next = NULL;
L->len--;
return 0;
}
/**
* @brief 链表按位置插入
*
* @param L
* @param pos 插入的位置
* @param e 插入的值
* @return int 成功返回0,失败返回-1
*/
int Insert_Position(Doublelink L,int pos,datatype e)
{
if (L == NULL || pos < 1 || pos > L->len+1)
{
printf("\n按位置插入失败\n");
return -1;
}
Doublelink s = Creat_Node();
if (s == NULL)
return -1;
Doublelink p = L;
for (size_t i = 1; i <= pos-1; i++)
{
p = p->next;
}
//指针域
s->next = p->next;
if (p->next != NULL)
{
p->next->prev = s;
}
s->prev = p;
p->next = s;
//数据域
strcpy(s->data,e);
L->len++;
return 0;
}
/**
* @brief 双向链表按位置修改
*
* @param L
* @param pos 修改的位置
* @param e 修改后的值
* @return int 成功返回0,失败返回-1
*/
int Updata_Position(Doublelink L,int pos,datatype e)
{
if (L == NULL || pos < 1 || pos > L->len)
{
printf("\n按位置修改失败\n");
return -1;
}
Doublelink p = L;
for (size_t i = 1; i <= pos; i++)
{
p = p->next;
}
strcpy(p->data,e);
return 0;
}
/**
* @brief 双向链表按位置删除
*
* @param L
* @param pos 删除的位置
* @return int 成功返回0,失败返回-1
*/
int Delete_Position(Doublelink L,int pos)
{
//判断头结点是否存在
//判断链表是否为空
//判断位置是否合法
if (L == NULL || L->len == 0 || pos < 1 || pos > L->len)
{
printf("\n按位置修改失败\n");
return -1;
}
Doublelink p = L;
for (size_t i = 1; i <= pos-1; i++)
{
p = p->next;
}
Doublelink q = p->next;
p->next = q->next;
if(q->next != NULL)
q->next->prev = p;
free(q);
q = NULL;
L->len--;
return 0;
}
/**
* @brief 双向链表按位置查找
*
* @param L
* @param pos 查找的位置
*/
void Search_Position(Doublelink L,int pos)
{
//判断头结点是否存在
//判断链表是否为空
//判断位置是否合法
if (L == NULL || L->len == 0 || pos < 1 || pos > L->len)
{
printf("\n按位置修改失败\n");
return;
}
Doublelink p = L;
for (size_t i = 1; i <= pos; i++)
{
p = p->next;
}
printf("\n该位置上的字符串为:%s\n",p->data);
}
执行结果如下图所示: