單鏈表的構建 插入 刪除等等

2021-10-05 04:29:17 字數 3114 閱讀 5211

標頭檔案

#pragma once

typedef int elemtype;

typedef struct node

;struct node *next;//指標域

}lnode,*linklist;

typedef struct head

hlist,phead;

lnode head;

void initlinklist(linklist list);

int insertlinklistpos(linklist list, elemtype val, int pos);

int insertlinklisthead(linklist list, elemtype val);

int insertlinklisttail(linklist list, elemtype val);

void showlinklist(linklist list);

int deletelinklistpos(linklist list, int pos);

int deletelinklisthead(linklist list);

int deletelinklisttail(linklist list);

void destorylinklist(linklist list);

/判斷兩個單鏈表是否相交

第一種思路:通過兩個指標,直接跑到最後乙個節點,判斷兩個節點的位置是否相等

第二種思路:先求得兩個鍊錶的長度,求差值,指向長的鍊錶的指標先跑到差值的節點數,兩個指標在同時向後跑,每跑乙個節點,判斷其位址是否相等,如果相等則直接返回其中乙個指標,這就是相交的第乙個節點

*/linklist twolistisintersection(linklist list1,linklist list2);

//判斷乙個單鏈表是否有環

linklist isringlist(linklist list);

//刪除p節點,p節點不是最後乙個節點

void deletelinklistnode(linklist list, linklist p);

//o(1)在結點p之前插入乙個新的資料val

void inserofnode(linklist p,elemtype val);

//將乙個單鏈表進行逆置

void resverlinklist(linklist list);

//返回倒數第k個結點

linklist findafterk(linklist list, int k);

return 1;
int insertlinklisthead(linklist list, elemtype val)

int insertlinklisttail(linklist list, elemtype val)

printf("\n");int deletelinklistpos(linklist list, int pos)

linklist p = list;

while (pos > 0)

linklist q = p->next; // q是將要刪除的結點

p->next = q->next;

free(q);

list->length--;

return 1;int deletelinklisthead(linklist list)

int deletelinklisttail(linklist list)

void clearlinklist(linklist list)

void destorylinklist(linklist list)

}//判斷兩個單鏈表是否相交

linklist twolistisintersection(linklist list1,linklist list2)

}else

}while(p != null && q != null)

p = p->next;

q = q->next;

}return null;}

//判斷是否有環

static linklist ringlist(linklist list)

q = q->next;

if(p == q)

}return null;

}linklist isringlist(linklist list)

linklist p = pnode;

linklist q = list;

while(p != q)

return p;//肯定就是入環的第乙個結點

}//刪除p節點,p節點不是最後乙個節點

void deletelinklistnode(linklist list, linklist p)

linklist q = p->next;

p->data = q->data;

p->next = q->next;

free(q);

p->data = val;

p->next = s;

}

//將乙個單鏈表進行逆置

void resverlinklist(linklist list)

linklist s =null,p = list->next;

linklist q = p->next;

while(p != null)

}list->next = s;

}

//返回倒數第k個結點

linklist findafterk(linklist list, int k)

linklist p = list;

linklist q = list;

for (int i = 0; i < k; ++i)

}while (p != null)

return q;

cpp檔案

#include

#include

#include 「list.h」

int main()

showlinklist(&head);

return 0;

}

單鏈表插入刪除

在鍊錶的插入刪除操作上理解起來比順序表更為容易,其不需要變動在i位置前的所有的元素,只需要修改節點指標即可。插入 設在鍊錶的i位置插入新元素,設i 1節點的指標域為p,設插入的節點指標域為s,所以插入操作應該為 s next p next 將s的字尾改為p的字尾,p的字尾是原來的第i個點的指標域,將...

單鏈表的插入刪除

include using namespace std struct lnode void creat link lnode head head指標的引用,lnode head 傳遞的是指標,但是對於指標的原值卻發生了copy,這樣你雖然可以對指標指向的記憶體進行修改但是不能對指標進行修改。因此要傳...

單鏈表插入刪除排序

package liu public class node public void setdata int data public int getdata public node getnext public void setnext node next package liu public cla...