صفوں کے بعد ، دوسرا سب سے زیادہ مقبول ڈیٹا ڈھانچہ لنکڈ لسٹ ہے۔ ایک منسلک فہرست ایک لکیری ڈیٹا ڈھانچہ ہے جو نوڈس کی زنجیر سے بنی ہے جس میں ہر نوڈ میں ایک قدر اور سلسلہ میں اگلے نوڈ کی طرف ایک پوائنٹر ہوتا ہے۔ اس مضمون میں ، آئیے دیکھتے ہیں کہ سی میں منسلک فہرست کو کیسے نافذ کیا جائے۔
سی میں لنکڈ لسٹ کیا ہے؟
لنکڈ لسٹ ایک لکیری ڈیٹا ڈھانچہ ہے۔ ہر منسلک فہرست کے دو حصے ہوتے ہیں ، ڈیٹا سیکشن اور ایڈریس سیکشن جس میں فہرست میں اگلے عنصر کا پتہ ہوتا ہے ، جسے نوڈ کہا جاتا ہے۔
منسلک فہرست کی سائز طے نہیں ہے ، اور اعداد و شمار کی فہرست کو فہرست میں کسی بھی جگہ شامل کیا جاسکتا ہے۔ نقصان یہ ہے کہ نوڈ تک جانے کے ل we ، ہمیں پہلے نوڈ سے لے کر نوڈ تک جانے کی ضرورت ہے۔ لنکڈ لسٹ ایک صف کی طرح ہے لیکن سرنی کے برعکس ، یہ ترتیب میں میموری میں محفوظ نہیں ہوتی ہے۔
ایک منسلک فہرست کی مقبول ترین اقسام ہیں:
لنکڈ لسٹ کی مثال
شکل: [ڈیٹا ، پتہ]
سربراہ -> [3،1000] -> [43،1001] -> [21،1002]
مثال کے طور پر ، نمبر 43 مقام 1000 پر موجود ہے اور پتا پچھلے نوڈ میں موجود ہے۔ اس طرح ایک منسلک فہرست کی نمائندگی کی جاتی ہے۔
بنیادی لنکڈ فہرست افعال
سی میں منسلک فہرست پر ایک سے زیادہ افعال نافذ کیے جاسکتے ہیں آئیے ایک مثال کے پروگرام کی مدد سے ان کو سمجھنے کی کوشش کریں۔پہلے ، ہم ایک فہرست بناتے ہیں ، اسے ظاہر کرتے ہیں ، کسی بھی مقام پر داخل کرتے ہیں ، کسی مقام کو حذف کرتے ہیں۔ مندرجہ ذیل کوڈ آپ کو دکھائے گا کہ کس طرح فہرست میں کاروائیاں انجام دیں۔
# شامل کریں # شامل کریں باطل تخلیق () باطل ڈسپلے () باطل داخل کریں_بیگین () باطل insert_end () باطل insert_pos () باطل حذف_بیگین () باطل ڈیلیٹ_ینڈ () باطل ڈیلیٹ_پاس () سٹرکٹ نوڈ {INT انفارمیشن سٹرڈ نوڈ * اگلی} سٹرک نوڈ * اسٹارٹ = NULL INT main () {INT انتخاب جبکہ (1) {printf ('n MENU n') printf ('n 1.Create n') printf ('n 2.Display n') printf ('n 3. داخل کریں شروعات این ') پرنٹف (' این 4. آخر این میں داخل کریں ') پرنٹف (' این 5. مخصوص پوزیشن پر داخل کریں این ') پرنٹف (' این 6. ابتداء این سے حذف کریں) 'پرنٹف (' این 7. ڈیلیٹ آخر سے این)) پرنٹف ('n 8. مخصوص پوزیشن سے حذف کریں این') پرنٹف ('n 9.Exit n') پرنٹف ('n ----------------- --------------------- n ') پرنٹف (' اپنی پسند درج کریں: t ') اسکینف ('٪ d '، اور انتخاب) سوئچ (انتخاب) {کیس 1 : بنائیں () بریک کیس 2: ڈسپلے () بریک کیس 3: insert_begin () بریک کیس 4: insert_end () بریک کیس 5: insert_pos () بریک کیس 6: ڈیلیٹ_بگین () بریک کیس 7: ڈیلیٹ_ینڈ () بریک کیس 8: ڈیلیٹ_پوس () بریک کیس 9: ایگزٹ (0) بریک ڈیفالٹ: پرنٹف ('این غلط چوائس: این') بریک}} ریٹرن 0} voi ڈی بنائیں () {n {نوڈ * ٹمپ ، * پی ٹی آر ٹیمپ = (سٹرڈ نوڈ *) مالک (سائز (سٹرک نوڈ)) اگر (عارضی == NULL) {پرنٹف ('میموری آف اسپیس: این') ایگزٹ (0) } پرنٹف ('node کے لئے اعداد و شمار کی قیمت داخل کریں: t') اسکینف ('٪ d'، & temp-> معلومات) temp-> اگلا = NULL اگر (start == NULL) {start = temp} else {ptr = start جبکہ (ptr-> اگلا! = NULL) {ptr = ptr-> اگلا} ptr-> اگلا = عارضی} oid باطل ڈسپلے () {سٹرکٹ نوڈ * ptr اگر (شروع == NULL) {پرنٹف ('n فہرست خالی ہے: n ') واپسی} دوسری {ptr = شروع کریں printf (' n فہرست عناصر یہ ہیں: n ') جبکہ (ptr! = NULL) {printf ('٪ dt '، ptr-> معلومات) ptr = ptr-> اگلے}} باطل داخل کریں_بیگین () {سٹرکٹ نوڈ * ٹیمپ ٹیم = (سٹرڈ نوڈ *) مالکوک (سائز آف (سٹرک نوڈ)) اگر (عارضی == NULL) {پرنٹف ('میموری اسپیس کا نٹ: این') لوٹ آئے} پرنٹف ('n داخل کریں نوڈ کے لئے ڈیٹا ویلیو: t ') اسکینف ('٪ d '، & temp-> معلومات) temp-> اگلا = NULL اگر (start == NULL) {start = temp temp else} temp-> next = start start = temp }} باطل insert_end () {ٹرکٹ نوڈ * ٹمپ ، * پی ٹی آر ٹیم = (سٹرڈ نوڈ *) مالکو (سائز (سٹرک نوڈ)) اگر (عارضی == NULL) {پرنٹف ('میموری آف اسپیس: n') واپس آئے} پی rintf ('node: t') کے لئے اعداد و شمار کی قیمت داخل کریں اسکینف ('٪ d'، & temp-> معلومات) temp-> اگلا = NULL اگر (start == NULL) {start = temp} else {ptr = start جبکہ (ptr-> اگلا! = NULL) {ptr = ptr-> اگلا} ptr-> اگلا = عارضی} oid باطل insert_pos () {سٹرکٹ نوڈ * پی ٹی آر ، * عارضی انٹ ، میں pos عارضی = (سٹرڈ نوڈ *) malloc ( سائزف (سٹرک نوڈ)) اگر (عارضی == NULL) {پرنٹف ('یادداشت کی جگہ سے باہر: n') واپس return پرنٹف ('n نئے نوڈ ڈالنے کے لئے پوزیشن میں داخل ہوں: t') سکینف ('٪ d' ، اور پوز) پرنٹف ('node کے اعداد و شمار کی قیمت درج کریں: t') اسکینف ('٪ d'، & temp-> معلومات) temp-> اگلا = NULL اگر (pos == 0) {temp-> اگلا = شروع کریں = temp} else} for (i = 0، ptr = startinext if (ptr == NULL) {printf ('n پوزیشن نہیں ملی: [نگہداشت کے ساتھ ہینڈل کریں] n') واپسی}} temp-> next = ptr-> اگلے ptr -> اگلا = عارضی} oid باطل حذف_بیگین () {سٹرکٹ نوڈ * پی ٹی آر اگر (ptr == NULL) {printf ('nList خالی ہے: n') واپسی} دوسری {ptr = start start = start-> اگلا پرنٹف (' n حذف شدہ عنصر یہ ہے:٪ dt '، ptr-> info) free (ptr) oid oid videte delete_end () {Stct node * temp، * ptr if (start == NULL) {printf (' nList is खाली ہے: ') (0) } دوسری صورت میں اگر (start-> اگلا == NULL) {ptr = start start = NULL printf ('n حذف شدہ عنصر ہے:٪ dt'، ptr-> معلومات) مفت (ptr)} اور {ptr = شروع کرتے ہوئے (ptr- > اگلا! = NULL) {temp = ptr ptr = ptr-> next} temp-> next = NULL printf ('n حذف شدہ عنصر ہے:٪ dt'، ptr-> معلومات) مفت (ptr) oid oid باطل ڈیلیٹ_پوز () i انٹ آئی ، پوس سٹرکٹ نوڈ * ٹی ایم پی ، * پی ٹی آر اگر (اسٹارٹ == NULL) {پرنٹف ('n فہرست خالی ہے: n') ایگزٹ (0)} دوسری {پرنٹف ('n کو خارج کرنے کے لئے نوڈ کی پوزیشن میں داخل ہوں : t ') اسکینف ('٪ d '، & پوز) اگر (pos == 0) tr ptr = start start = start-> next printf (' n حذف شدہ عنصر ہے:٪ dt '، ptr-> معلومات) مفت (ptr )} else {ptr = start for (i = 0inext if (ptr == NULL) {printf ('n پوزیشن نہیں ملی: n') واپسی}} temp-> next = ptr-> next printf ('n حذف شدہ عنصر یہ ہے: ٪ dt '، ptr-> معلومات) مفت (ptr)}}}
اس کوڈ کا پہلا حصہ ایک ڈھانچہ تشکیل دے رہا ہے۔ ایک منسلک فہرست ڈھانچہ تشکیل دیا گیا ہے تاکہ یہ اعداد و شمار اور پتے کو اپنی ضرورت کے مطابق رکھ سکے۔ یہ کامپلر کو یہ اندازہ دینے کے لئے کیا گیا ہے کہ نوڈ کیسا ہونا چاہئے۔
سیلینیم ویب ڈرایور میں ہائبرڈ فریم ورک
سٹرک نوڈ {INT انفارمیشن سٹرک نوڈ * اگلا}
اسٹرکچر میں ، ہمارے پاس ڈیٹا متغیر ہوتا ہے جسے ڈیٹا رکھنے کے لئے انفارمیشن کہا جاتا ہے اور پتے کی نشاندہی کرنے کے لئے ایک پوائنٹر متغیر ہوتا ہے۔ متعدد کاروائیاں ہیں جو منسلک فہرست میں کی جاسکتی ہیں ، جیسے:
- بنانا()
- ڈسپلے ()
- insert_begin ()
- insert_end ()
- ] insert_pos ()
- حذف کریں_بیگین ()
- حذف کریں_
- حذف کریں_پوز ()
ان افعال کو مینو سے چلنے والے اہم فنکشن کے ذریعہ کہا جاتا ہے۔ مرکزی تقریب میں ، ہم صارف سے ان پٹ لیتے ہیں اس بنیاد پر کہ صارف پروگرام میں کیا کرنا چاہتا ہے۔ ان پٹ پھر سوئچ کیس میں بھیجا جاتا ہے اور صارف کے ان پٹ پر مبنی ہوتا ہے۔
کیا ان پٹ فراہم کیا جاتا ہے اس کی بنیاد پر فنکشن بلایا جائے گا۔ اگلا ، ہمارے پاس مختلف افعال ہیں جن کو حل کرنے کی ضرورت ہے۔ آئیے ان میں سے ہر ایک پر ایک نظر ڈالیں۔
فنکشن بنائیں
پہلے ، منسلک فہرست بنانے کے لئے تخلیق کا فنکشن موجود ہے۔ لنکڈ لسٹ بننے کا بنیادی طریقہ یہ ہے۔ ہمیں کوڈ دیکھنے کی اجازت دیتا ہے۔
کالعدم بنائیں () {{ٹرک نوڈ * ٹی ایم پی ، * پی ٹی آر پرنٹف ('n نوڈ کے لئے ڈیٹا ویلیو میں داخل ہوں: t') اسکینف ('٪ d'، & temp-> معلومات) temp-> اگلا = NULL if (start == NULL) ) {start = temp} else} ptr = start while (ptr-> next! = NULL) {ptr = ptr-> next} ptr-> next = temp}
آؤٹ پٹ
پہلے ، دو پوائنٹرز قسم کے بنائے گئے ہیں نوڈ ، ptr ، اور عارضی . ہم صارف سے منسلک فہرست میں شامل کرنے کی ضرورت کی قیمت لے لیتے ہیں اور اسے عارضی متغیر کے معلومات حصے میں اسٹور کرتے ہیں اور اگلے ٹمپ کو تفویض کرتے ہیں جو پتہ کا حصہ ہے۔ فہرست کے آغاز پر ایک شروعاتی پوائنٹر موجود ہے۔ پھر ہم فہرست کے آغاز کے لئے جانچ پڑتال کرتے ہیں۔ اگر فہرست کا آغاز کالعدم ہے تو ہم شروعاتی پوائنٹر کو وقتی نشان لگا دیتے ہیں۔ دوسری صورت میں ، ہم آخری نقطہ کی طرف جاتے ہیں جہاں ڈیٹا شامل کیا گیا ہے۔
اس کے لئے ، ہم ptr شروع قیمت اور اس سے آگے تک تفویض کرتے ہیں ptr-> next = null . اس کے بعد ہم تفویض کرتے ہیں ptr-> اگلا عارضی پتہ اسی طرح سے ، شروع میں داخل کرنے ، آخر میں داخل کرنے اور کسی مخصوص جگہ پر داخل کرنے کے لئے ایک کوڈ دیا گیا ہے۔
فنکشن ڈسپلے کریں
ڈسپلے فنکشن کیلئے کوڈ یہ ہے۔
باطل ڈسپلے () {nٹرک نوڈ * پی ٹی آر اگر (start == NULL) {پرنٹف ('n فہرست خالی ہے: n') واپسی} دوسری {ptr = start printf ('n فہرست عناصر ہیں: n') جبکہ (ptr! = NULL) {پرنٹف ('٪ dt'، ptr-> معلومات) ptr = ptr-> اگلا}}}
آؤٹ پٹ
ڈسپلے فنکشن میں ، ہم پہلے جانچ پڑتال کرتے ہیں کہ آیا فہرست خالی ہے یا نہیں اور اگر خالی ہے تو واپس آجائیں گے۔ اگلے حصے میں ، ہم ptr پر شروعاتی قیمت تفویض کرتے ہیں۔ اس کے بعد ہم ایک لوپ چلاتے ہیں یہاں تک کہ پی ٹی آر ناخن ہوجاتا ہے اور ہر نوڈ کے لئے ڈیٹا عنصر کو پرنٹ کرتے ہیں ، جب تک کہ پی ٹی آر کال ختم نہیں ہوتا ہے ، جو فہرست کے اختتام کو واضح کرتا ہے۔
system.exit (0) جاوا میں کیا کرتا ہے؟
فنکشن کو حذف کریں
منسلک فہرست سے نوڈ کو حذف کرنے کے لئے یہاں کوڈ کا ٹکڑا ہے۔
باطل ڈیلیٹ_پوس () {انٹری آئی ، پوس سٹرک نوڈ * ٹی ایم پی ، * پی ٹی آر اگر (اسٹارٹ == NULL) {پرنٹف ('n فہرست خالی ہے: n') ایگزٹ (0)} دوسری {پرنٹف ('n کی پوزیشن میں داخل ہوں حذف ہونے والا نوڈ: t ') اسکینف ('٪ d '، & پوز) اگر (pos == 0) tr ptr = start start = start-> next printf (' n حذف شدہ عنصر ہے:٪ dt '، ptr-> معلومات ) free (ptr)} else {ptr = start for (i = 0inext if (ptr == NULL) {printf ('n پوزیشن نہیں ملی: n') واپسی}} temp-> next = ptr-> next printf ('n the حذف شدہ عنصر یہ ہے:٪ dt '، ptr-> معلومات) مفت (ptr)}}}
آؤٹ پٹ
حذف کرنے کے عمل میں ، یہ پہلے چیک کرتا ہے کہ آیا فہرست خالی ہے ، اگر ہاں تو وہ موجود ہے۔ اگر یہ خالی نہیں ہے تو وہ صارف سے پوزیشن کو حذف کرنے کے لئے کہتی ہے۔ ایک بار جب صارف اس پوزیشن میں داخل ہوتا ہے ، تو یہ چیک کرتا ہے کہ آیا یہ پہلی پوزیشن ہے ، اگر ہاں تو یہ تفویض کرتا ہے ptr شروعاتی پوائنٹر کو اگلے مقام پر منتقل کرنے اور منتقل کرنے کے لئے اور ptr کو حذف کرتا ہے۔ اگر پوزیشن صفر نہیں ہے ، پھر یہ 0 سے صارف کے داخل کردہ اور اس میں ذخیرہ کرنے والے پوز تک 0 سے لے کر چلتا ہے POS متغیر وہاں داخل کرنے کی پوزیشن موجود نہیں ہے تو فیصلہ کرنے کے لئے ایک بیان ہے. اگر ptr نلو کے برابر ہے ، پھر یہ موجود نہیں ہے۔
ہم ptr عارضی طور پر تفویض کریں لوپ میں ، اور ptr پھر اگلے حصے پر چلا جائے۔ اس کے بعد جب پوزیشن مل جاتی ہے۔ ہم قدر کی قیمت رکھنے کے لئے عارضی متغیر بناتے ہیں ptr-> اگلا اس طرح ptr اچٹیں. پھر پی ٹی آر کو ڈیلیٹ کردیا جاتا ہے۔ اسی طرح ، یہ پہلے اور آخری عنصر کو حذف کرنے کے لئے بھی کیا جاسکتا ہے۔
ڈبل لنکڈ لسٹ
اسے دوگنا سے منسلک لسٹ کہا جاتا ہے کیونکہ وہاں دو ہیں اشارے ، اگلے نوڈ کی طرف ایک نقطہ اور پچھلے نوڈ کی طرف دوسرے پوائنٹس۔ آپریشن دگنی طور پر منسلک میں انجام دیئے گئے ایک ہی لنک سے منسلک فہرست کی طرح ہیں۔ بنیادی کارروائیوں کا کوڈ یہ ہے۔
# شامل کریں # شامل کریں نوڈ ٹائپفف ڈھانچہ نوڈ * PtrToNode typodef PtrToNode فہرست typedaf PtrToNode پوزیشن سٹرک نوڈ {انٹ ای پوزیشن پچھلی پوزیشن اگلی} باطل داخل کریں (INT ، لسٹ ایل ، پوزیشن p) {پوزیشن TmpCell TmpCell = (سٹرکٹ نوڈ *) میل (سائز آف (سٹرکٹ نوڈ)) اگر (TmpCell == NULL) پرنٹف ('اسپیسن سے باہر میموری') اور {TmpCell-> e = x TmpCell-> پچھلے = p TmpCell-> اگلا = p-> اگلا p-> اگلا = TmpCell} oid باطل حذف کریں (int x، list l) osition مقام p، p1، p2 p = تلاش کریں (x، l) اگر (p! = NULL) {p1 = p -> پچھلے p2 = p -> اگلا p1 - > اگلا = p -> اگلا اگر (p2! = NULL) // اگر نوڈ آخری نوڈ نہیں ہے p2 -> پچھلے = p -> پچھلا + پرنٹف ('عنصر موجود نہیں !!! n')} باطل ڈسپلے (لسٹ ایل) {پرنٹف ('فہرست عنصر یہ ہیں ::') پوزیشن p = l-> اگلے وقت میں (p! = NULL) {printf ('٪ d ->'، p-> e) p = p- > اگلا}} انٹ مین (({انٹ ایکس) ، پوز ، سی ایچ ، آئی لسٹ ایل ، ایل 1 ایل = (اسٹرکٹ نوڈ *) ماللوک (سائز (سٹرک نوڈ)) l-> پچھلا = NULL l-> اگلا = NULL فہرست صفحہ = l پرنٹف ('دبئی کے ذریعہ ایل کی فہرست کو عملی شکل دینے کی فہرست IST ADTnn ') do {printf (' nn1) کریں۔ بنائیں 2. حذف کریں 3. ڈسپلے کریں 4. کوئٹ انسٹار کریں :: ') اسکینف ('٪ d '، & ch) سوئچ (ch) {کیس 1: p = l پرنٹف (' عنصر داخل کرنے کے لئے درج کریں :: ') سکینف ('٪ d' ، اور x) پرنٹف ('عنصر کی پوزیشن درج کریں ::') اسکینف ('٪ d' ، اور پوز) کیلئے (i = 1 iاگلا break داخل کریں (x، l، p) بریک کیس 2: p = l پرنٹف ('حذف ہونے والا عنصر درج کریں ::') اسکینف ('٪ d'، & x) حذف کریں (x، p) بریک کیس 3: ڈسپلے (l) توڑ}} جبکہ (CH<4) }
آؤٹ پٹ
پوسٹ گریجویٹ ڈپلوما بمقابلہ ماسٹرز
لہذا ، جیسا کہ آپ دیکھ سکتے ہیں کہ آپریشنز کا تصور بالکل آسان ہے۔ دوگنی سے جڑی ہوئی فہرست میں وہی کاروائیاں ہیں جو سی پروگرامنگ زبان میں اکیلا منسلک فہرست کی ہیں۔ فرق صرف اتنا ہے کہ ایک اور پتے کی متغیر بھی ہے جو دہری سے منسلک فہرست میں فہرست کو بہتر انداز میں آگے بڑھا رہی ہے۔
مجھے امید ہے کہ آپ نے سی میں تنہا اور دوگنا لنک لسٹ پر بنیادی کاروائیاں کرنے کا طریقہ سمجھا ہوگا۔
اگر آپ جاوا میں لنکڈ لسٹ سیکھنا چاہتے ہیں تو ، یہاں ہے .
اگر آپ کو کوئی سوالات آتے ہیں تو ، 'سی لنکڈ لسٹ ان سی' کے تبصرے کے سیکشن میں بلا جھجھک اپنے سوالات پوچھیں اور ہماری ٹیم جواب دینے میں خوش ہوگی۔