LinkList

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

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR -1

typedef char ElemType;						//指定ElemType的类型

typedef struct LNode{
	/************************************************************************/
	/*定义线性单链表的结构体                                                    */
	/*Went 2011-10-14 15:08											  */
	/************************************************************************/
	ElemType data;
	struct LNode *next;
}LNode, *LinkList;

void CreateList_L(LinkList &L, int n) {
	//逆位序输入n个元素的值,建立带头节点的单链线性表L。
	int i = 0;
	LinkList p;
	L = (LinkList)malloc(sizeof(LNode));
	L -> next = NULL;			//建立头结点L
	while(i < n) {
		p = (LinkList)malloc(sizeof(LNode));		//生成新节点
		scanf("%c", &p -> data);					//输入元素值eg:asdbc
		p -> next = L -> next;
		L -> next = p;							//插入到表头
		i++;
		printf("i = %d\n", i);
	}
}//CreateList_L   

int DestroyList_L(LinkList &L) {
	//销毁单链线性表
	LinkList p;
	while(L) {
		p = L -> next;
		free(L);
		L = p;
	}
	return OK;
}//DestroyList_L

int ClearList_L(LinkList &L) {
	//重置单链线性表
	LinkList p, q;
	p = L -> next;									//p指向第一个节点
	while(p) {
		q = p -> next;
		free(p);
		p = q;
	}
	L -> next = NULL;
	return OK;
}//ClearList_L

int ListEmpty_L(LinkList L) {
	//判断单链线性表是否为空
	if (L -> next)
		return FALSE;
	else
		return TRUE;
}//ListEmpty_L

int ListLength_L(LinkList L) {
	//单链线性表的元素个数
	LinkList p;
	int count;
	p = L -> next;
	count = 0;
	while (p) {
		count ++;
		p = p -> next;
	}
	return count;
}//ListLength_L


int GetElem_L(LinkList L, int i, ElemType &e) {
	//L为带头结点的单链表的头指针
	//当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
	LinkList p;
	int j;
	if (i < 1 || i > ListLength_L(L))
		return ERROR;
	p = L -> next;
	j = 1;
	while(p && j < i) {
		p = p -> next;
		j++;
	}
	if (!p || j > i)
		return ERROR;
	e = p -> data;
	return OK;
}//GetElem_L

int PriorElem_L(LinkList L, ElemType cur_e, ElemType &pre_e) {
	//返回前驱
	LinkList p, q;
	p = L -> next;
	while(p && p -> data != cur_e) {
		q = p;									//q为p的前驱
		p = p -> next;
	}
	if (!p || p == L -> next) {
		printf("No prior\n");
		return ERROR;
	}
	pre_e = q -> data;
	return OK;
}//PriorElem_L

int NextElem_L(LinkList L, ElemType cur_e, ElemType &next_e) {
	//返回后继
	LinkList p, q;
	p = L -> next;
	while(p && p -> data != cur_e) {
		q = p;
		p = p -> next;
	}
	if (!p || !p -> next) {
		printf("No next\n");
		return ERROR;
	}
	next_e = p -> next -> data;
	return OK;
}//NextElem_L

int ListInsert_L(LinkList &L, int i, ElemType e) {
	//在带头结点的单链线性表L中第i个位置插入元素e
	LinkList p, s;
	int j = 0;
	p = L;
	while(p && j < i - 1) {							//寻找第i - 1个节点
		p = p -> next;
		j++;
	}
	if(!p || j > i - 1)								//i小于1或者大于表长+1
		return ERROR;
	s = (LinkList)malloc(sizeof(LNode));			//生成新节点
	s -> data = e;
	s -> next = p -> next;
	p -> next = s;
	return OK;
}//ListInsert_L

int ListDelete_L(LinkList &L, int i, ElemType &e) {
	//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
	LinkList p, q;
	int j = 0;
	p = L;
	q = NULL;
	while(p -> next && j < i - 1) {					//寻找第i个节点,并令p指向其先驱
		p = p -> next;
		j++;
	}
	if (!(p -> next) || j > i - 1)					//删除位置不合理
		return ERROR;
	q = p -> next;
	p -> next = q -> next;
	e = q -> data;
	free(q);
	return OK;
}//ListDelete_L

void MergeList_L(LinkList &La, LinkList &Lb, LinkList &Lc) {
	//已知单链线性表La和Lb的元素按值非递减排列
	//归并得到Lc且元素按值非递减排列
	LinkList pa, pb, pc;
	pa = La -> next;
	pb = Lb -> next;
	Lc = pc = La;									//用La的头结点作为Lc的头结点
	while(pa && pb) {
		if (pa -> data <= pb -> data) {
			pc -> next = pa;
			pc = pa;
			pa = pa -> next;
		}
		else {
			pc -> next = pb;
			pc = pb;
			pb = pb -> next;
		}
	}
	pc -> next = pa ? pa : pb;						//插入剩余段
	free(Lb);										//释放Lb的头结点
}//MergeList_L

int ListPrint_L(LinkList L) {
	//打印
	LinkList p;
	p = L -> next;
	while(p) {
		printf("%c ", p -> data);
		p = p -> next;
	}
	printf("\n");
	return 1;
}

void main() {
	LinkList list1;
	int order, temp, result;
	ElemType res;
	
			//InitList a list
			printf("input 5 elements in your list\n");
					 CreateList_L(list1, 5);
			
			//If it is empty
			temp = ListEmpty_L(list1);
					 if (temp == TRUE)
						 printf("The SqList is empty\n");
					 else
						 printf("The SqList is not empty\n");
			//The length of a list
			result = ListLength_L(list1);
					 printf("ListLength is %d\n", result);
			//Get the specified element
			temp = GetElem_L(list1, 5, res);
					 if (temp == ERROR)
						 printf("ERROR occured in GetElem_L(...)\n");
					 else
						 printf("The specified element is : %c\n", res);
			//Get the prior elememt
			temp = PriorElem_L(list1, 'r', res);
					 if (temp == ERROR)
						 printf("ERROR occured in PriorElem_L(...)\n");
					 else
						 printf("The prior element is : %c\n", res);
			//Get the next element
			temp = NextElem_L(list1, 't', res);
					 if (temp == ERROR)
						 printf("ERROR occured in NextElem_L(...)\n");
					 else
						 printf("The next element is : %c\n", res);
			//Insert the list
			temp = ListInsert_L(list1, 6, 'a');
					 if (temp == ERROR)
						 printf("ERROR occured in ListInsert_L(...)\n");
					 else
						 printf("List insert successfully\n");
			//Delete an element
			temp = ListDelete_L(list1, 1, res);
					 if (temp == ERROR)
						 printf("ERROR occured in ListDelete_L(...)\n");
					 else
						 printf("Delete successfully\n");

			//Traverse the list
			temp = ListPrint_L(list1);
			//Clear a list
			temp = ClearList_L(list1);
					 if (temp != OK)
						 printf("ERROR ACCURED IN ClearList_L\n");
					 else
						 printf("Clear Successfully!\n");
			//Traverse the list
			temp = ListPrint_L(list1);
			//Destroy a list
			temp = DestroyList_L(list1);
				 if (temp != OK)
					 printf("ERROR ACCURED IN DestroyList_L\n");
				 else
					 printf("Destroy Successfully!\n");
			printf("end!");
			system("pause");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值