數據結構之雙向鏈表-初始化鏈表-頭插法-遍歷鏈表-獲取尾部結點-尾插法-指定位置插入-刪除節點-釋放鏈表——完整代碼
#include <stdio.h>
#include <stdlib.h>typedef int ElemType;typedef struct node{ElemType data;struct node *next, *prev;
}Node;//初化鏈表
Node* initList()
{Node *head = (Node*)malloc(sizeof(Node));head->data = 0;head->next = NULL;head->prev = NULL;return head;
}//頭插法
int insertHead(Node* L, ElemType e)
{Node *p = (Node*)malloc(sizeof(Node));p->data = e;p->prev = L;p->next = L->next;if (L->next != NULL){L->next->prev = p;}L->next = p;return 1;
}//遍歷
void listNode(Node* L)
{Node *p = L->next;while(p != NULL){printf("%d ", p->data);p = p->next;}printf("\n");
}//獲取尾部結點
Node* get_tail(Node *L)
{Node *p = L;while(p->next != NULL){p = p->next;}return p;
}//尾插法
Node* insertTail(Node *tail, ElemType e)
{Node *p = (Node*)malloc(sizeof(Node));p->data = e;p->prev = tail;tail->next = p;p->next = NULL;return p;
}//指定位置插入
int insertNode(Node *L, int pos, ElemType e)
{Node *p = L;int i = 0;while(i < pos-1){p = p->next;i++;if (p == NULL){return 0;}}Node *q = (Node*)malloc(sizeof(Node));q->data = e;q->prev = p;q->next = p->next;p->next->prev = q;p->next = q;return 1;
}//刪除節點
int deleteNode(Node *L, int pos)
{Node *p = L;int i = 0;while(i < pos-1){p = p->next;i++;if (p == NULL){return 0;}}if(p->next == NULL){printf("要刪除的位置錯誤\n");return 0;}Node *q = p->next;p->next = q->next;q->next->prev = p;free(q);return 1;
}//釋放鏈表
void freeList(Node *L)
{Node *p = L->next;Node *q;while(p != NULL){q = p->next;free(p);p = q;}L->next = NULL;
}int main()
{Node *list = initList();/*insertHead(list,10);insertHead(list,20);insertHead(list,30);listNode(list);*/Node *tail = get_tail(list);tail = insertTail(tail, 10);tail = insertTail(tail, 20);tail = insertTail(tail, 30);listNode(list);insertNode(list, 2, 15);listNode(list);deleteNode(list, 2);listNode(list);return 0;
}
使用頭插法運行結果:?
?尾插法運行結果:
在指定位置插入數據運行結果:
刪除節點(找到要刪除節點的前置節點p,用指針q記錄要刪除的節點,通過改變p的后繼節點及要刪除節點的下一個節點的前驅實現刪除,釋放刪除節點的空間)的運行結果:?