数据结构之链表实现增删改查

来源:互联网 发布:mesh网络 编辑:程序博客网 时间:2024/06/05 15:15
<pre name="code" class="cpp">#include <stdio.h>#include <stdlib.h>#define TRUE 1 #define FALSE 0#define OK 1 #define ERROR 0 #define OVERFLOW -2#define LIST_INIT_SIZE 100 #define LISTINCREMENT 10typedef int Status ;typedef int ElementType ;/*链表实现的数据结构此结构体有两项内容:1.存储值 2.指向下一结点的指针(类型为:LNode)LNode 为此结构体的别名,*LinkList 表示此结构体类型的指针,这样方面下边使用*/typedef struct LNode{ElementType data ;LNode * next ;}LNode , *LinkList;/*-------------创建链表,倒插入-----------------------*/Status CreateList_ch(LinkList &L,int n){int i ;//建立带有头结点的单链表L = (LinkList)malloc(sizeof(LNode)) ;if(!L) exit(OVERFLOW) ;L->next = NULL ; //先建立一个带有节点的单链表for(i=n ;i>0;i--){LinkList p=(LinkList) malloc(sizeof(LNode)); //生成新的节点scanf("%d",&p->data) ; //输入元素的值p->next= L->next ; L->next = p ;}return OK;}/*---------向量表中插入数据------------------------*//*完成功能:向链表的第i个位置插入e元素*/Status Insert_ch(LinkList &L,int i, ElementType e){LinkList p =L->next ;int j = 0;while(p&&j<i-1){ //表示链表不为空且寻找到i-1位置处的指针p = p->next ;++j ;}if(!p||j>i-1) return ERROR ;//位置不合法LinkList q = (LinkList)malloc(sizeof(LNode)); //创建一个新的节点q->data = e ;q->next = p->next ;p->next = q ;return OK ;}/*------------------删除链表中的指定位置的元素------------------------*///并且返回删除元素的值Status Delete_ch(LinkList &L ,int i,ElementType &e){LinkList p =L->next ;int j = 0 ;while(p&&j<i-1){ //寻找第i个结点,并指向要删除节点的前驱p=p->next ;++ j ;}if(!p||j>i-1) return ERROR ;//删除的位置不合法LinkList d = p->next ;e = d->data ;p->next = p->next->next ;//或者使用p->next = d->next free(d);   //释放内存资源return OK ;}/*---------获取某个位置上的值---------------------*/Status GetElem(LinkList &L, int i, ElementType &e){LinkList p = L->next ; //指向头结点的第一个元素int j = 1 ;  while(p&&j<i){//当p不为空是,条件j=i时推出循环,p指向获取元素的位置p=p->next ;++j ;}if(!p||j>i) return ERROR ; //第i个元素不存在e = p->data ;return OK ;}/*--------------遍历链表--------------------------*/Status PrintList(LinkList &L){LinkList a = L->next ;while(a!=NULL){printf("%d\t" , a->data);a=a->next ;}return OK ;}/*--------------两个有序链表的归并-----------------*/Status MergeList_ch(LinkList La, LinkList Lb, LinkList &Lc){//其中已知La,Lb都是有序的线性表LinkList pa = La->next ;LinkList pb = Lb->next ;LinkList pc = NULL ;Lc = pc = La ;//用La的头结点作为Lc的头结点 ,这样能节省一点内存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 ;}}pc->next= pa?pa:pb ;//插入剩余的链表free(pb);return OK ;}void main(){LinkList L ;/*---------创建-----------*/printf("输入五个数,用空格隔开:\n");CreateList_ch(L,5);PrintList(L);    /*---------插入-----------*/printf("\n") ;Insert_ch(L,3,5) ;PrintList(L);    /*---------删除-----------*/printf("\n") ;int e ;Delete_ch(L,3,e);PrintList(L);printf("\n") ;printf("删除的元素为=%d\n",e);    /*---------获取i位置上的元素-----------*/int d ;GetElem(L,1,d);printf("获取第一个元素的值为===%d\n",d);/*-------------测试归并---------------*/LinkList La ,Lb ,Lc;CreateList_ch(La,3);CreateList_ch(Lb,5);MergeList_ch(La,Lb,Lc) ;PrintList(Lc);}
由于水平有限,有错误大家提出来,共同讨论,共同进步
<img src="http://img.blog.csdn.net/20140804163050704?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamltb2xhbmdnZTEyMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
                                             
0 0