#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "windows.h"
//链表结构体
typedef struct node
{
int id;
struct node *pre;
struct node *next;
}NODE;
//初始化头节点
NODE *init()
{
NODE *p = (NODE *)malloc(sizeof(NODE));
p->pre = NULL;
p->next = NULL;
return p;
}
//插入节点
void insert(NODE *head, NODE data, int x)
{
NODE *p = (NODE *)malloc(sizeof(NODE));
*p = data;
if (1 == x)
{
p->next = head->next;
head->next = p;
p->pre = head;
if (p->next != NULL)
{
p->next->pre = p;
}
}
else if (2 == x)
{
NODE *q = head;
while (q->next != NULL)
{
q=q->next;
}
p->next = q->next;
q->next = p;
p->pre = q;
}
}
//修改节点数据
void alert(NODE *head, int id, NODE data)
{
NODE *p = head->next;
while (p != NULL)
{
if ((p->id) == id)
{
data.next = p->next;
data.pre = p->pre;
*p = data;
}
p = p->next;
}
}
//删除节点及数据
void delet(NODE *head, int ad)
{
NODE *p = head->next;
NODE *q = head;
while (p != NULL)
{
NODE *a = NULL;
if (p->id == ad)
{
a = p;
p = p->next;
if (p != NULL)
{
p->pre = q;
}
q->next = p;
free(a);
}
else
{
p = p->next;
q = q->next;
}
}
}
//输出节点数据
void print(NODE *head)
{
NODE *p = head->next;
while (p != NULL)
{
printf("%d ", p->id);
p = p->next;
}
printf("\n\n");
}
int main()
{
NODE *head = init();
NODE ini;
while (1)
{
printf("请输入操作功能:\n--1--输入数据\n--2--删除数据\n--3--修改数据\n--4--显示数据\n--5--退出\n");
printf("选择:");
int n;
scanf("%d", &n);
switch (n)
{
case 1:
printf("请输入插入方式--1--头插 --2--尾插\n");
printf("选择:");
int x;
scanf("%d", &x);
printf("请输入插入数据,以'0'结束\n");
while (1)
{
scanf("%d", &ini.id);
if (ini.id == 0)break;
insert(head, ini, x);
}
system("cls");
break;
case 2:
system("cls");
print(head);
printf("请输入要删除的数据:");
int did;
scanf("%d", &did);
delet(head, did);
system("cls");
break;
case 3:
system("cls");
print(head);
printf("请输入要修改的数据:");
int aid;
scanf("%d", &aid);
printf("将被修改的数据改为:");
scanf("%d", &ini.id);
alert(head, aid, ini);
system("cls");
break;
case 4:
system("cls");
print(head);
break;
case 5:
return 0;
break;
default:
system("cls");
printf("输入错误,请重新输入:");
break;
}
}
system("pause");
return 0;
}