双链表的各种基本运算
来源:互联网 发布:和父母关系不好知乎 编辑:程序博客网 时间:2024/06/07 06:14
输入代码:
#include<stdio.h>#include<stdlib.h>typedef char ElemType;typedef struct LNode{ ElemType data; struct LNode *prior; struct LNode *next;} LinkList;//建立双链表void CreateListF(LinkList *&L,ElemType a[],int n){ LinkList *s; int i; L=(LinkList *)malloc(sizeof(LinkList)); L->prior=L->next=NULL; for(i=0; i<n; i++) { s=(LinkList *)malloc(sizeof(LinkList)); s->data=a[i]; s->next=L->next; if(L->next!=NULL) L->next->prior=s; L->next=s; s->prior=L; }}//初始化线性表void InitList(LinkList *&L){ L=(LinkList *)malloc(sizeof(LinkList)); L->prior=L->next=NULL;}//销毁线性表void DestroyList(LinkList *&L){ LinkList *pre=L,*p=L->next; while(p!=NULL) { free(pre); pre=p; p=pre->next; } free(pre);}//判断线性表是否为空表bool ListEmpty(LinkList *L){ return (L->next==NULL);}//求线性表的长度int ListLength(LinkList *L){ int n=0; LinkList *p=L; while(p->next!=NULL) { n++; p=p->next; } return (n);}//输出线性表void DispList(LinkList *L){ LinkList *p=L->next; while(p!=NULL) { printf("%c",p->data); p=p->next; } printf("\n");}//求线性表中某个数据元素值bool GetElem(LinkList *L,int i,ElemType &e){ int j=0; LinkList *p=L; while(j<i&&p!=NULL) { j++; p=p->next; } if(p==NULL) return false; else { e=p->data; return true; }}//按元素值查找int LocateElem(LinkList *L,ElemType e){ int i=1; LinkList *p=L->next; while(p!=NULL&&p->data!=e) { p=p->next; i++; } if(p==NULL) return (0); else return(i);}//插入数据元素bool ListInsert(LinkList *&L,int i,ElemType e){ int j=0; LinkList *p=L,*s; while(j<i-1&&p!=NULL) { j++; p=p->next; } if(p==NULL) return false; else { s=(LinkList *)malloc(sizeof(LinkList)); s->data=e; s->next=p->next; if(p->next!=NULL) p->next->prior=s; s->prior=p; p->next=s; return true; }}//删除数据元素bool ListDelete(LinkList *&L,int i,ElemType &e){ int j=0; LinkList *p=L,*q; while(j<i-1&&p!=NULL) { j++; p=p->next; } if(p==NULL) return false; else { q=p->next; if(q==NULL) return false; e=q->data; p->next=q->next; if(p->next!=NULL)p->next->prior=p; free(q); return true; }}//使元素成为递增有序排列void sort(LinkList *&L){ LinkList *p,*pre,*q; p=L->next->next; L->next->next=NULL; while(p!=NULL) { q=p->next; pre=L; while(pre->next!=NULL&&pre->next->data<p->data) pre=pre->next; p->next=pre->next; if(pre->next!=NULL) pre->next->prior=p; pre->next=p; p->prior=pre; p=q; }}int main(){ LinkList *L; ElemType e; int i=1; printf("(1) 初始化双链表L: \n"); InitList(L); printf("(2) 采用尾插法依次插入a,b,c,d,e :\n"); ListInsert(L,1,'a'); ListInsert(L,2,'b'); ListInsert(L,3,'c'); ListInsert(L,4,'d'); ListInsert(L,5,'e'); printf("(3) 输出双链表 :"); DispList(L); printf("(4) 双链表的长度=%d\n" ,ListLength(L)); printf("(5) 双链表为%s\n",ListEmpty(L)?"空":"非空"); printf("(6) 双链表的第3个元素为:%c\n", GetElem(L,3,e)); printf("(7) 元素a的位置为:%d\n",LocateElem(L,'a')); printf("(8) 在第4个元素位置插入元素f :\n"); ListInsert(L,4,'f'); printf("(9) 输出双链表L: "); DispList(L); printf("(10) 删除L的第3个元素: \n"); ListDelete(L,3,e); printf("(11) 排序双链表: \n"); sort(L); printf("(12) 输出双链表: "); DispList(L); printf("(13) 释放双链表: \n"); DestroyList(L);}
运行结果:
0 0
- 双链表的各种基本运算
- 单链表各种基本的运算
- 单链表的各种基本运算
- 单链表的各种基本运算
- 实现双链表的各种基本运算的算法
- C语言 双链表各种基本运算的算法
- !实现循环双链表各种基本运算的算法
- 顺序表的各种基本运算
- 实验一:单链表的各种基本运算
- 链队列的各种基本运算
- 实现单链表各种基本运算的算法
- 顺序环形队列的各种基本运算
- 数据结构 顺序串的各种基本运算
- 顺序表各种基本运算的算法
- 单链表各种基本运算的算法
- 顺序栈各种基本运算的算法
- 环形队列各种基本运算的算法
- 顺序串各种基本运算的算法
- Fiddler工具监听到的数据导出后中文是乱码,如何解决它
- Unity 随机函数的应用
- Maven私服
- 103. Binary Tree Zigzag Level Order Traversal
- StringCharacterIterator 字符串迭代器,返回字符串中字符的十进制数值
- 双链表的各种基本运算
- some question of Gradle
- Android-ImageView的属性
- Linux C实现简单的UDP服务器客户端通信
- Linux下LVS搭建负载均衡集群
- POJ2524 Ubiquitous Religions(并查集)
- QT 的 Graphics View 系统
- android获取手机IP及&0xFF详解
- 很简单的JAVA反射教程