delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2001/03/14/20:41:13

From: "Graham Reeds" <grahamr AT ntlworld DOT com>
Newsgroups: comp.os.msdos.djgpp
Subject: Problem with allocating memory for linked lists.
Lines: 60
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 5.50.4133.2400
X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400
Message-ID: <AKUr6.3065$y47.695473@news2-win.server.ntlworld.com>
Date: Thu, 15 Mar 2001 01:11:03 -0000
NNTP-Posting-Host: 62.254.80.63
X-Complaints-To: abuse AT ntlworld DOT com
X-Trace: news2-win.server.ntlworld.com 984619040 62.254.80.63 (Thu, 15 Mar 2001 01:17:20 GMT)
NNTP-Posting-Date: Thu, 15 Mar 2001 01:17:20 GMT
Organization: ntlworld News Service
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp
Reply-To: djgpp AT delorie DOT com

Okay.  I have a problem involving memory and linkedlists.  I've been hacking
at this for the past few weeks off and on, and keep getting the same
problem:

I'm coding a MergeSort on linkedlists.  The linkedlist starts off as a
sentinal and two pointers are initially set to point to itself.  All records
after that are tagged onto the end, thus keeping list maintenance simple.
(Yes I know I could use STL and yes I know I could use C++ to create
templates which would be a lot more efficient.)

In the Merge Sort I'll create a second list and after each comparison remove
the smaller record from one list and drop it straight into a secondary
temporary list thus making it more sorted.  Then when all the records are
moved, I'll switch pointers to the two lists and so on and so forth until
the lists are merged.

That is the plan.  However it doesn't work like that.  The function is
called via:
void  mergesort(linkedlist_t *linkedlist)

linkedlist_t is simply:

typedef struct linkedlist_s
  {
  record_t    *sentinal;
  }linkedlist_t;

where record_t is a collection of data with a sortkey (a float in this case)
and two pointers called *next and *prev.

The problem is I create the second linked list via a command called
createlinkedlist() which returns a pointer to memory it allocates and sets
the pointers to point at itself (awaiting records to be added).  The
linkedlist that is passed is created elsewhere in the code.

I then have two other pointers pointing to the linkedlists ('linkedlist',
and 'templist') called 'currlist' for the current list from which the
records are being removed and 'targetlist' which the records are being moved
to.  If I use createlinkedlist() to allocate the memory and initilise
'templist', for some inexplicable reason the following line: currlist =
linkedlist; fails.  Neither moving before the code or any point after will
make it work.  It just points to some (seemingly) random bit of memory
instead (long random numbers instead of the values that are supposed to be
stored).  However if I leave the line out it works fine (the numbers are the
correct numbers), but the moving of the records fails because there is
nowhere for them to be moved to (I know it doesn't actually 'move' but it
best describes them disappearing)..  I could post more code if required.

Also the initialisation code works since I have created insertion sort,
shell sort and even the god-awful bubblesort, and they all work 100% fine.
This has been dragging on for far too long now and is getting really
annoying.

--

Stay Lucky, Graham "Mournblade" Reeds,
ICQ: 30514803
http://homepage.dtn.ntl.com/grahamr


- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019