寫在前面的是,對於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...