/*
* 內容: 鏈表的操作:查找,插入,刪除,頭插法,尾插法
* 注意:
* LinkList p, L
* p = L // p指向頭結點
* p = L->next // p指向第一個結點
* 作者: wolves_liu
* 日期: 2018.3.21
* 參考: 《大話數據結構》
*/
typedef struct Node
{
int data;
struct Node *p;
}Node;
typedef struct Node *LinkList;
// 查找第i個結點,將鏈表L中的第i個結點的數據存入e
int List_Get(LinkList L, int i, int *e)
{
//遍歷鏈表
int j = 1;
LinkList p;
p = L->next; // p指向第一個結點
while(p && j<i)
{
p = p->next;
++j;
}
if(!p || j>i)
{
return -1;
}
*e = p->data;
return 1;
}
// 插入結點
// 在鏈表L的第i個結點之前,插入結點s, s的數據域是e;
int List_Insert(LinkList *L, int i, int e)
{
//遍歷鏈表
LinkList p, s;
int j = 1;
p = *L; //p指向表頭結點,注意不是第一個結點
while(p && j<i)
{
p = p->next;
++j;
}
if(!p || j>i) //if(p == NULL || j>i)
{
return -1;
}
// 插入結點s
s = (LinkList)malloc(sizeof(Node));
s->data = e;
s->next = p->next;
p->next = s;
return 1;
}
// 刪除結點
// 刪除鏈表L的第i個結點,將該結點的數據保存到e;
int List_Insert(LinkList *L, int i, int *e)
{
LinkList p, q;
int j = 1;
p = *L; //p指向表頭節點
while(p && j < i)
{
p = p->next;
++j;
}
if(!p || j>i)
{
return -1;
}
q = p->next;
p->next = q->next;
*e = q->data;
free(q);
return 1;
}
// 創建鏈表 —— 頭插法,產生n個元素的帶頭結點的鏈表L
void Create_List_Head(LinkList *L, int n)
{
LinkList p;
int i = 0; // 計數器
srand(time(0)); // 初始化隨機種子
*L = (LinkList)malloc(sizeof(Node)); // 生成一個結點,頭結點是*L ;初始化鏈表L
*L ->next = NULL; // 頭結點是指針域爲空
for(i=0; i<n; i++)
{
p = (LinkList)malloc(sizeof(Node)); // 生成新結點p,第一個結點
p->data = rand()%100 + 1; // 隨機生成100以內的數字
p->next = (*L)->next; // p指向第一個結點,(*L)->next是第一個結點
(*L)->next = p; // (*L)->next是頭結點指向p
}
}
// 創建鏈表 —— 尾插法,產生n個元素的帶頭結點的鏈表L
void Create_List_Tail(LinkList *L, int n)
{
LinkList p, r;
int i = 0; // 計數器
srand(time(0)); // 初始化隨機種子
*L = (LinkList)malloc(sizeof(Node)); // 生成一個結點,頭結點是*L
r = *L; // r是指向尾部的結點
for(i=0; i<n; i++)
{
p = (LinkList)malloc(sizeof(Node)); // 生成新結點p
p->date = rand()%100 + 1;
r->next = p;
r = p;
}
r->next = NULL;
}
// 刪除鏈表,L已經存在
int Delete_List(LinkList *L)
{
LinkList p, q;
p = *L->next;
while(p)
{
q = p->next; // 將p的下一個結點改名爲q
free(p); // 釋放p
p = q; // 將結點q當成結點p,第二次循環就會再釋放p(即第二個結點)
}
*L->next = NULL; // 最後再將頭結點的指針域爲空
return 1;
}