1、建立乙個單鏈表
實現思路:首先,定義乙個頭結點(*l),為其在記憶體中開闢一段空間並將指標域指標指向null;其次,生成乙個新結點p,將要插入的資料元素儲存到結點的資料域,並將其指標域指標指向頭結點(*l)指向的結點(或null);最後,將新結點p插入到表頭。
/***
隨機產生n個元素的值,建立帶頭結點的單鏈線性表l(頭插法)***/
//單鏈表節點的定義
typedef structnode;
//由乙個陣列建立單鏈表
node* createlist(int *a, int count)
return head; //返回鍊錶
}
2、單鏈表插入
實現思路:首先,對鍊錶進行查詢操作,找到第i個位置;其次,為新插入的結點s在記憶體中開闢一段儲存空間並將插入的元素儲存到新結點s的資料域中;最後,將p指向的結點位置賦值給新結點s的指標域,再將新結點s的儲存位址賦值給工作指標。
/*功能:將元素e插入到單鏈表的第i個位置*/
#define unsuccess -1
#define success 1
typedef status int;
status listinsert(linklist *l,int i,elemtype e)
if(!p || j>i) //當p指向null或者j大於要查詢的位置時,查詢失敗
return unsuccess ;
s=(linklist)malloc(sizeof(node)); //生成新結點,即為新結點開闢一段記憶體
s->data=e; //查詢成功,將資料元素e賦值給s結點的資料域
p->next=s; //設定結點p的後繼結點為結點s
return success ;
}
3、單鏈表刪除操作
實現思想:首先,宣告乙個結點q並對鍊錶進行查詢操作,找到第i個位置;其次,將第i個結點賦值給q;第三,將q的後繼(以前的p的後繼)賦值為工作指標p的後繼;最後,將第i個結點(q)資料域資料儲存到指標變數e中,free(q)即釋放結點q占用的記憶體空間
/***功能:刪除單鏈表l中的第i個資料元素(結點)
並將該資料元素儲存到指標變數e指向的儲存空間中***/
#define unsuccess -1
#define success 1
typedef status int;
status listinsert(linklist *l,int i,elemtype *e)
if(!p || j>i)
return unsuccess;
q=p->next; //設定q為p的後繼結點,即將第i個結點的位址儲存到q
p->next=q->next; //將q的後繼結點設定為p的後繼結點
*e=q->data; //將q結點中的資料給e
free(q); //設定完成後,讓系統**此結點,釋放記憶體
return success;
}
資料結構 單鏈表相關習題3
解題思路 兩煉表若相交,則其最後乙個節點必定相同。所以遍歷得出兩鍊錶的尾節點可得知兩鍊錶是否相交。若兩鍊錶相交,則求出兩鍊錶長度,相減得其差值len。較長鍊錶先向後遍歷len次,隨後兩鍊錶同時向後遍歷。直到出現兩值相同時,該節點即為相交點。判定兩個鍊錶是否相交,並求出交點 linknode hasc...
Go語言 資料結構 單鏈表相關操作
一般來說,為了比較好的對單鏈表進行增刪該查操作,會設定乙個頭節點來標識煉表頭,這個節點本身不存放資料。如下 package main import fmt 定義乙個heronode type heronode struct 給鍊錶插入乙個結點,在單鏈表的最後加入 func insertheronod...
單鏈表相關知識以及指標引用相關知識
include include typedef char elemtype typedef struct lnode linknode 宣告單鏈表節點型別 頭插法相對簡便,但插入的資料與插入的順序相反 尾插法操作相對複雜,但插入的資料與插入順序相同。頭插法建立鍊錶時候,就相當於後來居上。後面的結點不...