建图方法

    xiaoxiao2023-09-25  166

    单链表

    基本结构

    struct node { int data;//存储值 node *next;//下一节点 };

    存储

    node *head,*p; int a; head=NULL; for(int i=1;i<=8;++i) { cin>>a; p=new node;//生成新节点 p->data=a;//存值 p->next=head;//新生成的节点next指向头结点,从而成为新的头结点 head=p;//新的头结点 }

    遍历

    p=head;//取出头结点指针 while(p) { cout<<p->data<<" "; p=p->next; } //加入输入的是1、2、3、4、5; //那么输出的是5、4、3、2、1

    插入

    p=head; node *H,*L; cin>>a;//输入需要插入的值 while(1) { if(p->data<=a) {L=p;p=p->next;}//这儿是找到比它大的节点,没有找到继续遍历,同时储存上个节点 else { H=new node; H->data=a; L->next=H;//上个节点指向新生成的节点 H->next=p;//新节点指向下一节点 break; } }

    删除

    cin>>a;//输入需要删除的值 p=head; while(1) { if(p->data!=a) {L=p;p=p->next;} else { L->next=p->next;//上一个节点的next指向当前节点的next delete p; break; } }

    双向链表

    struct node { int val;//数据 node *prev,*next;//指针 }; struct node { int val; int prev,next; }Node[maxn];

     

    node *head,*tail; void initialize(){//新建链表 head = new node(); tail = new node(); head->next = tail; tail->prev = head; } int head,tail,tot; void initialize(){ tot = 2; head = 1,tail = 2; Node[head].next = tail; Node[tail].prev = head; }

     

    //在 p 后插入包含数据val 的新节点 void insert(node *p,int val){ q = new node(); q->val = val; p->next->prev = q; q->next = p->next; p->next = q;q->prev = p; } void insert(int p,int val) { q = ++tot; Node[q].val = val; Node[Node[p].next].prev = q; Node[q].next = Node[p].next; Node[p].next = q; Node[q].prev = p; }

     

    void remove(node *p){//删除p p->prev->next = p ->next; p->next->prev = p->prev; delete p; } void remove(int p){ Node[Node[p].prev].next = Node[p].next; Node[Node[p].next].prev = Node[p].prev; } void recycle(){//链表内存回收 while(head!=tail){ head = head->next; delete head->prev; } delete tail; } void clear(){//数组模拟链表清空 memset(Node,0,sizeof(Node)); head = tail = tot = 0; }

     

     

    数组模拟邻接表(链式前向星)

        可以与下边的链式前向星比对一下。

    const int maxn=1001,maxm=100001; struct Edge { int next;//下一条边的编号 int to;//这条边到达的点 int dis;//这条边的长度 }edge[maxm]; int head[maxn],num_edge,n,m,u,v,d; //num_edge=0;num_edge全局变量默认为0 memset(head,-1,sizeof(head)); inline void add_edge(int from,int to,int dis)//加入一条from-->to的距离为dis的边 { edge[++num_edge].next=head[from]; edge[num_edge].to=to; edge[num_edge].dis=dis; head[from]=num_edge; } //遍历 for(int i=head[1];i!=-1;i=edge[i].next) { //............ }

    链式前向星

    //链式前向星 const int maxn=1001,maxm=100001; struct Edge { int to;//表示这条边的另一个顶点 int next;//指向下一条边的数组下标,值为-1表示没有下一条边 }; int head[maxn];//head[i]表示顶点i的第一条边的数组下标,-1表示顶点i没有边 Edge edge[maxm]; memset(head,-1,sizeof(head));//链式前向星初始化 inline void add_edge(int a,int b,int id)//增加一组a->b的边,该边的数组下标的id { edge[id].to=b; edge[id].next=head[a];//新增的边要成为顶点a的第一条边,而不是最后一条边 head[a]=id; return ; } //遍历从a点出去的所有边 for(int i=head[a];i!=-1;i=edge[i].next) { //e[i]就是你当前遍历的a->edge[i].to }

     

    最新回复(0)