双链表的表示和实现(C语言)

#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
typedef struct node{
	ElemType data;
	struct node *next;
	struct node *prior;
	}dlink; 

//建立双链表
dlink * credlink(int n){//返回的指针是指向结构体类型的
	dlink *head,*p,*s;int i;
	p=head=(dlink * )malloc(sizeof(dlink));
	for(i=1;i<=n;i++){
		s=(dlink * )malloc(sizeof(dlink));
		printf("请输入数字!"); 
		scanf("%d",&s->data);
		s->prior=p;
		p->next=s;
		p=s;
	}
	p->next=head->prior=NULL;
	return head;
}
//遍历双链表,和单链表相同 
dlink *showlink(dlink *head){
	dlink *p;
	p=head->next;//p=head
	while(p!=NULL){//p->next!=NULL,如果写成这样,输出结果是错误的 
		printf("%d ",p->data);
		p=p->next;
	}
	printf("\n"); 
} 

//求表长操作
int getlen(dlink *head){
	dlink *p;
	int len=0;
	p=head->next;
	while(p!=NULL){
		len+=1;
		p=p->next;
	}
	return len;
} 
//取元素操作(取出双链表head中第i个结点的值)
int getelem(dlink *head,int i){
	dlink *p,*s;
	int j;
	int e;
	p=head->next;j=1;
	if(i<1)return 0;//判断i结点的合法性 
	while(p!=NULL&&j<i){
		p=p->next;
		j=j+1;
	}
	if(p==NULL)return 0;//结点i超过表长
	e=p->data;
	return e; 
} 

//删除节点(删除双链表中第i个节点)
dlink *deletei(dlink *head,int i){
	dlink *p,*s;
	int j;
	p=head->next;j=1;
	if(i<1)return 0;//判断i结点的合法性 
	while(p!=NULL&&j<i-1){
		p=p->next;
		j=j+1;
	}
	if(p->next==NULL)return 0;//结点i超过表长
	s=p->next;
	s->next->prior=p;
	p->next=s->next;
	free(s);
	return head;
} 

//定位操作(返回双链表中第1个为值为x的结点的位置)
int locate(dlink *head,ElemType x){
	dlink *p;
	int i;
	i=1;
	p=head->next;
	while(p!=NULL&&p->data!=x){
		p=p->next;
		i=i+1;
	}
	if(p==NULL)return 0;
	return i;
	//return p;
} 
 
//插入操作(在双链表中第i个结点之前插入一个值为x的结点)
int insertx(dlink *head,ElemType x,int i){
	dlink *p,*s;
	int j=1;
	p=head->next;
	s=(dlink * )malloc(sizeof(dlink));
	if(i<1)return 0;//插入失败
	while(p!=NULL&&j<i-1){
		p=p->next;
		j=j+1;
	} 
	if(p==NULL)return 0;//插入失败,插入位置超出表长
	s->data=x;
	s->next=p->next;
	s->prior=p;
	p->next->prior=s;
	p->next=s;
	return 1; 
}
//输出操作(从反方向输出双链表中各个结点的值)
dlink *invertshow(dlink *head){
	dlink *p,*s;
	int j=1;
	p=head;
	while(p->next!=NULL){
		p=p->next;
	}
	while(p!=head){
		printf("%d ",p->data);
		p=p->prior;
	}
}
 
int main(){
	dlink *head;
	int n,i,x;
	head = NULL;
	printf("请输入数字输入个数:"); 
	scanf("%d",&n);
	//创建双链表 
	head = credlink(n);
	//遍历双链表 
	showlink(head);
	//获取表长
//	printf("该双链表表长为:%d",getlen(head)); 
//	printf("请输入取出第i个结点\n");
//	scanf("%d",&i);
//	//取节点
//	printf("所取元素为:%d",getelem(head,i));
//	printf("请输入要删除的结点i\n");
//	scanf("%d",&i);
//	deletei(head,i);
//	printf("删除后剩余链表为:\n");
//	showlink(head);
//	printf("请输入你想找到位置的x的值");
//	scanf("%d",&x);
//	printf("该位置为:%d",locate(head,x));
//    printf("请输入插入数值x以及插入位置i");
//    scanf("%d%d",&x,&i);
//    insertx(head,x,i);
//    showlink(head);
	invertshow(head);
	
}  

github下载地址:https://github.com/cantaloupeJinJin/datastructure.git

注意:一个函数可以返回一个整型值、字符值等,也可以返回指针型的数据,即地址。这种返回指针值得函数,一般定义形式为:

        类型名 *a(int i,int j)

a是函数名,调用它以后能得到一个指向整型数据得指针(地址)。x,y是函数a 得形参,为整型。请注意*a两侧没有括号,在a 得两侧分别为*运算符和()运算符。而()的优先级高于*,因此a先与()结合。显然这是函数形式。这个函数前面有一个*,表示此函数是指针型函数(函数值是指针)。最前面的int表示返回的指针指向整型变量。

猜你喜欢

转载自blog.csdn.net/mu66mu/article/details/83818365
今日推荐