基本结构
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; } }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) { //............ }