#include<stdio.h> #include<stdlib.h> typedef struct node { int data; struct node * prev; struct node * next; }*Lnode,Node; Lnode appendNode(Lnode head);//添加节点 void deleteNode(Lnode head);//删除节点 void printNode(Lnode head);//打印链表 void freeNode(Lnode head);//释放链表 int main() { char c; Lnode head = NULL; head = (Lnode)malloc(sizeof(Node)); head->next = NULL; printf("你想创建链表吗?(Y/N)"); scanf_s("%c", &c); while (c == 'y' || c == 'Y') { getchar(); head = appendNode(head); printf("你想创建链表节点吗?(Y/N)"); scanf_s("%c", &c); } printNode(head); getchar(); printf("\n你想删除链表节点吗?(Y/N)"); scanf_s("%c", &c); if (c == 'y' || c == 'Y') { deleteNode(head); } printNode(head); getchar(); freeNode(head); } Lnode appendNode(Lnode head) { Lnode pr, p; pr = head; p = (Lnode)malloc(sizeof(Node)); if (p == NULL) { printf("申请内存失败!"); exit(0); } if (pr->next == NULL)//链表为空,直接把节点插在头节点之后 { pr->next = p; p->prev = pr; p->next = NULL; } else //链表不为空,则把节点插在最后一个 { while (pr->next != NULL) { pr = pr->next; } pr->next = p; p->prev = pr; p->next = NULL; } printf("请输入节点数据:"); scanf_s("%d",&(p->data)); getchar(); return head; } void deleteNode(Lnode head) { Lnode p = head; Lnode pr; int c=0; int i = 1; printf("请输入你想删除的节点位置:"); scanf_s("%d",&c); while (i < c) { p = p->next; i++; } if (p->next == NULL) { printf("该位置超过了链表长度!"); exit(0); } pr = p->next; p->next = p->next->next; if (pr->next != NULL) { pr->next->prev = p; } free(pr); } void printNode(Lnode head)//打印链表 { Lnode pr; pr = head->next; while (pr != NULL) { printf("%5d", pr->data); if (pr->next == NULL) { break; } else { pr = pr->next; } } } void freeNode(Lnode head)//释放链表 { Lnode p, pr; pr = head; while (pr != NULL) { p = pr; pr = pr->next; free(p); } }