程序员成长之双向循环链表
2010-12-08 15:09
211 查看
/*在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;
}
}
}
#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;
}
}
}
相关文章推荐
- ASP.NET Web程序员成长道路
- 程序员技术成长秘籍
- 程序员的快速成长之路
- 删除两个双向循环链表的相同节点
- 关于程序员的成长摘记
- [转]一个令人尊敬的程序员老师——金旭亮的10年成长的经历
- 一个计算机程序员高手的成长
- 程序员成长历程的四个阶段
- PHP 程序员的技术成长规划
- Java程序员成长之路
- 循环链表和双向列表
- java程序员的成长之路
- 初级php程序员成长之路
- 从1.5k到18k, 一个程序员的5年成长之路
- 程序员成长系列(一):手里必须有一套自己的框架
- 程序员成长最快的环境
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】详解Linux内核之双向循环链表
- 这就是java程序员想要的几大成长法则!难道你不想知道?
- Java程序员谈一谈-----java程序员成长之路