双向循环链表,就是在单链表的基础上加了一个前驱指针,链表首尾相连。
编译器:vc6
#include<stdio.h>
#include<stdlib.h>
//定义双向链表结构体
typedef struct student{
int score;
struct student *next,*prio;
} LinkList;
//定义一个创建双向链表的方法
/*
传入链表长度
返回链表指针
*/
LinkList *CreatLinkList(int n){
LinkList *head,*p,*q; //定义头结点和辅助指针
int i;
head = (LinkList *)malloc(sizeof(LinkList)); //头结点申请内存空间
//此时为空链表 首尾相连
head->next = head;
head->prio = head;
p = head; //p链表最后一个节点的指针
printf("请输入要创建的链表元素:\n");
for (i=0;i<n;i++){
q = (LinkList *)malloc(sizeof(LinkList)); //新节点开辟内存空间
scanf("%d",&q->score);
p->next = q;
head->prio = q;
q->prio = p;
q->next = head;
p =q;
}
return head;
}
//定义一个打印链表元素的方法
void ShowList(LinkList *h){
LinkList *p;
int n=0;
p = h;
p = p->next;
printf("链表元素为:\n");
while (p != h){
printf("%d",p->score);
p = p->next;
n++;
}
printf("\n链表长度为:%d\n",n);
}
//定义一个链表添加节点的方法
void AddNode(LinkList *h,int n){
LinkList *p,*q,*r;
int i=0;
p = h;
//找到增加节点的位置
while (i != n){
p = p->next;
i++;
}
r = p->next;
q = (LinkList *)malloc(sizeof(LinkList));
printf("请输入插入元素的值:");
scanf("%d",&q->score);
q->next = p->next;
q->prio = p;
p->next = q;
r->prio = q;
}
//定义一个删除链表元素的方法
void DeleteElement(LinkList *h,int n){
LinkList *p=h;
p = p->next;
n--;
//找到删除节点的位置
while (n--){
p = p->next;
}
printf("%d\n",n);
(p->prio)->next = p->next;
(p->next)->prio = p->prio;
free(p);
}
//定义一个修改链表指定位置元素的方法
void TransElement(LinkList *h,int n){
n--;
h = h->next;
while (n--){
h = h->next;
}
printf("请输入修改元素的值:");
scanf("%d",&h->score);
}
//定义一个查询链表指定位置元素值的方法
void GetElentment(LinkList *h,int n){
n--;
h = h->next;
while (n--){
h = h->next;
}
printf("查询位置的元素值为:%d\n",h->score);
}
void main(){
LinkList *m;
m = CreatLinkList(5);
ShowList(m);
AddNode(m,5);
ShowList(m);
DeleteElement(m,3);
TransElement(m,3);
ShowList(m);
GetElentment(m,2);
}