链表有两种: 一种是头指针式链表; 还有一种是头节点式链表;
第一种顾名思义就是head只是个结构体指针; 不需要malloc给其分配内存;
而第二种head是一个节点, 需要malloc给其分配内存;
以下我个人写的头节点式指针的循环双链表, 但头节点head不存数据(存数据的还没试过)
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *pre;
struct node *next;
}*PNODE,NODE;
void insertNode(PNODE head, PNODE newNode) //插入节点
{
#if 0
//头插
newNode->pre = head;
newNode->next = head->next;
#endif
//尾插
newNode->pre = head->pre;
newNode->next = head;
newNode->next->pre = newNode; //不管是头插还是尾插 ,这两句是公用部分
newNode->pre->next = newNode;
}
void printList(PNODE head) //打印链表
{
PNODE p = head->next;
while (p != head)
{
printf("%d->", p->data);
p = p->next;
}
}
void freeList(PNODE head) //释放所有内存
{
PNODE p = head ->next,temp;
while (p != head)
{
temp = p->next;
free(p);
p = temp;
}
free(head); //包括头节点
}
void delectNode(PNODE head,int data) //删除多个
{
PNODE p = head->next,temp;
while (p != head)
{
if (p->data == data)
{
temp = p->next;
p->next->pre = p->pre;
p->pre->next = p->next;
free(p);
p = temp;
}
else
p = p->next;
}
}
int main()
{
PNODE head=(PNODE)malloc(sizeof(NODE));
head->next = head; //初始化, 自己抱自己
head->pre = head;
for (int i = 1; i <= 10; i++)
{
PNODE newNode = (PNODE)malloc(sizeof(NODE));
newNode->data = i;
insertNode(head, newNode);
}
//delectNode(head, 2);
printList(head);
freeList(head);
return 0;
}