1 结构定义
typedef struct DLNode {
int data;
struct DLNode* prior;
struct DLNode* next;
} DLNode;
2 链表操作
- 头节点插入
void add2head(DLNode* L, int x) {
DLNode* p = (DLNode*)malloc(sizeof(struct DLNode));
p->data = x;
p->next = L->next;
p->prior = L;
L->next->prior = p;
L->next = p;
}
- 在第k个位置插入
void insert_k(DLNode* L, int k, int x) {
int cnt = 0;
DLNode* p;
p = L;
while (p ->next != NULL && cnt++ <= k - 1) p = p->next;
DLNode* q = (DLNode*)malloc(sizeof(struct DLNode));
q->data = x;
q->next = p->next;
q->prior = p;
if (p ->next != NULL)p->next->prior = q;
p->next = q;
}
- 删除操作
// 删除第k位置的数
void remove(DLNode* &L, int k) {
DLNode* p, * q;
p = L;
int cnt = 0;
if (k == 1) {
q = L;
L = L->next;
L->next->prior = L;
free(q);
}
else {
while (p->next != NULL && cnt++ <= k - 1) p = p->next;
q = p->next;
p->next = q->next;
q->next->prior = p;
free(q);
}
}
- 打印操作
void printList(DLNode* L) {
if (L == NULL) return;
printf("current list is : \n");
DLNode* p = L -> next;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
}
- 查找某个元素是否存在
bool exist(DLNode *L, int x) {
DLNode* p;
p = L;
while (p->next != NULL && p->next->data != x) p = p->next;
return p ->next != NULL;
}
3 测试代码
#include <stdio.h>
#include <stdlib.h>
const int N = 100;
typedef struct DLNode {
int data;
struct DLNode* prior;
struct DLNode* next;
} DLNode;
void createDlist(DLNode*& L, int a[], int n) {
DLNode* s, * r;
L = (DLNode*)malloc(sizeof(struct DLNode));
L->next = NULL;
L->prior = NULL;
r = L;
for (int i = 0; i < n; i++) {
s = (DLNode*)malloc(sizeof(DLNode));
s->data = a[i];
s->next = NULL;
s->prior = r;
r->next = s;
r = s;
}
r->next = NULL;
}
void printList(DLNode* L) {
if (L == NULL) return;
printf("current list is : \n");
DLNode* p = L -> next;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
}
void add2head(DLNode* L, int x) {
DLNode* p = (DLNode*)malloc(sizeof(struct DLNode));
p->data = x;
p->next = L->next;
p->prior = L;
L->next->prior = p;
L->next = p;
}
void insert_k(DLNode* L, int k, int x) {
int cnt = 0;
DLNode* p;
p = L;
while (p ->next != NULL && cnt++ <= k - 1) p = p->next;
DLNode* q = (DLNode*)malloc(sizeof(struct DLNode));
q->data = x;
q->next = p->next;
q->prior = p;
if (p ->next != NULL)p->next->prior = q;
p->next = q;
}
void remove(DLNode* &L, int k) {
DLNode* p, * q;
p = L;
int cnt = 0;
if (k == 1) {
q = L;
L = L->next;
L->next->prior = L;
free(q);
}
else {
while (p->next != NULL && cnt++ <= k - 1) p = p->next;
q = p->next;
p->next = q->next;
q->next->prior = p;
free(q);
}
}
bool exist(DLNode *L, int x) {
DLNode* p;
p = L;
while (p->next != NULL && p->next->data != x) p = p->next;
return p ->next != NULL;
}
int a[N];
int main() {
int n;
printf("enter len : \n");
scanf_s("%d", &n);
printf("enter %d nums to init()\n", n);
for (int i = 0; i < n; i++) scanf_s("%d", &a[i]);
DLNode* L;
createDlist(L, a, n);
printList(L);
int op;
while (true) {
scanf_s("%d", &op);
if (op == 1) {
int x;
printf("add to head : \n");
scanf_s("%d", &x);
add2head(L, x);
printList(L);
}
if (op == 2) {
printf("add to k : \n");
int k, x;
scanf_s("%d%d", &k, &x);
insert_k(L, k, x);
printList(L);
}
if (op == 3) {
printf("remove k : \n");
int k;
scanf_s("%d", &k);
remove(L, k);
printList(L);
}
if (op == 4) {
int x;
scanf_s("%d", &x);
if (exist(L, x)) printf("Yes");
else printf("No");
}
}
return 0;
}
注:此篇代码只是为了应付考试,很多边界和代码优化没有做,后续有时间补上。