数据结构基础3_带头结点的单链表
2015-10-13 12:51
633 查看
#include<iostream> #include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef int Status; #define true 1 #define false 0 typedef struct Lnode{ ElemType data; struct Lnode *next; }*link,*Position; typedef struct{ link head,tail; int len; }linklist; Status Makenode(link &p,ElemType e) { p=(link)malloc(sizeof(Lnode)); if(!p) { return false; } p->data=e; return true; } void Freenode(link &p) { free(p); p=NULL; } Status Initlist(linklist &L) { link p; p=(link)malloc(sizeof(Lnode)); if(!p) { return false; } p->next=NULL; L.head=L.tail=p; L.len=0; return true; } Status Clearlist(linklist &L) { link p,q; p=L.head->next; L.head->next=NULL; while(p!=NULL) { q=p->next; free(p); p=q; } L.tail=L.head; L.len=0; return true; } Status Destorylist(linklist &L) { Clearlist(L); free(L.head); L.head=L.tail=NULL; L.len=0; return true; } Status Insfirst(linklist &L,link h,link s) { h=L.head; s->next=h->next; h->next=s; L.len++; return true; } Status Delfirst(linklist &L,link h,link q) { h=L.head; if(h->next==NULL) { return false; } q=h->next; h->next=q->next; free(q); L.len--; return true; } Status Append(linklist &L,link s) { int n=1; link p; p=L.head; while(p->next!=NULL) { p=p->next; } p->next=s; while(s->next!=NULL) { s=s->next; n++; } L.tail=s; L.len+=n; } Status Remove(linklist &L,link &q) { link p; p=L.head; if(L.head==L.tail) { return false; } q=L.head; while(q->next!=NULL) { q=q->next; } while(p->next!=q) { p=p->next; } p->next=q->next; L.tail=p; L.len--; return true; } Status Insbefore(linklist &L,link &p,link s) { link q=L.head; while(q->next!=p) { q=q->next; } s->next=q->next; q->next=s; p=s; L.len++; return true; } Status Insafter(linklist &L,link &p,link s) { s->next=p->next; p->next=s; if(p==L.tail) { L.tail=s; } p=s; L.len++; return true; } Status Setcurelem(link &p,ElemType e) { p->data=e; return true; } ElemType Getcurelem(link p) { return p->data; return true; } Status Listempty(linklist L) { if(L.head->next==NULL) { return true; } else { return false; } } int Listlength(linklist &L) { return L.len; } Position Gethead(linklist L) { return L.head; } Position Getlast(linklist L) { return L.tail; } Position priorpos(linklist L,link p) { link pre=L.head; while(pre->next!=p) { pre=pre->next; } if(L.head==pre) { return NULL; } return pre; } Position Nextpos(linklist L,link p) { /* if(L.tail==p) { return NULL; }*/ return p->next; } Status Locatepos(linklist L,int i,link &p) { if(i<0||i>L.len) { return false; } p=L.head; while(i!=0) { i--; p=p->next; } return 1; } int compare(ElemType e1,ElemType e2) { if(e1>e2) { return 1; } if(e1==e2) { return 0; } else { return -1; } } Position Locateelem(linklist L,ElemType e,Status compare(ElemType,ElemType)) { int j; link p; p=L.head->next; for(int i=0;i<L.len;i++) { if(compare(e,p->data)==0) { return p; } p=p->next; } return NULL; } Status visit(link p) { printf("%d",p->data); } Status Listtraverse(linklist &L,Status visit(link p)) { link p=L.head->next; while(p!=NULL) { visit(p); p=p->next; } return true; } Status Listinsert(linklist &L,int i,ElemType e) { link h,s; if(!Locatepos(L,i-1,h)) { return false; } if(!Makenode(s,e)) { return false; } if(h==L.tail) { L.tail=s; } Insfirst(L,h,s); return true; } void mergelist(linklist &La,linklist &Lb,linklist &Lc) { link pa,pb,pc; pa=La.head->next; pb=Lb.head->next; Lc.head=pc=La.head; while(pa && pb) { if(pa->data <= pb->data) { pc->next=pa; pc=pa; pa=pa->next; } else { pc->next=pb; pc=pb; pb=pb->next; } } if(pa==NULL) { pc->next=pb; } else { pc->next=pa; } }
#include<stdio.h> #include<stdlib.h> int main() { linklist La; Initlist(La); Listinsert(La,1,7); Listinsert(La, 2, 5); Listinsert(La, 3, 2); Listinsert(La, 4, 1); linklist lb; Initlist(lb); Listinsert(lb,1,39); Listinsert(lb,2,19); Listinsert(lb,3,9); Listinsert(lb,4,3); /* link h,q,k; Delfirst(La,h,q); Remove(La,k);*/ linklist lc; mergelist(La,lb,lc); Listtraverse(lc,visit); printf("\n"); system("pause"); }
相关文章推荐
- 数据结构复习1——链表反转
- 数据结构笔记
- 理解 OpenStack + Ceph (4):Ceph 的基础数据结构 [Pool, Image, Snapshot, Clone]
- 数据结构试验二:链表
- Two Sum
- python数据结构学习笔记-2-算法
- 数据结构(七)链表
- 内存管理器(二)边界标识法
- Billboard(线段树,单点更新)
- 数据结构(八)二叉树遍历
- 数据结构(十)完全二叉树节点个数计算
- 数据结构(九)满二叉树深度计算
- 残缺棋盘
- 选择算法
- 【ShancoLove】带你看数据结构——第五课:堆栈
- 【以太网数据结构】IP协议
- 数据结构之-线性表
- 【ShancoLove】带你看数据结构——第四课:线性表链式结构(循环链表)
- 【读书笔记】大话数据结构之 栈(1)
- 二叉树-遍历