準備工作
還是和順序表的操作一樣,先創(chuàng)建一個 link_list.c
文件官扣,內(nèi)容如下:
//
// Created by wu on 19-1-13.
//
#include <stdbool.h>
#include <stdio.h>
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode, *LinkList; // 結(jié)構(gòu)體 結(jié)構(gòu)體指針幅狮, LNode * 也是結(jié)構(gòu)體指針
/**
* 單鏈表頭插法
* @param L
* @return
*/
LinkList head_insert(LinkList LL) {
int x;
LinkList s;
LL = (LinkList) malloc(sizeof(LNode)); // 創(chuàng)建頭結(jié)點,分配頭結(jié)點大小的內(nèi)存
LL->next = NULL;
scanf("%d", &x);
while (x != 999) {
s = (LinkList) malloc(sizeof(LNode));
s->data = x;
s->next = LL->next;
LL->next = s;
scanf("%d", &x);
}
return LL;
}
/**
* 尾插
* @param LL
*/
void last_insert(LinkList LL) {
int x;
LinkList s, *r = LL;
LL = (LinkList) malloc(sizeof(LNode));
scanf("%d", &x);
while (x != 999) {
s = (LinkList) malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
scanf("%d", &x);
}
r->next = NULL; // 為了保證安全正確,尾結(jié)點指針置空
}
/**
* 按值插入
* @param LL
* @param e
* @return
*/
LinkList search_elem_by_value(LinkList LL, ElemType e) {
LinkList p = LL->next;
while (p != NULL && p->data != e) {
p = p->next;
}
return p;
}
LinkList search_elem_by_num(LinkList LL, int i){
int j = 1;
LinkList p = LL->next;
if(i == 0 ) return LL; // 頭結(jié)點
if(i< 1) return NULL; // i 無效
while(p && j < i){
p = p->next;
j++;
}
if(j == i) return p;
else return NULL;
}
/**
* 按位插入
* @param L
* @param i
* @param x
* @return
*/
void insert_elem(LinkList LL, int i, ElemType x) {
LinkList p = search_elem_by_num(LL, i - 1);
LinkList s = (LinkList) malloc(sizeof(LNode));
s->next = p->next;
s->data = x;
p->next = s;
}
bool delete_elem(LinkList LL, int i) {
LinkList p = search_elem_by_num(LL, i - 1);
LinkList q;
q = p->next;
p->next = q->next;
free(q);
return true;
}
void print_link_list(LinkList LL) {
LinkList s = LL->next;
while (s) {
printf("%3d", s->data);
s = s->next;
}
printf("\r\n\r\n");
}
main.c
#include <stdio.h>
#include <malloc.h>
//#include "list.c"
#include "link_list.c"
int main() {
LinkList LL;
LL = head_insert(LL);
// LNode LL;
// head_insert(&LL);
print_link_list(LL);
insert_elem(LL, 2, 90);
print_link_list(LL);
delete_elem(LL,2);
print_link_list(LL);
printf("Hello, World!\n");
return 0;
}
執(zhí)行結(jié)果
輸入:2 3 4 5 999
輸出:
5 4 3 2
5 90 4 3 2
5 4 3 2
Hello, World!
值得一提的是蹄皱,結(jié)構(gòu)體:
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode, *LinkList; // 結(jié)構(gòu)體 結(jié)構(gòu)體指針篙螟, LNode * 也是結(jié)構(gòu)體指針
中 LNode
是結(jié)構(gòu)體名菌湃,*LinkList
是結(jié)構(gòu)體指針,所以下邊的調(diào)用使用 LinkList
時遍略,不需要在調(diào)用中寫 &
惧所,方法實現(xiàn)也不需要寫 *
, 但是在頭插法調(diào)用后就需要返回 LL ,否則拿不到值绪杏。
main 方法中注釋的兩行代碼等價于上邊的兩行下愈,而且不需要頭插法返回LL
,這里提醒一下蕾久,以免看到的時候造成疑惑势似。