單鏈表操作 頭結點方式

2021-06-07 01:21:55 字數 3227 閱讀 6047

/*
單鏈表: 訪問時,只能通過表頭遍歷進行訪問,遍歷結束的條件是最後乙個節點的為null。單鏈表中可以分為資料域和指標域。資料域為使用者儲存資料的變數。指標域則指向下乙個節點。 一般單鏈表操作可以分為頭節結方式和頭指標方式(struct node *root=null)方式。 由於單鏈表訪問節點只有一條路徑,因此再進行有序追加資料、刪除資料和查詢中間節點時,需要用到快慢指標。
*/
#include #include #define nr(x)  sizeof(x)/sizeof(x[0])

typedef int datatype;

typedef struct node linklist;

/*頭部插入法*/

/*尾部插入法*/

/*刪除節點*/

void del_node(struct node *head,int key);

/*列印單鏈表*/

void dispaly_list(struct node *head);

/*鍊錶倒置*/

void invert_list(struct node *head);

/*查詢中間節點*/

struct node *find_midlist(struct node *head);

/*鍊錶順序插入*/

void insert_sortlist(struct node *head,datatype data);

int main(void);

datatype num=;

int i;

/*頭部插入*/

for(i=0;idata);

else

printf("this is linklist is empty\n");

return 0;}/*

將data資料插入到head後面,即每次將新的資料往頭部新增

*/ struct node *new;

new=malloc(sizeof(struct node));

if(new==null)

new->data=data; //將資料賦值給新的節點

head->next=new; //將新節點的位址給頭結點

}void dispaly_list(struct node *head)

/* 將新資料新增到單鏈表的尾部

*/ struct node *new,*tmp;

new=malloc(sizeof(struct node));

if(new==null)

new->data=data;

for(tmp=head;tmp->next!=null;tmp=tmp->next); //遍歷單鏈表直到鍊錶為空,即鍊錶元素的next為null

tmp->next=new; //將新節點給鍊錶的最後乙個節點的next

new->next=null; }/*

採用快慢指標方式進行插入

由於單鏈表指標只能從頭部開始遍歷,因此採用快慢指標的方式進行遍歷,保留上乙個節點的指標,進行插入操作

思路分析(**link *cur):cur=*link cur為快指標,*link為慢的指標域

1、鍊錶為空時,插入第乙個資料, 只有head頭節點.則*link為null,cur=null;則不進入while迴圈。直接將new->next=null,*link=new(head->next=new).

2、鍊錶不為空時,插入的資料都比原來鍊錶中的要小,進入迴圈將cur->next的位址給link,則*link等於cur->next指向的下乙個節點的位址直到cur為即前一次的cur->next指向的下一節點為null

3、鍊錶不為空,插入的資料比煉表中的其中乙個要小,則會在中途break掉.此時cur->data比新的data大。則需要切斷cur節點跟前乙個節點的鏈。然後將cur節點接到new->next中。*link為cur前乙個節點的next

*/void insert_sortlist(struct node *head,datatype data)

new->data=data; //將data賦值給新節點的資料域

#if 1

struct node *slow=head,*fast; //快慢指標

for(fast=head->next;fast!=null;fast=fast->next)

new->next=fast;

slow->next=new;

#else

while(cur=*link)

new->next=cur;

*link=new;

#endif }/*

思路:鍊錶逆置

將將原來的鍊錶的表頭處砍斷,然後將砍斷部分按頭部插入法插入

*/void invert_list(struct node *head)

//在頭部砍斷鍊錶,表頭的next指向的下乙個節點給tmp_head臨時表頭

tmp_head->next=head->next;

head->next=null;

for(tmp=tmp_head->next;tmp!=null;tmp=tmp->next)

free(tmp_head); }/*

描述:刪除資料域=key的節點

思路:這裡仍然採用快慢指標,快指標進行比較,慢指標保留後面乙個節點

*/void del_node(struct node *head,int key)

#if 0

for(fast=head->next;fast!=null;fast=fast->next)

slow->next=fast->next;

free(fast);

#else

struct node **link=&head->next,*cur;

while(cur=*link)

*link=cur->next;

free(cur);

#endif }/*

描述:查詢中間節點

思路:仍然是用快慢指標,快指標的速度是慢指標的兩倍,當快指標走完煉表時,慢指標剛好是鍊錶的一半

*/struct node *find_midlist(struct node *head)

while(fast->next)

return slow;

}

C 實現單鏈表 不含頭結點

vs2005執行通過,如有問題,請各位大牛指正。注意 單鏈表不含有頭結點 include using namespace std template 定義結點 struct node 定義鍊錶 templateclass linklist templatelinklist linklist 初始化時,...

單鏈表的頭結點和頭指標

當鍊表的每個結點只包含乙個指標域時,此鍊錶就是單鏈表。在單鏈表的開始結點之前附設乙個型別相同的結點,稱之為頭結點。頭結點的資料域可以不儲存任何資訊,頭結點的指標域儲存指向開始結點的指標 即第乙個元素結點的儲存位置 頭指標是指向第乙個結點的指標,鍊錶中可以沒有頭結點,但是不能沒有頭指標。單鏈表的定義 ...

c實現無頭結點單鏈表

標頭檔案 ifndef linklist h define linklist h include include include include typedef int datatype typedef struct node node,pnode,plist void initlinklist p...