Beispiel #1
0
//add
LinkList add(LinkList L1, LinkList L2, LinkList L)
{
    Node *p, *q;
    long long i, nu0 = 0, en0 = 0;
    p = L1->next;
    q = L2->next;
    while (p && q)
    {
        i = p->num + q->num + en0;
        nu0 = i % 100000000;
        CreateListHead(L, "00", nu0, 0);
        en0 = i / 100000000;
        p = p->next;
        q = q->next;
    }
    while (p)
    {
        i = p->num + en0;
        nu0 = i % 100000000;
        CreateListHead(L, "00", nu0, 0);
        en0 = i / 100000000;
        p = p->next;
    }
    while (q)
    {
        i = q->num + en0;
        nu0 = i % 100000000;
        CreateListHead(L, "00", nu0, 0);
        en0 = i / 100000000;
        q = q->next;
    }
    if (en0)
    {
        CreateListHead(L, "00", en0, 0);
    }
    return L;
}
int main()
{        
    LinkList L;
    ElemType e;
    Status i;
    int j,k;
    i=InitList(&L);
    printf("初始化L后:ListLength(L)=%d\n",ListLength(L));
    for(j=1;j<=5;j++)
            i=ListInsert(&L,1,j);
    printf("在L的表头依次插入1~5后:L.data=");
    ListTraverse(L); 

    printf("ListLength(L)=%d \n",ListLength(L));
    i=ListEmpty(L);
    printf("L是否空:i=%d(1:是 0:否)\n",i);

    i=ClearList(&L);
    printf("清空L后:ListLength(L)=%d\n",ListLength(L));
    i=ListEmpty(L);
    printf("L是否空:i=%d(1:是 0:否)\n",i);

    for(j=1;j<=10;j++)
            ListInsert(&L,j,j);
    printf("在L的表尾依次插入1~10后:L.data=");
    ListTraverse(L); 

    printf("ListLength(L)=%d \n",ListLength(L));

    ListInsert(&L,1,0);
    printf("在L的表头插入0后:L.data=");
    ListTraverse(L); 
    printf("ListLength(L)=%d \n",ListLength(L));

    GetElem(L,5,&e);
    printf("第5个元素的值为:%d\n",e);
    for(j=3;j<=4;j++)
    {
            k=LocateElem(L,j);
            if(k)
                    printf("第%d个元素的值为%d\n",k,j);
            else
                    printf("没有值为%d的元素\n",j);
    }
    

    k=ListLength(L); /* k为表长 */
    for(j=k+1;j>=k;j--)
    {
            i=ListDelete(&L,j,&e); /* 删除第j个数据 */
            if(i==ERROR)
                    printf("删除第%d个数据失败\n",j);
            else
                    printf("删除第%d个的元素值为:%d\n",j,e);
    }
    printf("依次输出L的元素:");
    ListTraverse(L); 

    j=5;
    ListDelete(&L,j,&e); /* 删除第5个数据 */
    printf("删除第%d个的元素值为:%d\n",j,e);

    printf("依次输出L的元素:");
    ListTraverse(L); 

    i=ClearList(&L);
    printf("\n清空L后:ListLength(L)=%d\n",ListLength(L));
    CreateListHead(&L,20);
    printf("整体创建L的元素(头插法):");
    ListTraverse(L); 
    
    i=ClearList(&L);
    printf("\n删除L后:ListLength(L)=%d\n",ListLength(L));
    CreateListTail(&L,20);
    printf("整体创建L的元素(尾插法):");
    ListTraverse(L); 


    return 0;
}
Beispiel #3
0
int main()
{


    clock_t start, end;
    long long i, j = 0, k;
    long long digit[2][2] = { 0 };
    char op, string_temp[9];
    char top1, top2;
    char mystring[9], mystring_temp[9];
    //	FILE *ft;
    LinkList L1, L2, L, L_temp, L1_temp, L3_adj;



    InitList(&L1);
    InitList(&L2);
    InitList(&L);
    int flags = 1;
    long long nu1, nu2;
    long long ii = 0, cnt_n = 2;
    int flags_line = 1;


    for (ii = 0; ii < 2; ii++)
    {
        mystring[ii] = getchar();
    }
    if (mystring[1] != '\n')
    {
        printf("op INput ERROR!\n");
        return 0;
    }
    op = mystring[0];
    if (op != '+' && op != '-' && op != '*' && op != '/')
    {
        printf("op INput ERROR!\n");
        return 0;
    }

    while (cnt_n)
    {
        for (ii = 0; ii < 8; ii++)
        {
            mystring[ii] = getchar();
            if (mystring[ii] == '\n')
            {
                cnt_n = cnt_n - 1;
                mystring[ii] = '\0';
                break;
            }
            else if (mystring[ii]<48 || mystring[ii] >57)
            {
                printf("opNumber INput ERROR!\n");
                return 0;
            }
        }
        mystring[ii] = '\0';
        if (ii == 8)
        {
            digit[2 - cnt_n][0] = digit[2 - cnt_n][0] + 1;
            if (cnt_n == 2)
                L1 = CreateListHead(L1, mystring, 0, 0);
            else
                L2 = CreateListHead(L2, mystring, 0, 0);
        }
        else
        {
            digit[2 - cnt_n - 1][1] = ii;
            if (digit[2 - cnt_n - 1][1] + digit[2 - cnt_n - 1][0] * 8 == 0)
            {
                printf("opNumber INput ERROR!\n");
                return 0;
            }

            if (ii)
            {
                if (cnt_n == 1)
                    L1 = CreateListHead(L1, mystring, 0, 0);
                else
                    L2 = CreateListHead(L2, mystring, 0, 0);
            }
        }
        //		mystring[0]='\0';
    }






    /*read from txt to test my input,so save it
    ft = fopen("C:\\Users\\v-xiafe\\Desktop\\ASE\\project (1)\\ConsoleApplication3\\Release\\test.txt", "r");
    if (ft == NULL)
    {
    printf("File Name Error.\n");
    return 0;
    }
    InitList(&L1);
    InitList(&L2);
    InitList(&L);
    int flags = 1;
    long long nu1, nu2;
    while (!digit[1][1])
    {
    fgets(mystring, 9, ft);
    if (strstr(mystring, "+") == NULL && strstr(mystring, "-") == NULL && strstr(mystring, "*") == NULL && strstr(mystring, "/") == NULL)
    {
    while (mystring != NULL)
    {
    //			puts(mystring);
    if (strstr(mystring, "\n") == NULL && strlen(mystring) == 9 - 1)
    {
    //	strcpy(string_temp, mystring);
    if (flags == 1)
    {
    L1 = CreateListHead(L1, mystring, 0, 0);
    digit[0][0] = digit[0][0] + 1;
    }
    else
    {
    L2 = CreateListHead(L2, mystring, 0, 0);
    digit[1][0] = digit[1][0] + 1;
    }
    }
    else
    {
    if (flags == 1)
    {
    if (strlen(mystring) == 1)
    digit[0][1] = 0;
    else
    {
    L1 = CreateListHead(L1, mystring, 0, 0);
    digit[0][1] = strlen(mystring) - 1;
    }
    }
    flags = 2;
    }
    if (feof(ft))
    break;
    else {
    fgets(mystring, 9, ft);
    if (feof(ft))
    {
    digit[1][1] = strlen(mystring);
    if (digit[1][1] == 8)
    digit[1][1] = 0;
    else
    {
    L2 = CreateListHead(L2, mystring, 0, 0);
    }
    break;
    }
    }
    }
    if (feof(ft))
    break;
    }
    else
    {
    op = mystring[0];
    //	putchar(op);
    putchar('\n');
    }
    }
    fclose(ft);
    */

    L1 = AlignList(L1, digit[0][1]);
    L2 = AlignList(L2, digit[1][1]);

    Node *p, *q, *r;
    p = L1->next;
    q = L2->next;
    if (8 * digit[0][0] + digit[0][1] == 1)
    {
        if (p->num == 0)
        {
            printf("opNumber1 INput ERROR!\n");
            return 0;
        }
    }
    if (8 * digit[1][0] + digit[1][1] == 1)
    {
        if (q->num == 0)
        {
            printf("opNumber2 INput ERROR!\n");
            return 0;
        }
    }



    if (op == '/')
    {
        //	InitList(&L1_temp);
        //	InitList(&L2_temp);
        //	Node *p, *q, *p0;
        p = L1->next;
        q = L2->next;
        nu1 = p->num;
        if (p->next)
        {
            while (p->next)
            {
                nu1 = p->num;
                p = p->next;
            }
            nu1 = 100000000 * p->num + nu1;
        }
        while (q)
        {
            nu2 = q->num;
            q = q->next;
        }
    }
    //	op = '*';
    //	Node *p,*r;
    LinkList L_re;
    InitList(&L_re);
    switch (op)
    {
    case '+':
        L_temp = add(L1, L2, L);
        printLink(L_temp);
        break;
    case '-':
        L_temp = sub(L2, L1, L);
        printLink(L_temp);
        break;
    case '*':
        start = clock();
        L_temp = mul(L1, L2, L);
        end = clock();
        p = L_temp->next;
        while (p)
        {
            r = p;
            L_re = CreateListHead(L_re, "00", p->num, 0);
            p = p->next;
            free(r);

        }
        printLink(L_re);
        printf("%d s\n", (end - start) / CLOCKS_PER_SEC);
        break;
    case '/':
    {
        long long n, cn_temp;
        //		Node *p,*q;
        LinkList p0, L_subrev, L1_temp1, L3, L3_temp, L_zc;
        InitList(&L_subrev);
        InitList(&L3);
        InitList(&L3_temp);
        InitList(&L_zc);
        L1_temp1 = L1;
        //	n = digit[0][0] * 4 + digit[0][1] - digit[1][0] * 4 - digit[1][1];
        //	int record[n][2];
        //	start = clock();
        while (1)
        {
            n = digit[0][0] * 8 + digit[0][1] - digit[1][0] * 8 - digit[1][1];
            //	printf("%dwei\n", digit[0][0] * 4 + digit[0][1]);
            digit[0][0] = 0;
            digit[0][1] = 0;
            if (n<0)
            {
                //	printLink(L3);
                //	printLink(L1_temp1);
                break;
            }
            else
            {
                k = nu1 / (nu2 + 1);
                cn_temp = pow(10, getdigit(nu1) - getdigit(nu2));
                //		printf("%d",cn_temp);
                if (nu1 / cn_temp > nu2)
                    n = n + 1;
                else
                {
                    if (n == 0)
                    {
                        //			printLink(L3);
                        //			printLink(L1_temp1);
                        break;
                    }
                }
                if (getdigit(k) > n)
                    k = k / pow(10, getdigit(k) - n);
                L_temp = getL_temp(k, n, L1_temp1, L2, &L3);
                //		printLink(L_temp);
                p = L_temp->next;
                q = L3->next;
                digit[0][1] = getdigit(p->num);
                Destory(L_subrev);
                Destory(L3_temp);
                nu1 = 0;
                while (p->next)
                {
                    L_subrev = CreateListHead(L_subrev, "00", p->num, 0);
                    //	nu1 = p->num;
                    digit[0][0] = digit[0][0] + 1;
                    p = p->next;
                }
                L_subrev = CreateListHead(L_subrev, "00", p->num, 0);
                while (q)
                {
                    L3_temp = CreateListHead(L3_temp, "00", q->num, 0);
                    q = q->next;
                }
                L3 = L3_temp;
                p = L_temp->next;
                nu1 = p->num;
                if (p->next)
                {
                    p = p->next;
                    nu1 = 100000000 * nu1 + p->num;
                }

                //		Destory(L1_temp1);
                //		Destory(L1_temp);
                L1_temp1 = L_subrev;

            }
            //	Destory(L_subrev);
        }
        //		end = clock();
        L_zc = sub(L1_temp1, L2, L_zc);
        p = L_zc->next;
        if (p->num == 0 && p->next == NULL)
        {
            p->num = 1;
            InitList(&L3_adj);
            L3_adj = add(L3, L_zc, L3_adj);
            printLink(L3_adj);
            printf("0\n");
        }
        else
        {
            p = L3->next;
            while (p)
            {
                r = p;
                L_re = CreateListHead(L_re, "00", p->num, 0);
                p = p->next;
                free(r);

            }
            printLink(L_re);
            Destory(L_re);
            p = L1_temp1->next;
            while (p)
            {
                r = p;
                L_re = CreateListHead(L_re, "00", p->num, 0);
                p = p->next;
                free(r);

            }
            printLink(L_re);
        }
        //		printf("%d s", (end - start) / CLOCKS_PER_SEC);
    }
    }
    return 0;
}
Beispiel #4
0
//division
LinkList getL_temp(long long k, long long n, LinkList L1, LinkList L2, LinkList *L3)
{
    LinkList L, L_mul, L_sub, L3_temp, p0;
    Node *p;
    InitList(&L);
    InitList(&L_mul);
    InitList(&L_sub);
    InitList(&L3_temp);
    long long i, nu, n_temp = 0, l1, l2, l1_l3, l2_l3, l3;
    int flags_err;
    l3 = getdigit(k);
    if (l3 != n)
    {
        l1 = n % 8;
        l2 = n / 8;
        l1_l3 = l3 % 8;
        l2_l3 = l3 / 8;
        if (l1 >= l1_l3)
        {
            k = k*pow(10, l1 - l1_l3);
            n_temp = l2 - l2_l3;
        }
        if (l1<l1_l3)
        {
            while (getdigit(k) + l1 + 8 - l1_l3>9)
            {
                k = k * 6 / 7;
                //	k = 2*pow(10, getdigit(k)  - 1);
            }
            k = k*pow(10, l1 + 8 - l1_l3);
            n_temp = l2 - l2_l3 - 1;
        }
    }
    p = L;
    //	printf("%d\n",k);
    if (k == 1919)
    {
        flags_err = 0;
    }
    while (k)
    {
        nu = k % 100000000;
        //	L=CreateListHead(L, "00", nu, 0);
        p0 = (LinkList)malloc(sizeof(Node));
        p0->next = p->next;
        p->next = p0;
        strcpy(p0->data, "00");
        p0->num = nu;
        p0->en = 0;
        k = k / 100000000;
        p = p->next;
    }
    /*
    k = k*pow(10, n - l3);
    while (k)
    {
    nu = k % 10000;
    //	L = CreateListHead(L, "00", nu, 0);
    k = k / 10000;
    }
    */
    L_mul = mul(L, L2, L_mul);

    while (n_temp)
    {
        L_mul = CreateListHead(L_mul, "00", 0, 0);
        L = CreateListHead(L, "00", 0, 0);
        n_temp = n_temp - 1;
    }
    L_sub = sub(L1, L_mul, L_sub);
    *L3 = add(*L3, L, L3_temp);
    //	printLink(L1);
    //	printLink(L_mul);
    //	printLink(L_sub);
    return L_sub;
}
Beispiel #5
0
//sub
LinkList sub(LinkList L1, LinkList L2, LinkList L)
{
    Node *p, *q, *r;
    LinkList p0, L_temp;
    long long i, nu0 = 0, en0 = 0, flags = 0;
    p = L1->next;
    q = L2->next;
    r = L;
    while (p && q)
    {
        if (p->num >= q->num + en0)
        {
            nu0 = p->num - q->num - en0;
            en0 = 0;
        }
        else
        {
            nu0 = 100000000 + p->num - q->num - en0;
            en0 = 1;
        }
        //	CreateListHead(L, "00", nu0, 0);
        p0 = (LinkList)malloc(sizeof(Node));
        p0->next = r->next;
        r->next = p0;
        strcpy(p0->data, "00");
        p0->num = nu0;
        p0->en = 0;
        r = r->next;
        p = p->next;
        q = q->next;
    }
    //printLink(L);
    while (p)
    {
        if (p->num >= en0)
        {
            nu0 = p->num - en0;
            en0 = 0;
        }
        else
        {
            nu0 = 100000000 + p->num - en0;
            en0 = 1;
        }
        //	CreateListHead(L, "00", nu0, 0);
        p0 = (LinkList)malloc(sizeof(Node));
        p0->next = r->next;
        r->next = p0;                      /*  ????? */
        strcpy(p0->data, "00");
        p0->num = nu0;
        p0->en = 0;
        r = r->next;
        p = p->next;
    }
    while (q)
    {
        nu0 = 100000000 - q->num - en0;
        en0 = 1;
        if (q->next)
            //	       CreateListHead(L, "00", nu0, 0);
        {
            p0 = (LinkList)malloc(sizeof(Node));
            p0->next = r->next;
            r->next = p0;
            strcpy(p0->data, "00");
            p0->num = nu0;
            p0->en = 0;
        }
        else
            //			CreateListHead(L, "00", nu0, 1);
        {
            p0 = (LinkList)malloc(sizeof(Node));
            p0->next = r->next;
            r->next = p0;
            strcpy(p0->data, "00");
            p0->num = nu0;
            p0->en = 1;
        }
        r = r->next;
        q = q->next;
        flags = 1;
    }
    if (en0)
    {
        nu0 = 100000000 - en0;
        //	CreateListHead(L, "00", nu0, 1);
        p0 = (LinkList)malloc(sizeof(Node));
        p0->next = r->next;
        r->next = p0;
        strcpy(p0->data, "00");
        p0->num = nu0;
        p0->en = 1;
        flags = 1;
    }
    //	printLink(L);
    InitList(&L_temp);
    p = L->next;
    en0 = 0;
    while (p)
    {
        if (!flags)
        {
            CreateListHead(L_temp, "00", p->num, 0);
            p = p->next;
        }
        else
        {
            CreateListHead(L_temp, "00", 100000000 - en0 - p->num, 0);
            en0 = 1;
            p = p->next;
        }
    }
    p = L_temp->next;
    while (!p->num && p->next)
    {
        p = p->next;
        L_temp->next = p;
    }
    return L_temp;
}