链表 | 链表基础

题目链接

零、基础

参考:
【创】链表、头指针、头结点、第一个结点
C++结构体和链表
C++链表的理解及创建链表(附源码)
单链表的基本设计(C语言代码实现)

在这里插入图片描述

创建链表

用结构体类型来表示一个节点

#include<iostream>
using namespace std;

typedef struct Lnode{
    
    
    int data;		// 数据域
    Lnode *next;	// 指针域
}*Linklist;

创建长度为Length的链表

void creatList(Linklist L, int length){
    
    //创建一个长度为length的链表,头结点不算
    int i=0;
    Linklist p1,p2;
    p1=p2=L;
    while(i<length){
    
    		//尾插法,就是说在尾部加新节点
        p1=new Lnode;
        p1->data=i+1;
        p2->next=p1;
        p2=p1;
        ++i;
    }
    p2->next=nullptr;		//最后一个节点的指针域赋空指针
}

删除节点

void delnode(Linklist L){
    
    	//删除所创建链表的所有节点,包括头指针
    Linklist tmp,p;
    p=tmp=L;
    while(p->next){
    
    			//删除当前节点之前,要保存下一个节点的指针,这样才不会断链
        tmp=p->next;
        delete p;
        p=tmp;
    }
    delete p;
}
int main(){
    
    

    Linklist L=new Lnode;	//L是指向头结点的指针,这几句都是创建一个头结点
    L->data=0;
    L->next=nullptr;
    creatList(L,4);			//创建一个长度为4的链表,数据域分别为1,2,3,4,头结点另算

    Linklist p;
    p=L;
    while(p->next){
    
    			//从头结点开始打印节点的数据域
        cout<<p->data<<endl;
        p=p->next;
    }						//打印出了最后一个的所有节点的数据域
    cout<<p->data<<endl;	//打印最后一个节点的数据域
    delnode(L);
    return 0;

}

例子: 创建链表,自己输入数据

参考:C++结构体和链表

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;

struct Node{
    
    
		int data;
		Node *next;
};

Node *head,*p,*r;
int x;

int main(){
    
    
	cin >> x;
	head = new Node;		// 申请head
	r=head;				

	while(x!=1){
    
    
		p = new Node;   	// 申请新结点
		
		p -> data = x;		// 新结点的数据为x
		p -> next = NULL;	// 新节点的指针为NULL
		r -> next = p;		// 把新结点链接到前面
		r = p;				// 移动r
		cin >> x;			// 循环输入x
	} 
	
	/* 输出链表*/
	p = head->next;
	while(p->next !=NULL){
    
    
		cout << p->data << " ";
		p = p->next;
	}
	cout << p->data << endl; //注意*

	return 0;
} 

单链表查找

	p = head->next;
	int i = 0;
	while(p -> next !=NULL){
    
    
		if(p-> data == 3){
    
    
			i++;
		}
		p = p->next
	}
	cout << "链表中数据为3的个数有" << i <<"个"<<endl;

插入

在这里插入图片描述

/*在第i个位置插入x*/
void Insert(Node *head, int i, int x){
    
    
	Node *p, *s;
	int j;	// j==i时候,插入新结点
	p = head;
	j = 0;
	while(p != NULL && (j<i-1)){
    
     
	//j==i的那个位置,插入,所以i前面的i-1节点的next要指向s
	p = p->next; //一直循环到上图的p结点
	j=j+1;
	}
	if(p==NULL){
    
    
		cout << “没有这个位置” <<endl;
	}else{
    
    
		s = new Node;	//分配新结点
		s->data = x;
		s->next = p->next;
		p->next = s;
	}
}

单链表删除

在这里插入图片描述

/*删除第i个结点*/
void Delete(Node *head ,int i){
    
    
	Node *p, *s;
	int j;
	p = head;
	j = 0;
	while(p!=NULL &&(j<i-1)){
    
    
		p=p->next;
		j=j+1;
	}
	if(p==NULL){
    
    
		cout<<"没有这个位置"<<endl;
	}else{
    
    
		s= p->next;
		p->next = p->next->next;
		free(s);
		
	}
}

猜你喜欢

转载自blog.csdn.net/weifengomg/article/details/128260559
今日推荐