0
点赞
收藏
分享

微信扫一扫

学习学习2(单链表)

唯米天空 2022-04-29 阅读 78

单链表

一、单链表的定义

链表概念:

链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
请添加图片描述

二、链表的创建:

typedef struct LinkNode{
	char data;
	struct LinkNode *next;
} LNode, *LinkList, *NodePtr;

三、链表的初始化

LinList initLinkList(){
	NodePtr tempHeader = (NodePtr)malloc(sizeof(LNode));
	tempHeader->data = "\0";
	tempHeader->next = NULL ; 
	return temHeader ;
}

四、尾插法:

请添加图片描述
代码演示

void appendElement(NodePtr paraheader,char parachar){
	NodePtr p,q;
	p=(NodePtr)malloc(sizeof(LNode));
	p->data=parachar;
	p->next=NULL;
	q=paraheader;
	while(q->next!=NULL){
		q=q->next;
	}
	q->next=p;
}

五、头插法:

请添加图片描述

代码演示

void appendElement2(NodePtr paraheader,char parachar){
	NodePtr p,q;
	p=(NodePtr)malloc(sizeof(LNode));
	p->data=parachar;
	q=paraheader;
	p->next=q->next;
	q->next=p;         //头插法 
}

六、任意插入:

代码演示

void insertElement(NodePtr paraHeader, char paraChar, int paraPosition){
	NodePtr p,q;
	p=paraHeader;
	for(int i=0;i<paraPosition;i++){
		p = p->next;
	}
	if(p=NULL){
		printf("The position %d is beyond the scope of the list.", paraPosition);
	}
	q=(NodePtr)malloc(sizeof(LNode));
	q->data=parachar;
	q->next=p->next;
	p->next=q;
} 

七、删除

请添加图片描述

代码演示

void deleteElement(NodePtr paraHeader, char paraChar){
	NodePtr p,q;
	p=paraHeader;
	while(p->next!=NULL && p->next!=paraChar){
		p=p-next;
	}
	if(p->next==NULL){
		printf("can't delete %c",paraChar);
	}
	q=p->next;
	p->next=p->next->next;
	free(q);
}

注意:
1、不需要申请动态内存空间,是因为没有添加新的元素
2、要先用一个指针指向p->next,不能直接释放q的内存,否则如果先释放了q的内存,就不能在指向q的下一个,即为原来的p->next->next,要先让p->next等于p->next->next,再释放q的内存

八、销毁链表:

代码演示:

void destroyList(NodePtr paraHeader){
	NodePtr p=paraHeader;
	while(p!=NULL){
		p = p->next;
		free(p);
	}
	printf("销毁成功")//销毁链表 
}

注意:从头指针开始依次释放所有结点

九、清空链表:

代码演示:

void clearList(NodePtr paraHeader){
	NodePtr p,q;
	q=paraHeader->next;
	while(q!=NULL){
		p=q->next;
		free(q);
		q=p;
	}
	printf("清除成功")
} 

注意:链表仍然在,但表中无元素,为空表,依次释放所有结点

十、获取链表长度:

代码演示:

void Listlength(NodePtr paraHeader){
	NodePtr p;
	p=paraHeader;
	for(int i=0;p!=NULL;i++){
		p=p->next;
	}
	printf("链表长度为%d",i-1);
} 

十一、查找第x位元素:

代码演示

void getElement(NodePtr paraHeader,char paraChar,int paraPosition){
	NodePtr p;
	p=paraHeader;
	for(int i=0;i<paraPosition;i++){
		p=p->next;
	}
	printf("第%d位的元素为%c",paraPosition,p);
}

十二、查找元素x的位置:

代码演示

void locateElement(NodePtr paraHeader,char paraChar){
	NodePtr p;
	p=paraHeader;
	int i;
	for(i=0;p->data!=paraChar;i++){
		p=p->next;
	}
	printf("元素%c在第%d位",paraChar,i);
}

十三、总代码演示:

代码演示

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

typedef struct LinkNode{
	char data;
	struct LinkNode *next;
}LNode,*LinkList,*NodePtr;

LinkList initLinkList(){
	NodePtr tempHeader = (NodePtr)malloc(sizeof(LNode));
	tempHeader->data = '\0';
	tempHeader->next = NULL ; 
	return tempHeader ;
}

void printList(NodePtr paraHeader){
	NodePtr p = paraHeader->next;
	while(p!=NULL){
		printf("%c ",p->data);
		p=p->next;
	}
}

void appendElement(NodePtr paraheader,char parachar){
	NodePtr p,q;
	p=(NodePtr)malloc(sizeof(LNode));
	p->data=parachar;
	p->next=NULL;
	q=paraheader;
	while(q->next!=NULL){
		q=q->next;
	}
	q->next=p;
}          //尾插法 

void appendElement2(NodePtr paraheader,char parachar){
	NodePtr p,q;
	p=(NodePtr)malloc(sizeof(LNode));
	p->data=parachar;
	p->next=NULL;
	q=paraheader;
	p->next=q->next;
	q->next=p;       //头插法 
}



void insertElement(NodePtr paraHeader,char paraChar,int paraPosition){
	NodePtr p,q;
	p=paraHeader;
	for(int i=0;i<paraPosition;i++){
		p = p->next;
	}
	if(p==NULL){
		printf("The position %d is beyond the scope of the list.", paraPosition);
		return;
	}
	q=(NodePtr)malloc(sizeof(LNode));
	q->data=paraChar;
	q->next=p->next;
	p->next=q;        //任意插入 
} 

void deleteElement(NodePtr paraHeader, char paraChar){
	NodePtr p,q;
	p=paraHeader;
	while(p->next!=NULL && p->next->data!=paraChar){
		p=p->next;
	}
	if(p->next==NULL){
		printf("can't delete %c",paraChar);
	}
	q=p->next;
	p->next=p->next->next;
	free(q);   //删除 
}

void destroyList(NodePtr paraHeader){
	NodePtr p=paraHeader;
	while(p!=NULL){
		free(p);
		p=p->next;
	}
	printf("销毁成功");   //销毁链表 
}

void clearList(NodePtr paraHeader){
	NodePtr p,q;
	q=paraHeader->next;
	while(q!=NULL){
		p=q->next;
		free(q);
		q=p;
	}
	printf("清除成功");
} 

void Listlength(NodePtr paraHeader){
	NodePtr p;
	p=paraHeader;
	int i=0;
	for(i=0;p!=NULL;i++){
		p=p->next;
	}
	printf("链表长度为%d",i-1);
} 

void getElement(NodePtr paraHeader,int paraPosition){
	NodePtr p;
	p=paraHeader;
	for(int i=0;i<paraPosition;i++){
		p=p->next;
	}
	printf("第%d位的元素为%c",paraPosition,p->data);
}

void locateElement(NodePtr paraHeader,char paraChar){
	NodePtr p;
	p=paraHeader;
	int i;
	for(i=0;p->data!=paraChar;i++){
		p=p->next;
	}
	printf("元素%c在第%d位",paraChar,i);
}

void appendInserttest(){
	NodePtr List=initLinkList();
	appendElement(List,'H');
	appendElement(List,'E');
	appendElement(List,'L');
	appendElement(List,'L');
	appendElement(List,'O');
	appendElement(List,'!');
	printf("链表为:");
	printList(List);
	insertElement(List,'!',2);
	printf("\n") ;
	printf("在第二位添加!");
	printf("\n") ;
	printList(List);
	printf("\n") ;
	deleteElement(List,'E');
	printf("删除E后");
	printf("\n") ;
	printList(List);
	printf("\n") ; 
	getElement(List,2);
	printf("\n") ;
	locateElement(List,'H');
	printf("\n") ;
	printf("正在清除链表..."); 
	printf("\n") ;
	clearList(List);
	printf("\n") ;
	printf("正在销毁链表...");
	printf("\n") ; 
	destroyList(List);
	printf("\n") ;
}
void appendtest2(){
	NodePtr List=initLinkList();
	appendElement2(List,'1');
	appendElement2(List,'2');
	appendElement2(List,'3');
	appendElement2(List,'4');
	appendElement2(List,'5');
	appendElement2(List,'6');
	printf("\n") ;
	printf("头插法");
	printf("\n") ;
	printList(List);
	Listlength(List);
}
	


int main(){
	appendInserttest();
	appendtest2();
	return 0;
}
举报

相关推荐

0 条评论