#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef int DataType;
typedef struct node{
DataType data;
struct node *prior,*next;
}DLNode,*CDLinkList;
int go_on(){
int flag=1,i;
char choice;
while (1) {
printf("继续请输入1,停止请输入0\n");
scanf("%d",&i);
if (i==1) {
break;
}
else if (i==0) {
flag=0;
break;
}
else {
printf("请按要求输入,谢谢\n");
}
}
return (flag);
}
// 初始化,构造一个空的带头结点的循环双链表
void Init_CDLinkList(CDLinkList *L){
*L=(DLNode *)malloc(sizeof(DLNode));
if (*L==NULL) {
printf("分配失败\n");
exit(-1);
}
(*L)->prior=*L;
(*L)->next=*L;
}
// 判断链表是否为空
int Empty_CDLinkList(CDLinkList L){
if (L->prior==L&&L->next==L) {
return 1;
}
else {
return 0;
}
}
// 求循环双链表长度运算
int Length_CDLinkList(CDLinkList L){
DLNode *p=L;
int k;
k=0;
while (p->next!=L) {
k++;
p=p->next;
}
return k;
}
void Length(CDLinkList L){
int k;
k=Length_CDLinkList(L);
printf("\n表的长度为:%d\n",k);
}
// 按序号查找元素的运算
// 在头结点的循环双链表中查找第i个元素,若查找成功返回指向第i个元素节点的指针,否则返回为空
DLNode *Locatei_CDLinkList(CDLinkList L,int i){
DLNode *p=L;
int j=0;
while (p->next!=L&&j<i) {
j++;
p=p->next;
}
if (j==i) {
return p;
}
else {
return NULL;
}
}
void Locatei(CDLinkList L){
DLNode *p;
int flag=1,i;
while (flag) {
printf("\n请输入要查找元素的位置:");
scanf("%d",&i);
p=Locatei_CDLinkList(L,i);
if (p!=NULL) {
printf("\n查找成功,第%d个元素是%d",i,p->data);
}
else {
printf("\n查找失败,没有第%d个元素\n",i);
}
flag=go_on();
}
}
// 按值查找元素
// 在头结点的循环双链表中查找值为x的元素,若查找成功则返回指向元素x所在节点的指针,*k返回其位续,否则返回为空
// 顺序查找
DLNode *Locatex_CDLinkList(CDLinkList L,int x,int *k){
DLNode *p=L->next;
int j=1;
while (p!=L&&p->data!=x) {
j++;
p=p->next;
}
if(p!=L){
*k=j;
return p;
}
else {
return NULL;
}
}
void Locatex(CDLinkList L){
DLNode *p;
DataType x;
int flag=1,k;
while (flag) {
printf("\n请输入要查找的值:\n");
scanf("%d",&x);
p=Locatex_CDLinkList(L,x,&k);
if(p!=NULL){
printf("\n查找成功,%d是第%d个元素\n",p->data,k);
}
else {
printf("\n查找失败,无元素\n");
}
flag=go_on();
}
}
// 插入元素
int Insert_CDLinkList(CDLinkList L,int i,DataType x){
DLNode *p,*s;
int len;
len=Length_CDLinkList(L);
if (i<1||i>len+1) {
printf("\n插入位置错误,不能插入\n");
return 0;
}
// 查找第i-1个结点
p=Locatei_CDLinkList(L,i-1);
s=(DLNode *)malloc(sizeof(DLNode));
if (s==NULL) {
printf("\ns的内存分配失败\n");
exit(-1);
}
s->data=x;
s->prior=p;
s->next=p->next;
p->next->prior=s;
p->next=s;
return 1;
}
void Insert(CDLinkList L){
DataType x;
int i,flag=1,insert_flag;
while (flag) {
printf("\n请输入要插入元素的位置:\n");
scanf("%d",&i);
printf("\n请输入要插入的元素\n");
scanf("%d",&x);
insert_flag=Insert_CDLinkList(L,i,x);
if (insert_flag==1) {
printf("\n插入成功\n");
}
else {
printf("\n插入失败\n");
}
flag=go_on();
}
}
// 删除元素
int Delete_CDLinkList(CDLinkList L,int i){
CDLinkList p,s;
int j,len;
j=Empty_CDLinkList(L);
if (j==1) {
printf("\n表空,不能删除\n");
return 0;
}
len=Length_CDLinkList(L);
if (i<1||i>len) {
printf("\n删除位置不对哦\n");
return 0;
}
p=Locatei_CDLinkList(L,i-1);
s=p->next;
p->next=s->next;
s->next->prior=p;
free(s);
return 1;
}
void Delete(CDLinkList L){
int i,flag=1,delete_flag;
while (flag) {
printf("\n请输入要删除的元素的位置\n");
scanf("%d",&i);
delete_flag=Delete_CDLinkList(L,i);
if (delete_flag==1) {
printf("\n删除成功\n");
}
else {
printf("\n删除失败\n");
}
flag=go_on();
}
}
// 输出链表
void Display_CDLinkList(CDLinkList L){
DLNode *p=L;
if (Empty_CDLinkList(L)==1) {
printf("\n表空,没有元素\n");
}
else {
printf("\n循环双链表输出所有元素\n");
while (p->next!=L) {
p=p->next;
printf("%6d",p->data);
}
}
}
main(){
CDLinkList L;
int choice;
int flag=1;
Init_CDLinkList(&L);
do {
printf("\n");
printf("-------循环双链表,带头结点---------\n");
printf("插入元素请摇1\n");
printf("删除元素请摇2\n");
printf("按位查找元素请摇3\n");
printf("按值查找元素请摇4\n");
printf("输出表长请摇5\n");
printf("输出表元素请摇6\n");
printf("退出请摇0\n");
printf("----------------------\n");
printf("请输入你的选择:\n");
scanf("%d",&choice);
switch (choice) {
case 1:Insert(L);break;
case 2:Delete(L);break;
case 3:Locatei(L);break;
case 4:Locatex(L);break;
case 5:Length(L);break;
case 6:Display_CDLinkList(L);break;
case 0:flag=0;printf("感谢大哥的使用\n");break;
}
}while (flag==1);
}
循环双链表的实现(C语言)
最新推荐文章于 2024-05-23 21:40:39 发布