C语言链表

很久没有写C了,基本功不可以丢呀!今天写一个:

#include <stdio.h>
#include <malloc.h>

typedef struct { //节点结构 
	int x;
	struct LNode *next;	
}LNode, *LPointer;


typedef struct { //链表结构 
	LPointer StartPoiner;
	LPointer EndPointer;
	int Length;	
}LinkList, *LinkListP;

int InitLinkList(LinkListP L) { //链表初始化,生成一个头节点 
	L->StartPoiner = (LPointer)malloc(sizeof(LNode));
	if (!L->StartPoiner) {
		return -1;
	}
	else {
		L->StartPoiner->x = 0x7fffffff;
		L->StartPoiner->next = NULL;
		L->EndPointer = L->StartPoiner;
		L->Length = 0;
		return 1;
	}
}

int InsertNode(LinkListP L, LNode mLNode) { //插入节点mLNode 
	LPointer p = (LPointer)malloc(sizeof(LNode));
	if (!p) {
		return -1;
	}
	else {
		p->x = mLNode.x;
		p->next = NULL;
		L->EndPointer->next = p;
		L->EndPointer = p;
		L->Length++;
		return 1;	
	}
}

int DelNode(LinkListP L, int position) { //删除position位置的节点,1<=position<=L->Length 
	if (position > L->Length || position < 1) return -1;
	else {	
		LPointer p = L->StartPoiner;
		int count = 1;
		while (p != NULL && count < position) {
			count++;
			p = p->next;
		}
		LPointer pdel = p->next;
		p->next = pdel ->next;
		L->Length--;
		free(pdel);
		return 1;
	}
}

LPointer getNode(LinkListP L, int position) { //获取position位置的节点,1<=position<=L->Length  
	if (position > L->Length || position < 1) return NULL;
	else {	
		LPointer p = L->StartPoiner->next;
		int count = 1;
		while (p != NULL && count < position) {
			count++;
			p = p->next;
		}
		return p;
	}
}

int changeList(LinkListP L) { //链表倒置
	LPointer p = L->StartPoiner->next;
	p = p->next;
	if (!p) return -1;
	else {
		L->EndPointer = L->StartPoiner->next;
		while(p) {
			L->EndPointer->next = p->next;
			p->next = L->StartPoiner->next;
			L->StartPoiner->next = p;
			p = L->EndPointer->next;
		}
		return 1;
	}
}

void printLinkList(LinkListP L) { //调用getNode查看所有节点 
	int i;
	for (i = 1; i <= L->Length; i++) {
		printf("the value of the %d position node is %d\n", i, getNode(L, i)->x);
	}
} 

void DelEvenPositionNode(LinkListP L) { //删除偶数位置的节点
	//由于删除一个偶数位置节点链表里所有节点位置会发生变化
	//所以删除所有偶数位置节点其实就是删除以2位置节点以及变化后的3,4,5,6节点
	 int i;
	 for (i = 2; i <= L->Length; i++) {
		DelNode(L, i);
	 }
}

void DelEvenValueNode(LinkListP L) { //删除偶数值的节点
	//这个就一个一个节点看过去,是的就删掉呗,注意删除后节点位置的变化
	int i = 1;
	while (i <= L->Length) {
		LPointer p = getNode(L, i);
		if (p && p->x % 2 == 0) {
			DelNode(L, i);	
		}
		else if (p) {
			i++;
		}
	} 
}

int main() {
	LinkListP L;
	int i;
	if (InitLinkList(L) == 1) {
		printf("Initization successfully\n");
	}
	else exit(1);
	
	for (i = 0; i < 10; i++) { //插入值为0-9的节点 
		LNode mLNode;
		mLNode.x = i;
		mLNode.next = NULL;
		if (InsertNode(L, mLNode) == -1) {
			printf("There are errors when insert node to linklist\n");
		}
		else {
			printf("Insert node successfully, the value of node is %d\n", mLNode.x);
		}
	}
	//DelEvenPositionNode(L); printf("Have deleted all even position nodes\n");
	//删除偶数位置节点的话结果应该是02468 
	DelEvenValueNode(L); printf("Have deleted all even value nodes\n");
	//删除偶数位置节点的话结果应该是13579 
	changeList(L); 
	printLinkList(L);
	return 0;
}



你可能感兴趣的:(c,struct,null,insert,语言)