linklist.h
#ifndef __linklist_h__
#define __linklist_h__
#define false 0
#define true 1
typedef int linkdata;
typedef struct _node
node;
// 建立鍊錶
node * create_list();
// 尾插
int insert_last(node *h, linkdata data);
// 頭插
int insert_head(node *h, linkdata data);
// 在第 pos 個結點處插入資料
int insert_pos(node *h, int pos, linkdata data);
//刪除 第 pos 個結點
int delete_pos(node* h, int pos);
// 逆序
int reverse_list(node *head);
// 刪除指定資料
int delete_data(node*, linkdata data);
// 查詢元素:如果有, 返回元素的位置
int find_element(node* h, linkdata data, int *x);
// 獲取順序表中的元素:通過位置獲取
int get_element(node* s, int pos, int *x);
int get_len(node * head);
// 清空所有結點
int clean_list(node * head);
// 銷毀鍊錶
int destroy(node *);
void display(node *h);
#endif
linklist.c
#include "linklist.h"
#include #include node * create_list()
int insert_head(node *h, linkdata data)
node->data = data;
node->next = h->next;
h->next = node;
return true;
}int insert_last(node *h, linkdata data)
node->data = data;
node->next = null;
node* tmp = h;
while (tmp->next)
tmp->next = node;
return true;
}int insert_pos(node *h, int pos, linkdata data)
if (tmp == null) // 越界
node *node = (node*)malloc(sizeof(node)/sizeof(char));
if (node == null)
node->data = data;
node->next = tmp->next;
tmp->next = node;
return true;
}int delete_pos(node* h, int pos)
if (tmp->next == null) // 越界
node *p = tmp->next;
tmp->next = p->next;
free(p);
return true;
}int reverse_list(node *h)
h->next->next = null;
h->next = pre;
return true;
}int delete_data(node* h, linkdata data)
if (tmp->next == null)
return false;
node *p = tmp->next;
tmp->next = p->next;
free(p);
return true;
}int find_element(node* h, linkdata data, int *x)
k++;
tmp = tmp->next; }
return false;
}int get_element(node* h, int pos, int *x)
if (tmp == null)
return false;
else
*x = tmp->data;
return true;
}int get_len(node * h)
return count;
}int clean_list(node * h)
return 0;
}void display(node *h)
printf ("\n");
}int destroy(node *h)
main.c
#include #include "linklist.h"
int main()
int i;
for (i = 0; i < 10; i++)
#if 0
for (i = 0; i < 10; i++)
insert_pos(head, 5, 1000);
insert_pos(head, 1, 2000);
insert_pos(head, 22, 2000);
insert_pos(head, 24, 2000);
insert_pos(head, 26, 2000);
delete_pos (head, 21);
reverse_list(head);
#endif
delete_data(head, 0);
int x;
find_element(head, 7, &x);
get_element(head, 8, &x);
printf ("%d\n", x);
printf ("%d\n", get_len(head));
display(head);
clean_list(head);
printf ("清空後:\n");
display(head);
return 0;
}
頭節點鍊錶C程式
main.c檔案 include include headnode.h int main for i 0 i 20 i 錯誤1 空表的情況下插入節點 insert pos head,0,2 正確 空表的情況下在第乙個節點處插入 insert pos head,1,2 錯誤2 空表的情況下在非第乙個節...
從無頭鍊錶中刪除節點
程式設計之美 第3.4節 從無頭鍊錶中刪除節點 問題 假設有乙個沒有頭指標的單鏈表。乙個指標指向此單鏈表中間的乙個節點 不是第乙個也不是最後乙個節點 請將該節點從單鏈表中刪除 解法 題目中已經說明既不是頭節點也不是尾節點,因此不用考慮特殊情況。要解這個題首先的思路是尋找前乙個節點的指標,但是由於這是...
鍊錶問題技巧 使用偽頭節點
小技巧 對於鍊錶問題,建立頭節點時不知道合適的節點值,因此通常需要先初始化乙個預先指標 偽頭節點 pre,該指標的下乙個節點指向真正的頭結點head。使用預先指標的目的在於鍊錶初始化時無可用節點值。struct listnode listnode pre newlistnode 0 0為預先指標的值...