数据结构之双向链表-初始化链表-头插法-遍历链表-获取尾部结点-尾插法-指定位置插入-删除节点-释放链表——完整代码
数据结构之双向链表-初始化链表-头插法-遍历链表-获取尾部结点-尾插法-指定位置插入-删除节点-释放链表——完整代码
#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的后继节点及要删除节点的下一个节点的前驱实现删除,释放删除节点的空间)的运行结果: