C语言数据结构——双向循环链表

双向循环链表,就是在单链表的基础上加了一个前驱指针,链表首尾相连。
编译器:vc6

#include
#include
//定义双向链表结构体
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);


}

你可能感兴趣的:(数据结构)