程序员成长之双向循环链表
来源:互联网 发布:数据编是不是得英语好 编辑:程序博客网 时间:2024/05/21 09:43
/*在gentoo下编译通过*/
#include<stdio.h>
#include<stdlib.h>
typedef int elemtype;
typedef struct node{
struct node *pre;
elemtype data;
struct node *next;
}tclist;
tclist* create_list(tclist *L){ /*初始化并建立链表*/
int i,n;
tclist *t,*p;
if(!(L=(tclist *)malloc(sizeof(tclist)))) return NULL;
L->pre=NULL;
L->next=NULL;
printf("请输入初始化元素的个数:");
scanf("%d",&n);
p=L;
for(i=1;i<=n;i++){
if(!(t=(tclist *)malloc(sizeof(tclist)))) return NULL;
printf("请输入第%d个元素的值:",i);
scanf("%d",&t->data);
t->pre=p;
p->next=t;
p=p->next;
}
p->next=L;
L->pre=p;
return L;
}
void destory_list(tclist *L){ /*销毁链表*/
tclist *p,*c;
if(L->next==NULL) free(L);
else{
c=L->next;
p=c->next;
L->next=NULL;
while(c){
free(c);
c=p;
if(p) p=p->next;
}
}
printf("链表销毁成功!/n");
}
tclist* delete_list(tclist *L){ /*清空链表*/
tclist *p,*c;
c=L->next;
p=c->next;
L->pre->next=NULL;
L->next=NULL;
L->pre=NULL;
while(c){
free(c);
c=p;
if(p) p=p->next;
}
return L;
}
int is_empty(tclist *L){ /*判断是否为空*/
if(L->next==NULL) return 1;
else return 0;
}
int get_list_length(tclist *L){ /*获取链表长度*/
int i;
tclist *p;
if(is_empty(L)) return 0;
else{
for(p=L->next,i=0;p!=L;p=p->next,i++);
return i;
}
}
void print_list(tclist *L){ /*打印链表*/
tclist *p;
for(p=L->next;p!=L;p=p->next) printf(" %d",p->data);
}
int find(tclist *L,elemtype e){ /*查找某元素出现次数*/
tclist *p;
int i;
for(p=L->next,i=0;p!=L;p=p->next){
if(p->data==e) i++;
}
return i;
}
tclist* append(tclist *L,elemtype e){ /*链表尾插入*/
tclist *t;
if(!(t=(tclist *)malloc(sizeof(tclist)))) printf("分配临时点出错。。/n");
else{
t->data=e;
t->pre=L->pre;
t->next=L;
L->pre->next=t;
L->pre=t;
}
return L;
}
tclist* delete_elem(tclist *L,elemtype e){ /*删除所有指定元素*/
tclist *p,*t;
p=L->next;
while(p!=L){
if(p->data==e){
t=p;
p->pre->next=p->next;
p->next->pre=p->pre;
p=p->next;
free(t);
}
else p=p->next;
}
return L;
}
int scan(){ /*菜单函数*/
int i;
printf("/t/t*** 操作菜单 ***/n");
printf("0.销毁链表 1.初始化并建立链表 2.清空链表 3.判断空否 4.取链表长度/n");
printf("5.打印链表元素 6.查找某元素在链表中出现的次数/n");
printf("7.向链表中插入元素 8.删除链表中所有值为给定值的元素/n");
printf("其它键退出!/n");
scanf("%d",&i);
return i;
}
void main(){
int quit=0;
elemtype e;
tclist *L;
while(!quit){
switch(scan()){
case 0:
destory_list(L);
break;
case 1:
if(L=create_list(L)) printf("初始操作成功/n");
else printf("初始化操作失败/n");
break;
case 2:
if(L=delete_list(L)) printf("清空链表成功!/n");
else printf("清空链表失败...!/n");
break;
case 3:
if(is_empty(L)) printf("这是一个空链表!/n");
else printf("本链表非空!/n");
break;
case 4:
printf("链表长度为:%d/n",get_list_length(L));
break;
case 5:
if(is_empty(L)) printf("这是一个空链表!/n");
else{
printf("链表的值分别为:");
print_list(L);
printf("/n");
}
break;
case 6:
printf("请输入要查找的元素:");
scanf("%d",&e);
printf("元素%d在链表中出现了%d次。/n",e,find(L,e));
break;
case 7:
printf("请输入要插入的元素:");
scanf("%d",&e);
L=append(L,e);
break;
case 8:
printf("请输入要删除的元素:");
scanf("%d",&e);
L=delete_elem(L,e);
break;
default:quit=1;
}
}
}
- 程序员成长之双向循环链表
- 线性表之双向循环链表
- 数据结构之双向循环链表06
- 内核双向循环链表之旅
- 内核双向循环链表之旅
- 数据结构之双向循环链表
- 数据结构之双向循环链表
- 数据结构之双向循环链表
- 内核数据结构之双向循环链表
- 双向循环链表之实践
- 数据结构之双向循环链表
- 数据结构之双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 交友类网站设计
- 如何使用DataTable.Select选出来的Rows生成新的DataTable?
- 三层
- SAP数据按格式保存到EXCEL(OLE)
- Linux Shell 作业控制命令
- 程序员成长之双向循环链表
- 二进制数转换为十进制数
- 使用STL容器构成一棵树
- SWFObject参数
- C# Thread类
- QT 设置环境变量
- MS SQL 锁的理解
- live555与vlc的rtsp组播交互信息
- Subversion错误:Unable to lock ***, please execute the cleanup command.