#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef struct node{
struct node *previous;
int age;
struct node *next;
}Node;
//创建一个结点
Node *createNode(){
//创建一个新德头结点
Node *pTemp = (Node *)malloc(1 * sizeof(Node));
if (pTemp == NULL) {
return NULL;
}
//赋初值
pTemp->previous = NULL;
pTemp->next = NULL;
pTemp->age = 0;
//返回这个结点的地址
return pTemp;
}
//创建头结点
bool createHeader(Node **pHeader){
//创建一个新德头结点
*pHeader = createNode();
if (pHeader == NULL) {
return false;
} else {
return true;
}
}
//是否继续
bool isContinue(){
char option;
do {
getchar();
printf("是否继续添加(y/n)?:");
option = getchar();
} while (option != 'y' && option != 'n');
if (option == 'y') {
return true;
} else{
return false;
}
}
//initial
void initial(Node * const pHeader){
Node *pTail = pHeader;
//添加保存数据的结点
while (1) {
//需要创建一个结点
Node *pTemp = createNode();
if (pTemp == NULL) {
exit(EXIT_FAILURE);
}
printf("请输入年龄:");
scanf("%d", &pTemp->age);
//判断添加的位置
if (pHeader->next == NULL) {
//头结点指向第一个结点
pHeader->next = pTemp;
//第一个结点的previous指向头结点
pTemp->previous = pHeader;
//第一个结点的next指向头结点
pTemp->next = pHeader;
//头结点的previou指向第一个结点
pHeader->previous = pTemp;
//pTail指针指向第一个结点
pTail = pTemp;
} else{
//前面已经存在结点了
//让尾结点的next指向pTemp
pTail->next = pTemp;
//让pTemp的previous指针指向目前的尾结点
pTemp->previous = pTail;
//让pTail指向最后一个结点pTemp
pTail = pTemp;
//尾结点的next指针指向头结点
pTail->next = pHeader;
//头结点的previous指针指向尾结点
pHeader->previous = pTail;
}
//提问是否继续
if (isContinue() == false){
break;
}
}
}
//输出链表的内容
void show(const Node * const pHeader){
Node *pTemp = pHeader->next;
while (pTemp != NULL) {
printf("%d ", pTemp->age);
pTemp = pTemp->next;
if (pTemp == pHeader) {
break;
}
}
printf("\n");
}
//获取index对应的结点的地址
Node *addressOfIndex(Node *pHead, int index){
Node *pTemp = pHead->next;
while (index > 0) {
if (pTemp == pHead) {
//节点数少于index
break;
}else{
pTemp = pTemp->next;
}
index--;
}
if (index > 0) {
printf("删除的元素不存在\n");
return NULL;
}else{
//让pTemp指向即将被我删除的那个结点
pTemp = pTemp->previous;
return pTemp;
}
}
//插入一个元素
//删除
void delete(Node *pHead, int index){
//获取index对应的结点的地址
Node *pIndex = addressOfIndex(pHead, index);
if (pIndex == NULL) {
printf("删除的元素不存在\n");
exit(EXIT_FAILURE);
} else{
//让index前面的结点next指针指向index后面的结点
pIndex->previous->next = pIndex->next;
//让index后面的结点的previous指针指向index前面的结点
pIndex->next->previous = pIndex->previous;
free(pIndex);
}
}
void insert(Node *pHeader, int index, int element){
//首先获取index对应的结点的地址
Node *pIndex = addressOfIndex(pHeader, index);
if (pIndex == NULL) {
printf("删除的元素不存在\n");
exit(EXIT_FAILURE);
} else{
//在index的前面插入一个元素
//为这个元素分配内存空间
Node *pNew = createNode();
if (pNew == NULL) {
exit(EXIT_FAILURE);
}else{
pNew->age = element;
//让new结点的next指针指向pIndex
pNew->next = pIndex;
//让new结点的previous指针指向index前面一个结点的地址
pNew->previous = pIndex->previous;
//让pIndex德previous指向pnew
pIndex->previous = pNew;
//让index前面的结点的next指向pNew
pNew->previous->next = pNew;
}
}
}
int main(int argc, const char * argv[]) {
//定义一个指针 指向头结点(头结点不存数据)
Node *pHead = NULL;
//创建头结点
if (createHeader(&pHead) == false) {
//创建头结点出错了。
exit(EXIT_FAILURE);
}
//初始化这个双链表
initial(pHead);
show(pHead);
delete(pHead, 3);
show(pHead);
insert(pHead, 2, 100);
show(pHead);
return 0;
}
网友评论