C語言實現鍊錶逆序

2021-08-15 15:46:16 字數 3891 閱讀 8715

寫在前面的是,對於c語言鍊錶逆序的看法:第一感覺是,我擦,這玩意什麼時候能用到啊。。。。。。。殘念。。。不過在面試中是會經常用到的,如果有需要的小夥伴,可以看看我總結到的一些心得體會吧。

嗯,在做鍊錶逆序的時候先做乙個簡單的鍊錶出來:

#include#include

typedef int item;//定義資料項型別 typedef struct node * pnode;//定義節點指標 //節點的定義 typedef struct node node,* slist;

/* int sl_creat(slist *p_list,int size) 引數 p_list:指向乙個鍊錶指標,此處傳入表頭位址 size:要建立的鍊錶分配的資料元素空間個數,不包含頭節點 返回值 若成功返回1,否則返回0。 功能 該函式的功能是建立乙個大小為size的鍊錶並把鍊錶的頭指標賦給p_lsit所指的鍊錶指標。

*/ int sl_creat(slist *p_list,int size)  return 1; } /* int sl_insert(slist list,int pos,item item) 引數 list:要插入資料的單鏈表 int:指定要插入元素的位置,從1開始計數 item:要插入的資料項 返回值 若成功返回1,否則返回-1。 功能 該函式的功能是在鍊錶list的pos位置插入新元素,其值為item。

*/ int sl_insert(slist list,int pos,item item)  if(p==null || i > pos-1)   return -1;  q = (node *)malloc(sizeof(node));//未插入節點分配記憶體  if(q!=null)//若記憶體分配成功,將節點插入指定位置    else   } /* int sl_getitem(slist list,int pos,item *p_item) 引數 list:要獲取資料項所在的單鏈表 int:指定要獲取元素在單鏈表中的位置 p_item:指向要接收資料項的變數 返回值 若成功返回1,否則返回-1。 功能 該函式的功能是獲取在鍊錶list的pos位置的元素的資料項,其值賦給p_item所指的變數。

*/ int sl_getitem(slist list,int pos,item *p_item)  if((p==null)||(i>pos))    *p_item = p->item;  return 1; } /* int sl_delete(slist list,int pos,item * p_item) 引數 list:要刪除元素所在的單鏈表 int:指定要刪除元素在單鏈表中的位置 p_item:指向接收刪除元素的資料項的變數 返回值 若成功返回1,否則返回-1。 功能 該函式的功能是刪除在鍊錶list的pos位置的元素,其值賦給p_item所指的變數。

*/ int sl_delete(slist list,int pos,item * p_item)  if(p->next==null || i > pos-1)   return -1;  q = p->next;  p->next = q->next;  if(p_item != null)   *p_item = q->item;  free(q);  return 1; } /* int sl_setitem(slist list,int pos,item item) 引數 list:要設定元素所在的單鏈表 int:指定要設定元素在單鏈表中的位置 p_item:要設定元素的資料項的值 返回值 若成功返回1,否則返回-1。 功能 該函式的功能是將鍊錶list的pos位置的元素的資料項設定為item。

*/ int sl_setitem(slist list,int pos,item item)  if(p==null || i > pos)   return -1;  p->item = item;  return 1;

} /* int sl_find(slist list,int *pos,item item) 引數 list:要查詢元素所在的單鏈表 int:指向要儲存的查得的元素的位置的變數 p_item:要查詢元素的資料項的值 返回值 若成功返回1,否則返回-1。 功能 該函式的功能是在鍊錶list中查詢資料項為item的元素,將其位置值賦給pos所指的變數。

*/ int sl_find(slist list,int *pos,item item)  }  return -1;  } /* int sl_empty(slist list) 引數 list:要判斷的單鏈表 返回值 若為空則返回1,否則返回 0。 功能 該函式的功能是判斷鍊錶list是否為空表。

*/ int sl_empty(slist list) /* int sl_size(slist list) 引數 list:要查詢的單鏈表 返回值 返回包含節點的個數。 功能 該函式的功能是返回鍊錶list中節點的個數,包含頭節點。

*/ int sl_size(slist list)  return i; } /* int sl_clear(slist *p_list) 引數 p_list:指向要清除的單鏈表 返回值 成功返回值為1。 功能 該函式的功能是清除鍊錶的所有節點,包含頭節點。

*/ int sl_clear(slist *p_list)  *p_list = null;//將所指的鍊錶指標設為null    return 1; }

這個玩意就是鍊錶了,那麼主要問題來了,在做逆序的時候,首先要知道什麼逆序~  這不是簡單的文字遊戲啊,舉個例子:如果只是逆序輸出的話,那麼完全沒有必要對鍊錶同學進行什麼慘無人道的操作,簡單的做乙個遞迴實現棧的思想就可以實現這個事情了,或者是直接做乙個棧,把所有的元素放進去,然後再進行乙個逆序輸出。

如果是對鍊錶進行逆序的話,這個東西還得情況,是把指標逆序,還是把內容逆序?如果我們不說面試中遇到得問題得話,就企業中使用到得鍊錶,一般都是節點在乙個結構體中包含著,所以如果是排內容,就好像是沒什麼用,所以我這裡還是講一下怎麼排指標吧。

先放乙個簡答版本得上來:

#include #include typedef struct taglistnodelistnode, *list;

void printlist(list head);

list reverselist(list head);

int main()

printlist(head); /*輸出原始鍊錶*/

head = reverselist(head); /*逆序鍊錶*/

printlist(head); /*輸出逆序後的鍊錶*/

return 0;

}list reverselist(list head)

listnode *t = null,

*p = head->next,

*q = head->next->next;

while(q != null)

/*此時q指向原始鍊錶最後乙個元素,也是逆轉後的鍊錶的表頭元素*/

head->next->next = null; /*設定鍊錶尾*/

head->next = p; /*調整煉表頭*/

return head;

}void printlist(list head)

printf("/n");

}

在這個版本中,實現逆序得方法就是使用三個輔助指標去對鍊錶進行操作,這種方法就是速度也比較好,當然,如果這種方法不好理解得話,你也可以自己做乙個棧,然後把所有得節點都放進去,pop乙個連乙個,這樣也可以,然後其實可以用遞迴來實現棧得思想,可以讓你得**寫得更少一點,我這裡就不寫了,遞迴還是少用比較好。。。。

鍊錶的C語言實現

編輯 c巨集例項 以下 摘自linux核心2.6.21.5原始碼 部分 展示了鍊錶的另一種實現思路,未採用ansi c標準,採用gnu c標準,遵從gpl版權許可。struct list head define list head init name define list head name st...

雙向鍊錶C語言實現

ifndef stdlist h define stdlist h typedef struct tagstdnode stdnode,lpstdnode typedef struct tagstdlist stdlist,lpstdlist 鍊錶資料結構 struct tagstdnode 鍊錶節...

線性鍊錶 C語言實現

include include define error 0 define ok 1 define equal 1 define overflow 1 define list init size 100 define listincrement 10 struct stustu 50 typedef...