There are many mistakes:
1. function call should be:
struct contact *readFile(char * FName,struct contact** ptrList) // pointer to pointer
return fail if ptrList is NULLPTR. if *ptrList is a valid pointer find the trailing element and set head to it. i.e: for(head=*ptrList;head&&head->next;head=head->next);
2. head should be always the trailing element. So you should join it to the *ptrList if *ptrList is a NULLPTR. if(!*ptrList) *ptrList=head;
3. finally:
<br />
struct contact *readFile(char * FName,struct contact** ptrList)<br />
{<br />
if(!ptrList) return;
for(head=*ptrList;head&&head->next;head=head->next);<br />
while( ReadLine(fptr,oneLine) )<br />
{<br />
sname = strtok(oneLine,",");<br />
fname = strtok(NULL,",");<br />
phone = strtok(NULL,",");<br />
company = strtok(NULL,",");<br />
email = strtok(NULL,",");<br />
<br />
newContact = (struct contact *)malloc(sizeof(struct contact));<br />
if(!newContact) break;
newContact->prev = head;<br />
newContact->next = 0;<br />
<br />
strcpy(newContact->sname,sname);<br />
strcpy(newContact->fname,fname);<br />
strcpy(newContact->phone,phone);<br />
strcpy(newContact->company,company);<br />
strcpy(newContact->email,email);<br />
<br />
head = newContact;<br />
if(!*ptrList) *ptrList = head;
}<br />
}<br />
edit 2012-04-24: i will append a new improved solution. please read the comment lines!
<span class="code-preprocessor">#pragma</span> once
<span class="code-preprocessor">#include</span> <stdio.h>
<span class="code-preprocessor">#include</span> <string.h>
<span class="code-preprocessor">#include</span> <stdlib.h>
<span class="code-keyword">typedef</span> <span class="code-keyword">unsigned</span> <span class="code-keyword">int</span> HRESULT;
<span class="code-preprocessor">#define</span> NULLPTR 0
<span class="code-comment"><span class="code-keyword">struct</span> contact
{
<span class="code-keyword">char</span> sname[15];
<span class="code-keyword">char</span> fname[15];
<span class="code-keyword">char</span> phone[15];
<span class="code-keyword">char</span> company[15];
<span class="code-keyword">char</span> email[15];
<span class="code-keyword">struct</span> contact* prev;
<span class="code-keyword">struct</span> contact* next;
};
<span class="code-comment"><span class="code-keyword">enum</span>
{
S_OK = 0,
E_FAIL = -1,
E_POINTER = -2,
};
<span class="code-comment"><span class="code-comment">
<span class="code-comment"><span class="code-keyword">typedef</span> <span class="code-keyword">void</span> (*FNWALK)(<span class="code-keyword">struct</span> contact* node);
<span class="code-keyword">void</span> DeletePtrList(<span class="code-keyword">struct</span> contact* ptrList);
HRESULT ReadFile(<span class="code-keyword">const</span> <span class="code-keyword">char</span>* FName,<span class="code-keyword">struct</span> contact** ptrList);
<span class="code-keyword">void</span> WalkChain(<span class="code-keyword">struct</span> contact* ptrList,FNWALK fnwalk);
<span class="code-comment"><span class="code-comment"><span class="code-keyword">void</span> trace_node(<span class="code-keyword">struct</span> contact* node)
{
<span class="code-keyword">if</span>(node)
{
printf(<span class="code-string">"--- node ---\n"</span>);
printf(<span class="code-string">"sname : %s\n"</span>,node->sname );
printf(<span class="code-string">"fname : %s\n"</span>,node->fname );
printf(<span class="code-string">"phone : %s\n"</span>,node->phone );
printf(<span class="code-string">"company: %s\n"</span>,node->company);
printf(<span class="code-string">"email : %s\n"</span>,node->email );
}
}
<span class="code-comment"><span class="code-keyword">int</span> main(<span class="code-keyword">int</span> argc, <span class="code-keyword">char</span>* argv[])
{
<span class="code-comment"> <span class="code-keyword">if</span>(1<argc)
{
<span class="code-keyword">struct</span> contact* ptrList = 0;
<span class="code-comment"> <span class="code-keyword">if</span>(S_OK==ReadFile(argv[1],&ptrList))
{
printf(<span class="code-string">"file loaded: %s\n"</span>,argv[1]);
<span class="code-comment"> <span class="code-keyword">if</span>(2<argc)
{
<span class="code-comment"> <span class="code-keyword">if</span>(S_OK==ReadFile(argv[2],&ptrList))
{
printf(<span class="code-string">"file loaded: %s\n"</span>,argv[2]);
}
}
<span class="code-comment"> WalkChain(ptrList,trace_node);
<span class="code-comment"> DeletePtrList(ptrList);
<span class="code-comment"> _fget<span class="code-keyword">char</span>();
}
}
<span class="code-keyword">return</span> 0;
}
<span class="code-comment">HRESULT ReadLine(FILE* file,<span class="code-keyword">char</span>* line,<span class="code-keyword">const</span> <span class="code-keyword">unsigned</span> <span class="code-keyword">int</span> size)
{
<span class="code-keyword">if</span>(feof(file)) <span class="code-keyword">return</span> E_FAIL;
<span class="code-keyword">return</span> NULL==fgets(line, size, file) ? E_FAIL:S_OK;
}
<span class="code-comment">HRESULT ReadFile(<span class="code-keyword">const</span> <span class="code-keyword">char</span>* FName,<span class="code-keyword">struct</span> contact** ptrList)
{
FILE* fptr;
<span class="code-keyword">struct</span> contact* head;
<span class="code-keyword">struct</span> contact* newContact;
<span class="code-keyword">char</span>* sname, *fname, *phone,*company, *email;
<span class="code-keyword">char</span> line[60];
fptr = fopen(FName,<span class="code-string">"r"</span>);
<span class="code-keyword">if</span>(NULL==fptr)
{
printf(<span class="code-string">"\nCant open file!"</span>);
<span class="code-keyword">return</span> E_FAIL;
}
<span class="code-keyword">if</span>(!ptrList) <span class="code-keyword">return</span> E_POINTER; <span class="code-comment">
<span class="code-comment"> <span class="code-keyword">for</span>(head=*ptrList;head&&head->next;head=head->next);
<span class="code-comment"> <span class="code-keyword">while</span>(S_OK==ReadLine(fptr,line,<span class="code-keyword">sizeof</span>(line)/<span class="code-keyword">sizeof</span>(line[0])-2))
{
sname = strtok(line,<span class="code-string">","</span>);
fname = strtok(NULL,<span class="code-string">","</span>);
phone = strtok(NULL,<span class="code-string">","</span>);
company = strtok(NULL,<span class="code-string">","</span>);
email = strtok(NULL,<span class="code-string">","</span>);
<span class="code-comment"> newContact = (<span class="code-keyword">struct</span> contact *)malloc(<span class="code-keyword">sizeof</span>(<span class="code-keyword">struct</span> contact));
<span class="code-keyword">if</span>(!newContact) <span class="code-keyword">break</span>; <span class="code-comment"> <span class="code-comment"> newContact->prev = head;
newContact->next = NULLPTR;
<span class="code-comment"> <span class="code-comment"> <span class="code-comment"> strcpy(newContact->sname,sname);
strcpy(newContact->fname,fname);
strcpy(newContact->phone,phone);
strcpy(newContact->company,company);
strcpy(newContact->email,email);
<span class="code-comment"> <span class="code-keyword">if</span>(head) head->next = newContact;
<span class="code-comment"> head = newContact;
<span class="code-comment"> <span class="code-keyword">if</span>(NULLPTR==*ptrList) *ptrList = head;
}
fclose(fptr);
<span class="code-keyword">return</span> head ? S_OK : E_FAIL <span class="code-comment"></span>;
}
<span class="code-comment"><span class="code-keyword">void</span> DeletePtrList(<span class="code-keyword">struct</span> contact* ptrList)
{
<span class="code-keyword">struct</span> contact* head;
<span class="code-keyword">struct</span> contact* next;
<span class="code-keyword">for</span>(head = ptrList;head;head=next)
{
next = head->next;
free(head);
}
}
<span class="code-comment"><span class="code-keyword">void</span> WalkChain(<span class="code-keyword">struct</span> contact* ptrList,FNWALK fnwalk)
{
<span class="code-keyword">struct</span> contact* head;
<span class="code-keyword">for</span>(head = ptrList;head;head=head->next)
{
fnwalk(head);
}
}
Regards.