数据结构——单链表的实现——C语言版

目前这个实现是有问题的,但是大体上已经算OK,欢迎大家来帮我完善,谢谢!

这个实现的内容包括,单链表的创建,摧毁,求表长,插入,删除,取某个元素,遍历等操作,欢迎指正!


/*******************************************************
单链表的实现——C语言版
********************************************************/

#include <stdio.h>
#include <stdlib.h>

//函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE (-1)
#define OVERFLOW (-2)
#define null 0
#define BOOL bool

//定义结构体元素的类型
typedef char ElemType; /* 字符型数据*/

typedef struct LN{ //这里的LNode是结构体类型名
	ElemType data;
	int Length;     //for the length of the linklist
	struct LN *next;
}LNode,*LinkList;//这里定义了结构体的变量和指针

//初始化链表
BOOL Init_LinkList(LNode **pLinklist){
	*pLinklist = (LNode*)malloc(sizeof(LNode));
	if(!(*pLinklist)){
		printf("初始化单链表失败!!\n");
		return FALSE;
	}
	//head = pLinklist;//头结点
	(*pLinklist)->data = NULL;//数据为0
	(*pLinklist)->Length = 1; 
	(*pLinklist)->next = NULL;//下一指针为空
	printf("初始化单链表成功!!\n");
	return TRUE;
}

//摧毁表
BOOL Destroy_LinkList(LNode *pLinklist){
	//把链表的所有结点都摧毁
	LNode* p = NULL;
	p = pLinklist;
	while(!pLinklist->next){
		p = pLinklist;
		pLinklist = pLinklist->next;
		free(p);
	}
	free(pLinklist);
	printf("摧毁单链表成功!!\n");
	return TRUE;
}

//置空表
BOOL Clear_LinkList(LNode *pLinklist){
	LNode* p = NULL;
	while(!pLinklist->next){
		p = pLinklist;
		pLinklist = pLinklist->next;
		free(p);//现在是剩下最后一个结点
	}
	pLinklist->data = NULL;
	pLinklist->Length = 1;
	return TRUE;
}

//求表长
int Length_LinkList(LNode **pLinklist){
	return (*pLinklist)->Length;
	/*
	int n = 0;
	LNode *p = *pLinklist;
	while(!p->next){
		p = p->next;
		n++;
	}
	return (n);
	*/
}

//(找到链表中排序为i的元素排序从1开始),并返回给e
BOOL GetElem_LinkList(LNode **pLinklist,int i,ElemType e){
	int num = 1;
	int length = 0;
	LNode *q=*pLinklist;
	length = Length_LinkList(pLinklist);
	if(i<1||i>length){
		printf("要求的位置大于链表的长度!!\n");
		return FALSE;
	}
	while(num<i&&q){
		q = q->next;
		num++;
	}
	e = q->data;
	printf("取回数据成功!!\n");
	return TRUE;
}

//找到链表中排序为i的元素(排序从1开始)
ElemType GetElem2_LinkList(LNode **pLinklist,int i){
	int num = 1;
	LNode *q = *pLinklist;

	if(i<1||i>(*pLinklist)->Length){
		printf("要求的位置大于链表的长度!!\n");
		return ERROR;
	}
	while(num<i&&q){
		q = q->next;
		num++;
	}
	printf("取回数据成功!!\n");
	return q->data;
}

//往从1开始的第i位插入X元素
BOOL Insert_LinkList(LNode **pLinklist,ElemType insdata,int i){
	int num = 1;
	LNode *ins=NULL,*q=NULL;
	ins = (LNode *)malloc(sizeof(LNode));
	if(!ins){
		printf("空间不够,不能插入!!\n");
		return FALSE;
	}
	ins->data = insdata;

	q = *pLinklist;
	if(i<1||i>(*pLinklist)->Length){
		printf("输入的i值大于链表的表长!!\n");
		return FALSE;
	}
	if(1 == i){
		ins->next = q;
		*pLinklist = ins;
	}else{
		while(num<(i-1)&&q->next!=NULL){
			q = q->next;
			num++;
		}
		ins->next = q->next;
		q->next = ins;
	}
	(*pLinklist)->Length++;
	return TRUE;
}

//返回链表中第一个值为x的元素的序号,序号从1开始算
int Locate_LinkList(LNode **pLinklist,ElemType searchX){
	int n = 1;
	LNode *p = *pLinklist, *q;
	while(p!=NULL&&p->data!=searchX){
		q = q->next;
		n++;
	}
	if(!q){
		printf("该链表中找不到X元素,请重新确认!!\n");
		return ERROR;
	}else{
		printf("链表中第一个值为x的元素的序号是%d!!\n",n);
		return n;
	}
}

//删除链表中序号是第i位的元素值(从1开始)
int Del_LinkList(LNode **pLinklist,int i){
	int num = 1;
	LNode *t,*q = *pLinklist;
	if(i<1||i>(*pLinklist)->Length){
		printf("输入的i值大于链表的表长,请确认!!\n");
		return ERROR;
	}
	if(1==i){
		t = q;
		q = q->next;
	}else{
		while(num<i&&q->next){
			q = q->next;
			num++;
		}
		if(num = i&&q->next){
			t = q->next;
			q->next = t->next;
		}
		free(t);
	}
	(*pLinklist)->Length--;
	printf("链表中序号是第%d位的元素值是%d!!\n",i,num);
	return OK;
}

//遍历该链表
void Travel_LinkList(LNode **pLinkList){
	LNode *p = *pLinkList;
	if(!p){
		printf("链表为空!");
	}else if(!p->next){
		printf("该链表只有1个元素,值是:%c\n",p->data);
	}else{
		printf("该链表的元素是:");
		while(p->next){
			printf("%c、",p->data);
			p = p->next;
		}
		printf("%c、",p->data);//最后一个元素
		printf("\n");
	}
}

//主函数
int main()
{
	LNode *head=NULL;  /*定义静态变量*/
	int select,x1,x2,x3,x4;
	int i,n; 
	int m,g;
	char e,y; 
	
 	Init_LinkList(&head);  /*建链表并设置为空表*/
 	printf("请输入数据长度: ");
 	scanf("%d",&n);
 //	for(i=1;i<n;i++)
 	{
 		printf("将数据插入到单链表中: ");
 		scanf("%d",&y);
 		Insert_LinkList(&head,y,i); /*插入数据到链表*/
 		Travel_LinkList(&head);	 /*显示链表所有数据*/
 		
 	//	printf("select 1 求长度 Length_LinkList()\n");
 	//	printf("select 2 取结点 GetElem2_LinkList()\n");
 	//	printf("select 3 求值查找 Locate_LinkList()\n");
 	//	printf("select 4 删除结点 Del_LinkList()\n");
 	//	printf("input your select: \n");
 		scanf("%d",&select);	
		switch(select)
		{
			case 1:
			{
				x1=Length_LinkList(&head);
				printf("输出单链表的长度%d ",x1);
	 			Travel_LinkList(&head);
	 		}break;
	 		
	 		case 2:
	 		{
	 			printf("请输入要取得结点: ");
         			scanf("%d",&m);
         			x2=GetElem2_LinkList(&head,m);
         			printf("%d位置的字符是:%c\n",m,x2);
	 			Travel_LinkList(&head);
	 		}break;
	 	
 			case 3:
 			{
 				printf("请输入要查找的数据: ");
         			scanf("%d",&e);
         			x3=Locate_LinkList(&head,e);
         			printf("第一次出现%c字符的位置是%d\n",e,x3);
	 			Travel_LinkList(&head);
	 		}break;
 			
 			case 4:
 			{
 				printf("请输入要删除的结点: ");
         			scanf("%d",&g);
         			x4=Del_LinkList(&head,g);
         			printf("删除第一次出现%c字符的位置是%d\n",g,x4);
	 			Travel_LinkList(&head);
	 		}break;
		}
	}
	return OK;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值