написать связанный список и сделать еще один с обратными номерами первого списка - PullRequest
0 голосов
/ 29 февраля 2020

Таким образом, я могу создать первый связанный список, а затем я могу сохранить все числа в массиве с размером чисел и затем поместить их все во второй связанный список, как я хочу, но есть ли хороший алгоритм для этого без массив?

TY!

1 Ответ

0 голосов
/ 29 февраля 2020
//HERE WE GO!

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

struct listNode{
int value;
struct listNode *nextPtr;
};

typedef struct listNode ListNode;
typedef ListNode *ListNodePtr;

void insert(ListNodePtr *sPtr, int value);
void copy(ListNodePtr *sPtr, int value);

void printList(ListNodePtr sPtr);
int main()
{
int value;

    ListNodePtr startPtr=0;
    ListNodePtr secondPtr=0;
    int tempValue;

    srand(time(0));
    for(int i=0;i<10;i++){
    value=rand()%15;
    insert(&startPtr,value);

    }
    while(startPtr!=0){
    tempValue=startPtr->value;
    copy(&secondPtr,tempValue);
    startPtr=startPtr->nextPtr;
    }

    printList(secondPtr);

}

void copy(ListNodePtr *sPtr, int value)
{
    ListNodePtr newPtr;
    newPtr=malloc(sizeof(ListNode));

if(newPtr!=0){
    newPtr->value=value;
    newPtr->nextPtr=*sPtr;
    *sPtr=newPtr;   
    }else{
    printf("%d not inserted. No memory", value);
    }
}

void insert(ListNodePtr *sPtr,int value)
{
ListNodePtr newPtr,currentPtr,previousPtr;

newPtr=malloc(sizeof(ListNode));
if(newPtr!=0){
    newPtr->value=value;
    newPtr->nextPtr=0;

currentPtr=*sPtr;
previousPtr=0;

while(currentPtr!=0&&value>currentPtr->value){
    previousPtr=currentPtr;
    currentPtr=currentPtr->nextPtr;
    }
if(previousPtr==0){
    newPtr->nextPtr=*sPtr;
    *sPtr=newPtr;
    }else{
    previousPtr->nextPtr=newPtr;
    newPtr->nextPtr=currentPtr;
    }
    }else{
    printf("%d not inserted. No memory available");
    }
}   

void printList(ListNodePtr sPtr)
{
while(sPtr!=0){
printf("%d -->",sPtr->value);
sPtr=sPtr->nextPtr;
}
}
...