First I'd recommend learning how to indent your code, and add some whitespace, and use full bracing, and better variable names. Then throw out non-standard junk, and add in the necessary headers. And put in some error checking. And discard the malloc casts (if you are compiling C with a C++ compiler, look into compiling C as C).
Avoid input using scanf. Watch out for empty loops cause by putting a semicolon at the end of a for statement. Properly declare main, etc.
Then it might look more like this (except this still uses your scanf calls) and someone else may bother to take a pass at it.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node
{
struct node *prev,*next;
char line[20];
};
void copy(struct node **,int start,int end,int desti);
void Append(struct node **, char *);
void Appendll(struct node **, char *);
void Display(struct node **);
int main()
{
struct node *head = NULL;
int ch, start, end, desti;
char line[20];
while ( 1 )
{
printf("Enter your choice: ");
scanf("%d",&ch);
if ( ch == 1 )
{
printf("Enter the data in the first ll ");
scanf("%s",line);
Append(&head,line);
}
else if ( ch == 2 )
{
Display(&head);
}
else if ( ch == 3 )
{
printf("Enter the start end and destination ");
scanf("%d %d %d",&start,&end,&desti);
copy(&head,start,end,desti);
}
else if ( ch == 0 )
{
break;
}
}
return 0;
}
void Append(struct node **list, char line[])
{
struct node *newnode = malloc (sizeof *newnode);
if ( newnode )
{
strcpy(newnode->line, line);
newnode->next = NULL;
if ( *list == NULL )
{
newnode->prev = NULL;
*list=newnode;
}
else
{
struct node *t = *list;
while ( t->next != NULL )
{
t = t->next;
}
newnode->prev = t;
t->next = newnode;
}
}
}
void Appendll(struct node **dummy, char line[])
{
struct node *newnode = malloc(sizeof *newnode);
if ( newnode )
{
strcpy(newnode->line,line);
newnode->next=newnode->prev=NULL;
if ( *dummy==NULL )
{
newnode->prev=NULL;
*dummy=newnode;
}
else
{
struct node *temp=*dummy;
while ( temp->next!=NULL )
temp=temp->next;
newnode->prev=temp;
temp->next=newnode;
}
}
}
void Display(struct node **head)
{
struct node *temp = *head;
if ( temp==NULL )
{
printf("Empty");
return;
}
printf("\n\t\t");
do
{
printf("\n%s ", temp->line);
temp = temp->next;
}
while ( temp != NULL );
printf("NULL\n\n");
}
void copy(struct node **head, int start, int end, int desti)
{
struct node *s = NULL, *dummy = NULL, *t = NULL;
int i;
char data[20];
for ( i = 1, s = *head; i <= start; i++ )
{
s = s->next;
}
//copying the data into dummy link list
for ( i = start; i <= end; i++ )
{
strcpy(data, s->line);
Appendll(&dummy, data);
}
printf("Dummmy");
Display(&dummy);
//appending that dummy list to original one at destination
for ( i = 1, s = *head; i<= desti; i++ )
{
s = s->next;
}
// desti
//head-> 1 2 3 4 5 s->=6= 7
// dummy ->=1 2 3 4<-t NULL
if ( s->next != NULL )
{
for ( t = dummy; t != NULL; t = t->next )
{
s->next->prev=t;
t->next=s->next;
s->next=dummy;
dummy->prev=s;
}
}
Display(head);
}