数据结构_链式存储

       先讲废话,再上代码。

       顺序存储的链表在处理数据量变化较大时,会存在数组申请内存不够或申请内存过多而造成的浪费,因此我们需要一个可以即用即申,不用则直接释放内存的存储结构——链式存储。

  1. 创造并打印链表
    #include <stdio.h>
    #include <stdlib.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) {
    		printf("%c", p->data);
    		p = p->next;
    	}
    	printf("\r\n");
    } 
    

    2.插入

    //将指定的paraChar加入到链表尾部
    void appendElement(NodePtr paraHeader, char paraChar){
    	NodePtr p, q;
    	
    	//1.创造新结点存储指定数据
    	q = (NodePtr)malloc(sizeof(LNode));
    	q->data = paraChar;
    	q->next = NULL;    		//注意这里一定要写否则会被系统判作野指针
    	 
    	//2.找到链表尾部
    	p = paraHeader;
    	while (p->next) {
    		p = p->next;
    	} 
    	
    	//3.把创造结点加入链表尾部
    	p->next = q; 
    } 
    
    //将指定元素加入到指定位置
    void insertElement(NodePtr paraHeader, char paraChar, int paraPosition){
    	NodePtr p, q;
    	
    	//1.寻找目标位置
    	p = paraHeader;
    	for (int i = 0; i < paraPosition; i++) {
    		p = p->next;
    		if (!p) {
    			printf("The position %d is beyond the scope of the list.",paraPosition);
    			return;
    		}
    	}
    	
    	//创造新结点存储指定数据 
    	q = (NodePtr)malloc(sizeof(LNode));
    	q->data = paraChar;
    	
    	//3.连接
    	printf("linking\r\n");
    	q->next = p->next;
    	p->next = q;		//主要代码 
    } 

    3.删除

    //删除一个指定元素值
    void deleteElement(NodePtr paraHeader, char paraChar){
    	NodePtr p, q;
    	p = paraHeader;
    	
    	//1.找到指定元素存在的位置的上一个结点,方便删除 
    	while (p->next&&(p->next->data != paraChar)) {
    		p = p->next;
    	}
    	if (!p->next) {
    		printf("Cannot delete %c\r\n", paraChar);
    		return;
    	}
    	
    	//2.删除 
    	q = p->next;
    	p->next = p->next->next;
    	free(q);   //释放该结点 
    } 
    

    4.测试

    //测试
    void appendInsertDeleteTest(){
    	//1.创造一个空链表
    	LinkList tempList = initLinkList();
    	printList(tempList);
    	
    	//2.加入一些字符
    	appendElement(tempList, 'H');
    	appendElement(tempList, 'e');
    	appendElement(tempList, 'l');
    	appendElement(tempList, 'l');
    	appendElement(tempList, 'o');
    	appendElement(tempList, '!');
    	printList(tempList);
    	
    	//3.删除一些数据 
    	deleteElement(tempList, 'e');
    	deleteElement(tempList, 'a');
    	deleteElement(tempList, 'o');
    	printList(tempList);
    	
    	//4.加入数据到指定位置
    	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 second node: %d, %d, %d\r\n",
    		&tempNode2, &tempNode2.data, &tempNode2.next);
    		
    	tempNode1.next = &tempNode2;
    }  

    5.主函数

    //主函数
    int main(){
    	appendInsertDeleteTest(); 
    } 

    6.测试结果

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值