头文件
#ifndef __HEAD_H
#define __HEAD_H__
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef char datatype[20];//datatype 等价于char[20]
//定义双向链表结构体
typedef struct Node
{
//数据域
union
{
int len;//头结点的数据域:长度
datatype data;//普通结点的数据域
};
//指针域
struct Node *next;//下一个结点的地址
struct Node *prev;//上一个结点的地址
}*doublelink;doublelink create_head();
doublelink create_node();
int insert_head(doublelink list,datatype e);
void output(doublelink list);
int insert_end(doublelink list, datatype e);
int delete_head(doublelink list);
int delete_end(doublelink list);
#endif
自定义文件
#include"head.h"
/*
* function: 创建头结点
* @param [ in]
* @param [out]
* @return 成功返回地址,失败返回NULL
*/
doublelink create_head()
{
doublelink list = (doublelink)malloc(sizeof(struct Node));
if(list == NULL)
return NULL;
list->len = 0;
list->prev = NULL;
list->next = NULL;
return list;
}/*
* function: 创建普通结点
* @param [ in]
* @param [out]
* @return 成功返回地址,失败返回NULL
*/
doublelink create_node()
{
doublelink p = (doublelink)malloc(sizeof(struct Node));
if(p == NULL)
return NULL;
strcpy(p->data, "");
p->prev = NULL;
p->next = NULL;
return p;
}/*
* function: 双向链表头插
* @param [ in] 链表,要插入的值
* @param [out]
* @return 成功返回0,失败返回-1
*/
int insert_head(doublelink list,datatype e)
{
printf("错误");
if(list == NULL)
{
printf("头结点为空\n");
return -1;
}doublelink p = create_node();
if(p = NULL)
return -1;//数据域
strcpy(p->data,e);
//指针域
p->next= list->next;
p->prev = list;if(list->next != NULL)
list->next->prev = p;
list->next = p;
list->len++;
return 0;
}/*
* function: 尾插
* @param [ in]
* @param [out]
* @return 成功返回0 失败返回-1
*/
int insert_end(doublelink list, datatype e)
{
if(list == NULL)
{
printf("头结点不存在,插入失败\n");
return -1;
}
//2.先遍历到最后一个结点
doublelink p = list;
while(p->next)
p = p->next;
//创建新节点起名字为s
doublelink s = create_node();
if(s == NULL)
return -1;
//数据域
strcpy(s->data,e);
//指针域
p->next =s;
s->prev = p;
list->len++;
}void output(doublelink list)
{
if(list == NULL || list->len == 0)
{
printf("遍历失败\n");
return;
}
puts("正向遍历...\n");
doublelink p = list;
while(p->next)
{
p = p->next;
printf("%s\t",p->data);
}
puts("");
puts("反向遍历...\n");
while(p->prev)
{
printf("%s\t",p->data);
p = p->prev;
}
puts("");
}/*
* function: 头删
* @param [ in]
* @param [out]
* @return 成功返回0,失败返回-1
*/int delete_head(doublelink list )
{
if(list == NULL || list->len == 0)
{
printf("删除失败\n");
return -1;
}
//删除头结点的后继结点
doublelink q = list->next;
list->next = q->next;
if(q->next != NULL)
q->next->prev = list;
free(q);
q = NULL;
list->len--;
return 0;
}/*
* function: 尾删
* @param [ in]
* @param [out]
* @return 成功返回0,失败返回-1
*/
int delete_end(doublelink list)
{
doublelink p = list;
while(p->next)
p = p->next;
p->prev->next = NULL;
free(p);
p = NULL;
list->len--;
return 0;
}
主函数文件
#include"head.h"
int main (int argc, const char *argv[])
{
doublelink list = create_head();
int n;
datatype e;
printf("请输入您要输入的字符串个数\n");
scanf("%d",&n);
for(int i = 0; i < n; i++)
{
printf("请输入字符串\n");
scanf("%s",e);
//insert_head(list,e);
insert_end(list,e);
}
output(list);
//delete_head(list);
delete_end(list);
output(list);
return 0;
}