C语言从零开始之数据结构与算法循环链表基本操作(3)
2018-03-06 00:14
495 查看
#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 typedef int Status; typedef int ElemType; typedef struct DuLNode{ ElemType data; struct DuLNode *prior; struct DuLNode *next; }DuLNode,*DuLinkList; /************************************************************************/ /* 以下是关于循环链接存储操作的7种算法 */ /* 1.InitDuLinkList函数,初始化线性表,创建表头指针并置为NULL*/ /* 2.CreateDuLinkList函数,创建线性表,此函数输入为负数则停止输入*/ /* 3.PrintDuLinkList函数,遍历输出线性表*/ /* 4.DestroyDuLinkList函数,销毁线性表释放内存空间*/ /* 5.ClearDuLinkList函数,清空线性表释放内存空间*/ /* 6.GetElemDuLinkList函数,返回线性链表第i个元素*/ /* 7.InsertDuLinkList函数,插入线性表*/ /************************************************************************/ /***************************初始化循环链表,创建空的头指针******************************************/ Status InitDuLinkList(DuLinkList *L) { //*L为头节点指针的值 *L=(DuLinkList)malloc(sizeof(DuLNode)); //为头节点指针指向的区域分配内存空间 if(!*L) { printf("内存分配失败,初始化失败!\n"); exit(1); //return ERROR; } (*L)->prior=*L; //空的循环链表,指向自己 (*L)->next=*L; return OK; } /***************************创建循环链表,输入数据大于0有效******************************************/ Status CreateDuLinkList(DuLinkList L) { DuLinkList L_new=NULL; DuLinkList L_prior=NULL; ElemType ch; L_prior = L; printf("请输入数据:"); scanf("%d",&ch); getchar(); //消除回车键 while(ch > 0) { L_new = (DuLinkList)malloc(sizeof(DuLNode)); if(!L_new) { printf("内存分配失败,初始化失败!\n"); exit(1); //return ERROR; } L_new->data=ch; //输入赋值给data L_new->prior = L_prior; //新建节点直接前驱指向前一个节点 L_new->next = L; //新建节点属于尾节点,直接后继指向头指针 L_prior->next = L_new; //前驱指针的直接后继指向新建节点 L_prior = L_new; //新建节点转为当前节点当前节点 printf("请输入数据:"); scanf("%d",&ch); getchar(); //消除回车键 } return OK; } /***************************遍历打印循环链表******************************************/ Status PrintDutLinkList(DuLinkList const L) { DuLinkList L_cur=NULL; printf("遍历打印循环链表:"); if(L == NULL) { printf("DuLinkList is NULL!\n"); return OK; } L_cur=L->next; while(L_cur != L) { printf("--%d--",L_cur->data); L_cur = L_cur->next; } printf("\n"); printf("打印输出完毕!\n"); return OK; } /**************************销毁循环链表******************************************/ Status DestroyDuLinkList(DuLinkList *head) { DuLinkList L_cur=(*head)->next; //L_cur指向第一个节点 DuLinkList L_next=NULL; while(L_cur != *head) //判断是否到表尾 { L_next = L_cur->next; free(L_cur); L_cur = L_next; } free(*head); //最后释放头指针 并置NULL避免野指针 *head = NULL; return OK; } /**************************销毁循环链表******************************************/ Status ClearDuLinkList(DuLinkList head) { DuLinkList L_cur=head->next; //L_cur指向第一个节点 DuLinkList L_next=NULL; while(L_cur != head) //判断是否到表尾 { L_next = L_cur->next; free(L_cur); L_cur = L_next; } head->prior = head; head->next = head; return OK; } /**************************在循环链表第i位置插入e******************************************/ ElemType InsertDuLinkList(DuLinkList head,int i,ElemType e) { DuLinkList L_prior=head; DuLinkList L_new=NULL; for(int j=0;j!=i;j++) //循环到L_prior等于插入位置前一个值 { L_prior=L_prior->next; } L_new = (DuLinkList)malloc(sizeof(DuLNode)); if(!L_new) { printf("内存分配失败,初始化失败!\n"); exit(1); //return ERROR; } L_new->data = e; L_new->prior=L_prior; L_new->next=L_prior->next; //L_new各成员赋值 L_prior->next=L_new; //直接前驱的后继指向新建节点 return OK; } Status main(void) { DuLinkList L; int a[] = {1504,3,42,42,8,183,22,238,85,18,22,18,31}; printf("L_adr=%x\n",L); InitDuLinkList(&L); printf("L_adr=%x\n",L); CreateDuLinkList(L); PrintDutLinkList(L); //DestroyDuLinkList(&L); ClearDuLinkList(L); PrintDutLinkList(L); for(int i=0;i<(sizeof(a)/sizeof(int));i++){ int cnt=rand()%(i+1); InsertDuLinkList(L,cnt,a[i]); PrintDutLinkList(L); } return OK; }
相关文章推荐
- c语言实现循环链表的基本操作
- C语言从零开始之数据结构与算法顺序线性表基本操作(1)
- C语言从零开始之数据结构与算法单链线性表基本操作(2)
- C语言单链表,双向链表,循环单链表,循环双链表的基本操作
- 双向循环链表基本操作(C语言)
- 双向循环链表基本操作的实现(C语言)
- c语言链表基本操作(带有创建链表 删除 打印 插入)
- 单向链表基本操作(C语言实现)
- C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)
- C语言单链表的基本操作
- C语言--链表基本操作(课时5)
- 算法与数据结构-单向链表的基本操作C语言实现
- C语言链表基本操作
- 双向循环链表的基本操作
- C语言链表的基本操作
- C语言 链表的基本操作实现 源码
- 【C语言提高52】链表的基本操作
- 数据结构--单链表的基本操作(C语言实现)
- 单向链表的C语言实现与基本操作
- C语言-----链表的各项操作总结------双向循环链表