码迷,mamicode.com
首页 > 其他好文 > 详细

链表

时间:2014-05-21 11:19:08      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:c   几种操作   链表   

#include<stdio.h>
#include<stdlib.h>
typedef int elemType;

typedef struct Node{//定义单链表节点类型 
	elemType data;
	Node *next;
}Node,*linkList;
//初始化链表,单链表的头指针为空 
int initList(linkList &L)
{
	L= (Node *)malloc(sizeof(Node));
	if(!L) exit(-1);
	L->next= NULL;
	return 1;
}
int destoryList(linkList &L)
{
	Node *p;
	while(L) 
	{
		p=L->next;
		free(L);
		L=p;         //?
	}
	return 1;
}
//将L重置为空链表
int clearList(linkList &L) 
{
	Node *p,*q;
	if(L==NULL)
		return 0;
	p=L->next;
	while(p!=NULL) 
	{
		q=p->next;
		free(p);
		p=q;
	}
	L->next=NULL;
	return 1;	
}
//判断单链表是否为空 
int isEmptyList(linkList &L)
{
	if(L->next)
		return 0;	
	else return 1;
}
//返回单链表中的个数
int listLength(linkList &L) 
{
	int i=0;
	Node *p=L->next;
	while(p)
	{
		i++;
		p=p->next;
	}
	return i;
}
//取得第i个元素
int getElem (linkList L,int i,elemType &e)
{
	int j=0;
	Node *p=L->next;
	while(p&&j<i-1)
	{
		p=p->next;
		j++;
	}
	if(!p||j>i-1)
	{
		return -1;
	}
	e=p->data;
	return 1;
} 
//查询e的位置
int locateElem(linkList L,elemType e) 
{
	int i=0;
	linkList p= L->next;
	while(p)
	{
		i++;
		if(p->data==e)
			return i;
		p=p->next;
	}
	return 0;
}
//返回前驱
int priorElem(linkList L,elemType pro_e)
{
	linkList q,p=L->next;
	while(p->next)
	{
		q=p->next;
		if(q->data==pro_e) 
		{
			return p->data;
		}
		p=q;
	} 
}
//返回后继
int nextElem(linkList L,elemType next_e)
{
	linkList p;
	p=L->next;
	while(p->next)
	{
		if(p->data==next_e)
			return p->next->data;
		p=p->next;
	}
	return -1;
}
//在第i个位置插入e 
int insertList(linkList &L,int i,elemType e) 
{
	int j=0;
	linkList p=L,s=NULL;
	while(p&&j<i-1)
	{
		p=p->next;
		j++; 
	}
	if(!p||j>i-1)
		return -1;
	s=(linkList )malloc(sizeof(Node));
	s->data=e;
	s->next=p->next;
	p->next=s;
	return 1;
}
//删除第i个元素  e为返回的删除 的元素 
int deleteList(linkList &L,int i,elemType &e) 
{
	linkList p=L,q;	
	int j=0;
	if(!p||j>i-1) return -1;
	while(p->next!=NULL&&j<i-1)
	{
		p=p->next;
		j++;
	}
	q=p->next;
	p->next=q->next;
	e=q->data;
	free(q);
	return 1;
}
 //打印链表
 void printList(linkList L) 
 {
 	linkList p=L->next;
 	for(int i=0;i<listLength(L);i++)
 	{
	 	printf("%d ",p->data);
	 	p=p->next;
	 }
	 printf("\n");
 }
int main()
{
	linkList L;
	elemType e;
	initList(L);
	//destoryList(L);
	clearList(L);
	printf("%d\n",listLength(L));

	for(int i=1;i<10;i++)        //i>0&&i<listLength
	{		
		insertList(L,i,i);
	}
	printList(L);	
	getElem(L,7,e);
	printf("%d\n",e);
	
	printf("%d\n",priorElem(L,5));
	
	deleteList(L,2,e) ;
	printf("%d\n",e);	
	printList(L);
	
	printf("%d\n",priorElem(L,5));
	printf("%d\n",nextElem(L,5));
}

链表,布布扣,bubuko.com

链表

标签:c   几种操作   链表   

原文地址:http://blog.csdn.net/whk100312/article/details/26389833

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!