前言:
而今咱们对“循环链表c实现”大概比较关怀,同学们都想要剖析一些“循环链表c实现”的相关知识。那么小编同时在网络上搜集了一些对于“循环链表c实现””的相关知识,希望各位老铁们能喜欢,朋友们快快来了解一下吧!#include <stdio.h>#include <stdlib.h>#include <conio.h>typedef int DataType; /* 循环双链表元素类型 */typedef struct node { DataType data; /* 循环双链表元素 */ struct node *prior; /* 循环双链表元素前驱指针 */ struct node *next; /* 循环双链表元素后继指针 */} DLNode, *CDLinkList; /* 循环双链表结点类型、循环双链表类型 */void wait(){ printf("\n请按任意键...\n"); getch();}int go_on(){ int flag = 1; char choice; while(1) { printf("\n继续吗?[Y/N]"); choice = getche(); if(choice == 'Y' || choice == 'y') break; else if(choice == 'N' || choice == 'n') { flag = 0; break; } } return (flag);}/* 初始化,构造一个空的带头结点的循环双链表 */void Init_CDLinkList(CDLinkList *L){ *L = (DLNode *) malloc(sizeof(DLNode)); if(*L == NULL) { printf("\n内存分配失败.\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);}/* 按值查找元素,在带头结点的循环双链表中查找元素值为x的第1个结点,若查找成功,则返回指向x所在结点的指针,*k返回其位置序号,否则返回空,*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 Locatei(CDLinkList L){ DLNode *p; int flag = 1, i; while(flag) { printf("\n请输入要查找元素的位置:"); scanf("%d", &i); p = Locatei_CDLinkList(L, i); if(p != NULL && i != 0) printf("\n查找成功,第%d个元素是%d.\n", i, p->data); else printf("\n查找失败,没有第%d个元素.\n", i); flag = go_on(); }}void Locatex(CDLinkList L){ DLNode *p; DataType x; int flag = 1, k; while(flag) { printf("\n请输入要查找元素:"); scanf("%d", &x); p = Locatex_CDLinkList(L, x, &k); if(p != NULL) printf("\n查找成功,%d是第%d个元素.\n", p->data, k); else printf("\n查找失败!没有元素%d.\n", x); flag = go_on(); }}/* 插入元素,在带头结点的循环双链表中第i个位置之前插入元素x,即插入在第i个位置 */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); /* 插入失败,返回0 */ } p = Locatei_CDLinkList(L, i-1); /* 查找第i-1个结点 */ s = (DLNode *)malloc(sizeof(DLNode)); if (s == NULL) { printf("\n内存分配失败.\n"); exit(-1); } s->data = x; s->prior = p; /* 新结点插入在第i-1个结点后面 */ s->next = p->next; p->next->prior = s; p->next = s; return (1); /* 插入成功,返回1 */}void Insert(CDLinkList L){ DataType x; int i, flag = 1, insert_flag; while(flag) { printf("\n请输入要插入元素的位置:"); scanf("%d", &i); printf("请输入要插入元素:"); scanf("%d", &x); insert_flag = Insert_CDLinkList(L, i, x); if(insert_flag == 1) printf("\n插入成功!\n"); else printf("\n插入失败!\n"); flag = go_on(); }}/* 删除元素,在带头结点的循环双链表中删除第i个位置的元素 */int Delete_CDLinkList(CDLinkList L, int i){ CDLinkList p, s; int len; if(Empty_CDLinkList(L) == 1) { printf("\n表空,不能删除.\n"); return (0); } len = Length_CDLinkList(L); if(i<1 || i>len) { /* 删除位置错,不能删除 */ printf("\n删除位置错,不能删除.\n"); return (0); /* 删除失败,返回0 */ } p = Locatei_CDLinkList(L, i-1); /* 查找第i-1个结点 */ s = p->next; /* s指向第i个结点 */ p->next = s->next; /* 从链表中删除第i个结点 */ s->next->prior = p; free(s); /* 释放*s */ return (1); /* 删除成功,返回1 */}void Delete(CDLinkList L){ int i, flag = 1, delete_flag; while(flag) { printf("\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); } }}int main(void){ CDLinkList L; char 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("请选择[1/2/3/4/5/6/0]: "); choice = getche(); 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; break; } wait(); } while(flag == 1); return 0;}
运行结果:
-------循环双链表(带头结点)------- 1.......插入元素 2.......删除元素 3.......按位置查找元素 4.......按值查找元素 5.......输出表长 6.......输出元素 0.......退出请选择[1/2/3/4/5/6/0]: 1请输入要插入元素的位置:1请输入要插入元素:30插入成功!继续吗?[Y/N]Y请输入要插入元素的位置:2请输入要插入元素:50插入成功!继续吗?[Y/N]Y请输入要插入元素的位置:3请输入要插入元素:70插入成功!继续吗?[Y/N]Y请输入要插入元素的位置:4请输入要插入元素:90插入成功!继续吗?[Y/N]Y请输入要插入元素的位置:5请输入要插入元素:100插入成功!继续吗?[Y/N]N请按任意键...-------循环双链表(带头结点)------- 1.......插入元素 2.......删除元素 3.......按位置查找元素 4.......按值查找元素 5.......输出表长 6.......输出元素 0.......退出请选择[1/2/3/4/5/6/0]: 6循环双链表所有元素 30 50 70 90 100请按任意键...-------循环双链表(带头结点)------- 1.......插入元素 2.......删除元素 3.......按位置查找元素 4.......按值查找元素 5.......输出表长 6.......输出元素 0.......退出请选择[1/2/3/4/5/6/0]: 5表长:5请按任意键...-------循环双链表(带头结点)------- 1.......插入元素 2.......删除元素 3.......按位置查找元素 4.......按值查找元素 5.......输出表长 6.......输出元素 0.......退出请选择[1/2/3/4/5/6/0]: 3请输入要查找元素的位置:3查找成功,第3个元素是70.继续吗?[Y/N]N请按任意键...-------循环双链表(带头结点)------- 1.......插入元素 2.......删除元素 3.......按位置查找元素 4.......按值查找元素 5.......输出表长 6.......输出元素 0.......退出请选择[1/2/3/4/5/6/0]: 4请输入要查找元素:90查找成功,90是第4个元素.继续吗?[Y/N]N请按任意键...-------循环双链表(带头结点)------- 1.......插入元素 2.......删除元素 3.......按位置查找元素 4.......按值查找元素 5.......输出表长 6.......输出元素 0.......退出请选择[1/2/3/4/5/6/0]: 2请输入要删除元素的位置:70删除位置错,不能删除.删除失败.继续吗?[Y/N]N请按任意键...-------循环双链表(带头结点)------- 1.......插入元素 2.......删除元素 3.......按位置查找元素 4.......按值查找元素 5.......输出表长 6.......输出元素 0.......退出请选择[1/2/3/4/5/6/0]: 2请输入要删除元素的位置:3删除成功.继续吗?[Y/N]N请按任意键...-------循环双链表(带头结点)------- 1.......插入元素 2.......删除元素 3.......按位置查找元素 4.......按值查找元素 5.......输出表长 6.......输出元素 0.......退出请选择[1/2/3/4/5/6/0]: 6循环双链表所有元素 30 50 90 100请按任意键...
版权声明:
本站文章均来自互联网搜集,如有侵犯您的权益,请联系我们删除,谢谢。
标签: #循环链表c实现