链表ADT实现(C语言)2018.3.11

#include <stdio.h>
#include <stdlib.h>
#define name_to_str(name_)  (#name_)
/**<  定义结点及结构体指针,结构体指针linklist为链表头结点指针*/
typedef struct LNode{
    int data;
    struct LNode* next;
}LNode,*LinkList;//结构体指针
/**< 初始化链表 */
LNode* Init_LL()
{
    LinkList p=(LNode*)malloc(sizeof(LNode));
    p->data=NULL;
    p->next=NULL;
    return p;
}
/**< 在第pos个结点之前插入一个DATA为Val的新节点 */
void Insert_LL(LinkList pLL,int pos,int Val)
{
    LNode* P=pLL;
    LNode* A=Init_LL();//不初始化结点不能使用,malloc相关。
    A->data=Val;
    int i;
        for(i=0;i<pos-1;i++)
    {if(P)
        P=P->next;
    else
        {
            printf("位置非法");
            exit(-1);}
        }
    A->next=P->next;
    P->next=A;
}
/**< 删除结点,pos之前 */
void Delete_LL(LinkList pLL,int pos)
{
    int i;
    LinkList q,p=pLL;
    for(i=0;i<pos-1;i++)
        p=p->next;
    q=p->next;
    p->next=q->next;
    free(q);
}
/**< 求直接前驱 */
LNode* PriorElment_LL(LinkList pLL,int Data)
{
    LinkList p=pLL;
    while(p->next->data!=Data)
        p=p->next;
        printf("%d_prior_element_data_is_%d",Data,p->data);
        return p;
}
/**< 求直接后继 */
LNode* NextElment_LL(LinkList pLL,int Data)
{
    LinkList p=pLL;
    while(p->data!=Data)
        p=p->next;
        printf("%d_next_element_data_is_%d",Data,p->data);
        return p;
}
/**<  返回第POS个数据的值*/
int GetElement_LL(LinkList pLL,int pos)
{
    LinkList p=pLL;
    int i;
    for(i=0;i<pos;i++)
        p=p->next;
    printf("the %dth element is %d",pos,p->data);
    return p->data;
}
/**< 泡排 */
void BubbleSort_LL(LinkList pLL)
{
    LinkList p=pLL,q;
    int cnt=0,i,j,temp;
    while(p->next!=NULL)
    {
        cnt++;
        p=p->next;
    }
    //printf("cnt=%d",cnt);
    q=pLL->next;
        for(i=0;i<cnt-1;i++)
{
    p=q;
        for(j=0;j<cnt-i-1;j++)
    {
        if(p->data<p->next->data)
        {
            temp=p->data;
            p->data=p->next->data;
            p->next->data=temp;
            //printf("比较%d?=%dexchange\n",p->data,p->next->data);///非常奇怪,总是大数小数exchange
            p=p->next;
        }
        else
        {
            //printf("比较%d?=%dunchange\n",p->data,p->next->data);
            p=p->next;}


    }
    //printf("当前循环完成\n");
}


        Printf_LL(pLL);


}
/**< 合并有序链表 */
LinkList Add_LL(LinkList p,LinkList q)
{
    LinkList a=p->next,b=q->next;
    LinkList c=Init_LL();
    LinkList L=c;
    while(a&&b)
{
    if (a->data>=b->data)
        {
         //   printf("1   %d,%d\n",a->data,b->data);
            c->next=a;
            a=a->next;


        }
    else
        {
        //    printf("2   %d,%d\n",a->data,b->data);
            c->next=b;
            b=b->next;


        }
   //     printf("CDATA=%d\n",c->data);
    c=c->next;
    c->next=NULL;
}
if (a==NULL)
    c->next=b;
else c->next=a;
printf("合并有序链表结果为:\n");
Printf_LL(L);


}
/**< 打印链表 */
void Printf_LL(LinkList pLL)
{
    LNode* p=pLL;
    int i=1;
    printf("打印链表结果为:");
    do{
        p=p->next;
        printf("linklist[%d]=%d\t",i,p->data);
        i++;
    }while(p->next!=NULL);
    printf("\n\n");
}
/**< 测试ADT */
int main()
{
    LinkList p=Init_LL();
    Insert_LL(p,1,6);
    Insert_LL(p,2,8);
    Insert_LL(p,3,4);
    Insert_LL(p,3,3);
    Insert_LL(p,2,1);
    Insert_LL(p,4,9);
    Printf_LL(p);
    LinkList q=Init_LL();
    Insert_LL(q,1,2);
    Insert_LL(q,2,5);
    Insert_LL(q,3,7);
    Insert_LL(q,3,3);
    Insert_LL(q,2,11);
    Insert_LL(q,3,20);
    Insert_LL(q,1,12);
    Printf_LL(q);
    BubbleSort_LL(p);
    BubbleSort_LL(q);
    Add_LL(p,q);
    return 0;
}

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页