2.2单链表

1、引入库

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;
	}
	printf("\r\n");
} 

插入

头插法:

 代码: 

Link headCreateLink(int n){
	Link head,newNode;
	head = (Link)malloc(sizeof(struct Node));
	head->next = NULL;
    
	while(n--){
		newNode = (Link)malloc(sizeof(struct Node));
		scanf("%d",&newNode->value);
		newNode->next = head->next;
		head->next = newNode;
        
	}
    
	return head;
}

尾插法:

 

void appendElement(NodePtr paraHeader,char paraChar){
    NodePtr p,q;
    //第一步,构造新的节点
	q=(NodePtr)malloc(sizeof(LNode));
	q->data=paraChar;
	q->next=NULL;
	//第二步,搜索至尾部
	p=paraHeader;
	while(p->next!=NULL){
		p=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("Cannot delete %c\r\n",paraChar);
			return;
		}
		q=p->next;
		p->next=p->next->next;
		free(q);
	}

测试: 

void appendInsertDeleteTest(){
		//第一步,初始化空列表
		LinkList tempList=initLinkList();
		printList(tempList);
		//第二步,添加一些字符
		appendElement(tempList,'h');
		appendElement(tempList,'e');
		appendElement(tempList,'l');
		appendElement(tempList,'l');
		appendElement(tempList,'o');
		appendElement(tempList,'!');
		printList(tempList);
		//第三步,删除一些字符(第一次出现)
		deleteElement(tempList,'e');
		deleteElement(tempList,'a');
		deleteElement(tempList,'o');
		printList(tempList);
		//第四步,插入到给定的位置
		insertElement(tempList,'o',1);
		printList(tempList);
	} 
	/*
	*地址测试
	*/
	void basicAddressTest(){
		LNode tempNode1,tempNode2;
		tempNode1.data=4;
		tempNode1.next=NULL;
		
		tempNode2.data=6;
		tempNode2.next=NULL;
		
		printf("The first node:%d,%d,%d\r\n",&tempNode1,&tempNode1.data,&tempNode1.next);
		printf("The first node:%d,%d,%d\r\n",&tempNode2,&tempNode2.data,&tempNode2.next);
		tempNode1.next=&tempNode2;
	} 

完整代码:

#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;
} //初始链表 
/*打印列表
*@param paraHeader 头节点
*/
void printList(NodePtr paraHeader){
	NodePtr p = paraHeader->next;
	while(p!=NULL){
		printf("%c",p->data);
		p = p->next;
	}
	printf("\r\n");
} 
/**
*在尾部添加元素
*@param paraHeader The header of the list
*@param paraChar 给定的元素
*/
void appendElement(NodePtr paraHeader,char paraChar){
    NodePtr p,q;
    //第一步,构造新的节点
	q=(NodePtr)malloc(sizeof(LNode));
	q->data=paraChar;
	q->next=NULL;
	//第二步,搜索至尾部
	p=paraHeader;
	while(p->next!=NULL){
		p=p->next;
	} 
	//第三步,添加
	p->next=q; 
	}
	/*
	*将一个元素插入到给定位置
	*
	*
	*/
    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;
		//第三步,链接
		printf("linking\r\n");
		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("Cannot delete %c\r\n",paraChar);
			return;
		}
		q=p->next;
		p->next=p->next->next;
		free(q);
	}
	/*
	*测试
	*/
	void appendInsertDeleteTest(){
		//第一步,初始化空列表
		LinkList tempList=initLinkList();
		printList(tempList);
		//第二步,添加一些字符
		appendElement(tempList,'h');
		appendElement(tempList,'e');
		appendElement(tempList,'l');
		appendElement(tempList,'l');
		appendElement(tempList,'o');
		appendElement(tempList,'!');
		printList(tempList);
		//第三步,删除一些字符(第一次出现)
		deleteElement(tempList,'e');
		deleteElement(tempList,'a');
		deleteElement(tempList,'o');
		printList(tempList);
		//第四步,插入到给定的位置
		insertElement(tempList,'o',1);
		printList(tempList);
	} 
	/*
	*地址测试
	*/
	void basicAddressTest(){
		LNode tempNode1,tempNode2;
		tempNode1.data=4;
		tempNode1.next=NULL;
		
		tempNode2.data=6;
		tempNode2.next=NULL;
		
		printf("The first node:%d,%d,%d\r\n",&tempNode1,&tempNode1.data,&tempNode1.next);
		printf("The first node:%d,%d,%d\r\n",&tempNode2,&tempNode2.data,&tempNode2.next);
		tempNode1.next=&tempNode2;
	} 
	/*
	*The entrance
	*/
	int main(){
		appendInsertDeleteTest();
	}

运行结果:

hello!
Cannot delete a
hll!
linking
holl!

--------------------------------
Process exited after 0.04962 seconds with return value 0
请按任意键继续. . .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值