完整实现代码
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int data;
struct ListNode *next;
struct ListNode *prev;
} ListNode;
typedef struct LinkList {
int length;
ListNode *head;
ListNode *tail;
} LinkList;
void initLinkList(LinkList *list) {
list->length = 0;
list->tail = list->head = NULL;
}
ListNode *createListNode(int data, ListNode *next, ListNode *prev) {
ListNode *node = (ListNode *) malloc(sizeof(ListNode));
node->data = data;
node->next = next;
node->prev = prev;
return node;
}
ListNode *getIndexLinkList(LinkList *list, int index) {
if (index < 0 || index > list->length - 1) {
printf("获取失败!\n");
return NULL;
}
ListNode *p = list->head;
for (int i = 0; i < index; ++i) {
p = p->next;
}
return p;
}
ListNode *getDataLinkList(LinkList *list, int data) {
ListNode *p = list->head;
for (int i = 0; i < list->length; ++i) {
if (p->data == data) {
return p;
}
p = p->next;
}
printf("获取失败!\n");
return NULL;
}
void insertHeadLinkList(LinkList *list, int data) {
list->head = createListNode(data, list->head, NULL);
if (list->tail) {
list->head->next->prev = list->head;
} else {
list->tail = list->head;
}
list->length++;
}
void insertTailLinkList(LinkList *list, int data) {
list->tail = createListNode(data, NULL, list->tail);
if (list->head) {
list->tail->prev->next = list->tail;
} else {
list->head = list->tail;
}
list->length++;
}
void insertLinkList(LinkList *list, int data, int index) {
if (index < 0 || index > list->length) {
printf("插入失败!\n");
} else if (index == 0) {
insertHeadLinkList(list, data);
} else if (index == list->length) {
insertTailLinkList(list, data);
} else {
ListNode *p = getIndexLinkList(list, index);
p = createListNode(data, p, p->prev);
p->next->prev = p;
p->prev->next = p;
list->length++;
}
}
void deleteDataLinkList(LinkList *list, int data) {
ListNode *p = getDataLinkList(list, data);
if (!p) {
printf("删除失败!\n");
return;
} else if (!p->prev && !p->next) {
list->head = list->tail = NULL;
} else if (!p->prev) {
list->head = list->head->next;
list->head->prev = NULL;
} else if (!p->next) {
list->tail = list->tail->prev;
list->tail->next = NULL;
} else {
p->next->prev = p->prev;
p->prev->next = p->next;
}
free(p);
list->length--;
}
void deleteIndexLinkList(LinkList *list, int index) {
ListNode *p = getIndexLinkList(list, index);
if (!p) {
printf("删除失败!\n");
return;
} else if (!p->prev && !p->next) {
list->head = list->tail = NULL;
} else if (!p->prev) {
list->head = list->head->next;
list->head->prev = NULL;
} else if (!p->next) {
list->tail = list->tail->prev;
list->tail->next = NULL;
} else {
p->next->prev = p->prev;
p->prev->next = p->next;
}
free(p);
list->length--;
}
void printLinkList(LinkList *list) {
ListNode *node = list->head;
while (node) {
printf("%d ", node->data);
node = node->next;
}
printf("\n");
}
void test() {
LinkList list;
initLinkList(&list);
int sel, data, index;
while (true) {
printf("1.头插法插入\n2.尾插法插入\n3.指定位置插入\n4.指定元素删除\n5.指定位置删除\n6.打印链表\n");
scanf("%d", &sel);
switch (sel) {
case 1: {
printf("元素:");
scanf("%d", &data);
insertHeadLinkList(&list, data);
break;
}
case 2: {
printf("元素:");
scanf("%d", &data);
insertTailLinkList(&list, data);
break;
}
case 3: {
printf("元素:");
scanf("%d", &data);
printf("位置:");
scanf("%d", &index);
insertLinkList(&list, data, index);
break;
}
case 4: {
printf("元素:");
scanf("%d", &data);
deleteDataLinkList(&list, data);
break;
}
case 5: {
printf("位置:");
scanf("%d", &index);
deleteIndexLinkList(&list, index);
break;
}
case 6: {
printLinkList(&list);
break;
}
default:
return;
}
system("pause");
system("cls");
}
}
int main() {
test();
return 0;
}