欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C - 数据结构之 循环链表

程序员文章站 2022-05-16 10:02:36
#include typedef struct node{ int data; struct node * next; }linklistnode; typedef stru...
#include 

typedef struct node{
	int data;
	struct node * next;
}linklistnode;
typedef struct {
	linklistnode *rear;//头指针
	int length; 
	
}linklist; 


//创建表
linklist * createlist(linklist *);
//初始化表 
linklist * initlist(linklist *); 
//求表长 
int getlength(linklist *);
//插入 
linklist * insertlist(linklist *,int ,int );
//前插
linklist * insertlistatfirst(linklist *,int ); 
//按值删除 
linklist * deletelistbyvalue(linklist *,int );
//按序号删除 
linklist * deletelistbyindex(linklist *,int );
//删除头节点 
linklist * deletefirstnode(linklist *); 
//按值查找 
linklistnode * searchbyvalue(linklist *,int );
//按值查找的节点的前一个节点
linklistnode * searchbyvalue2(linklist *,int ); 
//按序号查找 
linklistnode * searchbyindex(linklist *,int ); 
//按序号查找2 
linklistnode * searchbyindex2(linklist *list,int pos);
//去重
linklistnode * deleterepeatvalue(linklist *,int ); 
linklistnode * deleterepeatvalue2(linklist *,int); 

//创建表函数 
linklist * createlist(linklist *list){
	list = (linklist *)malloc(sizeof(linklist));
	printf("\n创建表成功");
	return list;
}
//初始化表函数 
linklist * initlist(linklist *list){
	if(list == null){
		printf("\n表未创建,请先创建再初始化!");
		return null;
	}
	list->head = null;
	list->rear = null;
	list->length = 0;
	printf("\n初始化表成功");
	return list;
}
//后插函数
linklist * insertlistatlast(linklist *list,int value){
	linklistnode *temp;
	
	if(list == null){
		printf("\n表不存在,请先创建并初始化");
		return null;
	}
	
	temp = (linklistnode *)malloc(sizeof(linklistnode));
	
	if(list->length == 0){
		temp->data = value;
		list->rear = temp;
		temp->next = list->rear;
	}else{
		temp->data = value;
		temp->next = list->rear->next;
		list->rear->next = temp;
		list->rear = temp;
	}
 	list->length++;
	printf("\n插入成功");
	return list;
} 
//随意插入函数
linklist *insertlist(linklist *list,int pos,int value){
	linklistnode *temp = null,*p = null;
	linklistnode *newnode;
	if(list == null){
		printf("\n表不存在,请先创建并初始化");
		return null;
	}
	if( pos < 1 || pos > list->length+1){
		printf("\n插入位置不正确");
		return list;
	}
	if(pos == list->length+1){
		list = insertlistatlast(list,value);
		return list;
	}
	temp = searchbyindex(list,pos);
	if(temp){
		newnode = (linklistnode *)malloc(sizeof(linklistnode));
		newnode->data = value;
		newnode->next = temp->next;
		temp->next = newnode;
		list->length++;
	}
	printf("\n插入成功"); 
	return list;
}
//按序号查找
linklistnode * searchbyindex(linklist *list,int pos){
	if(list == null){
		printf("\n表不存在,请先创建并初始化");
		return null;
	}
	if( pos < 1 || pos > list->length){
		printf("\n查找的位置不正确");
		return null;
	}
	int cnt = 1;
	linklistnode *p;
	p = list->rear;
	while(cnt!=pos){
		p=p->next;
		cnt++;
	}
	return p;
}
//按序号查找2 (返回前一个节点)
linklistnode * searchbyindex2(linklist *list,int pos){
	if(list == null){
		printf("\n表不存在,请先创建并初始化");
		return null;
	}
	if( pos < 1 || pos > list->length){
		printf("\n查找的位置不正确");
		return null;
	}
	int cnt = 0;
	linklistnode *p;
	p = list->rear;
	while(cnt!=pos){
		p=p->next;
		cnt++;
	}
	return p;
}
//输出
void displaylist(linklist *list){
	linklistnode *p;
	if(list == null){
		printf("\n表不存在,请先创建并初始化");
		return ;
	}
	p = list->rear->next;
	int i = 0;
	while(ilength){
		printf("\t%d",p->data);
		p = p->next;
		i++;
	}
	return ;
}
//按值查找 
linklistnode * searchbyvalue(linklist *list,int value){
	linklistnode *p = null;
	if(list == null){
		printf("\n表不存在,请先创建并初始化");
		return null;
	}
	p = list->rear;
	int cnt = 0;
	while(cnt < list->length){
		if(p->data == value){
			return p;
		}else{
			p = p->next;
			cnt++;
		}
	}
	return null;
}
//删除链表第一个节点 
linklist * deletefirstnode(linklist *list){
	linklistnode *p = null,*q = null;
	if(list == null){
		printf("\n表不存在,请先创建并初始化");
		return null;
	}
	q = list->rear->next;
	list->rear->next = q->next;
	free(q);
	list->length--;
	printf("\n删除成功");
	return list; 
}

//按序号删除
linklist * deletelistbyindex(linklist *list,int pos){
	linklistnode *p = null,*q = null;
	if(list == null){
		printf("\n表不存在,请先创建并初始化");
		return null;
	}
	if(pos < 1 || pos > list->length){
		printf("\n删除位置不合法");
		return list; 
	}
	if(pos == 1){
		q = list->rear->next;
		list->rear->next = q->next;
		free(q);
		list->length--;
		printf("\n删除成功");
		return list;
	}
	p = searchbyindex2(list,pos-1);
	if(p != null){
		q = p->next;
		p->next = q->next;
		free(q);
		list->length--; 
		printf("\n删除成功"); 
	}
	return list;
}
//按找值为value的节点的前一个节点 
linklistnode * searchbyvalue2(linklist *list,int value){
	linklistnode *p = null;
	if(list == null){
		printf("\n表不存在,请先创建并初始化");
		return null;
	}
	p = list->rear;
	int cnt = 0;
	while(cntlength){
		if(p->next->data == value){
			return p;
		}else{
			cnt++;
			p = p->next;
		}
	}
	return null;
}
//按值删除
linklist * deletelistbyvalue(linklist *list,int value){
	linklistnode *p = null,*q = null;;
	if(list == null){
		printf("\n表不存在,请先创建并初始化");
		return null;
	}
	p = list->rear;
	if(p->next->data == value){
		list = deletefirstnode(list);
		return list;
	}
	p = searchbyvalue(list,value);
	if(p != null){
		q = p->next;
		p->next = q->next;
		free(q);
		list->length--;
		printf("\n删除成功");
		return list;
	}
	return list;
}
//去重
linklistnode * deleterepeatvalue(linklist *list,int value){
	linklistnode *p = null,*q = null;;
	if(list == null){
		printf("\n表不存在,请先创建并初始化");
		return null;
	}
	p = list->rear->next;
	if(p->data == value){
		list = deletefirstnode(list);
		return list;
	}
	p = searchbyvalue2(list,value);
	if(p != null){
		q = p->next;
		p->next = q->next;
		free(q);
		list->length--;
		return list;
	}
	return list;
}
int main(int argc, char *argv[])
{
	linklistnode *w = null;
	int flag = 1;
	int choice;
	int value;
	int pos;
	linklistnode * tempnode = null;
	linklist * list = null;
	while(1){
		printf("\n------链表---------\n");
		printf("\n------1.创建表-----\n");
		printf("\n------2.初始化-----\n");
		printf("\n------3.求表长-----\n");
		printf("\n------4.尾部插入-------\n");
		printf("\n------5.随意插入-------\n");
		printf("\n------6.按值删除---\n");
		printf("\n------7.按序号删除-\n");
		printf("\n------8.按值查找---\n");
		printf("\n------9.按序号查找-\n");
		printf("\n------10.输出表-----\n");
		printf("\n------11.去重-----\n");
		printf("\n------0.退出-------\n");
		
		printf("\n您的选择是:");
		scanf("%d",&choice);
		
		switch(choice){
			case 1:
				list = createlist(list);
				break;
			case 2:
				list = initlist(list);
				break;
			case 3:
				printf("表长为:%d",list->length);
				break;
			case 4:
				printf("\n请输入要插入的值:");
				scanf("%d",&value);
				list = insertlistatlast(list,value);
				break;
			case 5:
				printf("\n请输入要插入的位置:");
				scanf("%d",&pos);
				printf("\n请输入要插入的值:");
				scanf("%d",&value); 
				list = insertlist(list,pos,value);
				break;
			case 6:
				printf("\n请输入要删除的值:");
				scanf("%d",&value);
				list = deletelistbyvalue(list,value);
				break;
			case 7:
				printf("\n请输入要删除元素的位置:");
				scanf("%d",&pos); 
				list = deletelistbyindex(list,pos);
				break;
			case 8:
				printf("\n请输入要查找的值:");
				scanf("%d",&value);
				tempnode = searchbyvalue(list,value);
				if(tempnode == null){
					printf("\n查找失败");
				}else{
					printf("\n该节点地址:%x",tempnode);
					printf("\n该节点的值:%d",tempnode->data);
				} 
				break;
			case 9:
				printf("\n请输入要查找的位置:");
				scanf("%d",&pos);
				tempnode = searchbyindex2(list,pos);
				if(tempnode == null){
					printf("\n查找不成功");
				}else{
					printf("\n结点的值:%d",tempnode->data);
					printf("\n结点的地址:%x",tempnode);
				}
				break;
			case 10:
				displaylist(list);
				break;
			case 11:
				printf("\n请输入要去重的值:");
				scanf("%d",&value);
				w = searchbyvalue(list,value);
				w->data = value+1;
				while(searchbyvalue(list,value) != null){
					list = deleterepeatvalue(list,value);	
				}
				w->data = value;
				printf("\n去重成功!");
				break; 
			case 0:
				return 0;
				break;
			default:
				printf("\n您的选择有误,请重新选择"); 
		}
	}
	return 0;
}