双链表和循环链表
双链表结点结构体定义
typedef struct DLNode{
int data; //数据
struct DLNode *prior; //指向前驱结点的指针
struct DLNode *next; //指向后继结点的指针
}DLNode;
双链表的操作
//尾插法建立双链表
void createDlistR(DLNode *&L, int a[], int n){
DLNode *s, *r;
int i;
L = (DLNode *)malloc(sizeof(DLNode));
L->prior = NULL;
L->next = NULL;
r = L;
for(i = 0; i < n; i++){
s = (DLNode *)malloc(sizeof(DLNode));
s->data = a[i];
r->next = s;
s->prior = r;
r = s;
}
r->next = NULL;
}
//查找结点
DLNode* findNode(DLNode *C, int x){
DLNode *p = C->next;
while(p->next != NULL){
if(p->next->data == x)
break;
p = p->next;
}
return p;
}
//删除结点
int deleteNode(DLNode *C, int x){
DLNode *q, *p = C->next;
while(p->next != NULL){
if(p->next->data == x){
q = p->next;
p->next = q->next;
q->next->prior = p;
free(q);
return 1;
}
p = p->next;
}
return 0;
}
循环链表
循环链表有两种分别是循环单链表和循环双链表,它们分别是在单链表和双链表的基础上进行改进得来的,循环单链表只需要单链表末尾结点的next指针指向头结点,而循环双链表需要末尾结点的next指针指向头结点,头结点的prior指针指向末尾结点。
//初始化循环单链表
L = (LNode *)malloc(sizeof(LNode));
L->next = L;
//初始化循环双链表
L = (DLNode *)malloc(sizeof(DLNode));
L->prior = L;
L->next = L;
//使用尾插法插入结点时需注意修改L->prior
//如果p指针循环遍历链表,判断p走到表尾结点的条件是p->next == head