//
// main.c
// 02-線性表(鏈?zhǔn)酱鎯?
//
// Copyright ? 2017年 Mr.Young. All rights reserved.
//
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW 0
typedef int Status;
typedef int Bool;
typedef int ElemType;
struct LNode { // 結(jié)點類型
ElemType data;
struct LNode *next;
};
typedef struct LNode *Link;
typedef struct LNode *Position;
typedef struct { // 鏈表類型
Link head, tail; // 分別指向線性鏈表中的頭結(jié)點和最后一個結(jié)點
int len; // 指向線性鏈表中數(shù)據(jù)元素的個數(shù)
}LinkList;
/**
分配由p指向的值為e的結(jié)點,并返回OK,若分配失敗,則返回ERROR
*/
Status MakeNode(Link *p, ElemType e) {
*p = (Link)malloc(sizeof(struct LNode));
if (!(p)) {
printf("內(nèi)存分配失敗!\n");
}
(*p)->data = e;
return OK;
}
/**
釋放p所指結(jié)點
*/
void FreeNode(Link *p) {
free(*p);
p = NULL;
}
/**
構(gòu)造一個空的線性鏈表
*/
Status InitList(LinkList *L) {
Link p = (Link)malloc(sizeof(Link)); // 創(chuàng)建頭結(jié)點
if (!p) {
printf("頭結(jié)點內(nèi)存分配失??!\n");
return ERROR;
}
p->next = NULL;
L->head = L->tail = p;
L->len = 0;
return OK;
}
/**
將線性鏈表L置為空表,并釋放原鏈表的結(jié)點空間
*/
Status ClearList(LinkList *L) {
Link p, q;
if (L->head != L->tail) { // 線性鏈表不為空表
p = q = L->head->next;
while (p!=L->tail) {
p=q->next;
free(q);
q = p;
}
free(q);
L->tail = L->head;
L->len = 0;
return OK;
}
printf("鏈表為空,清空失敗!\n");
return ERROR;
}
/**
銷毀線性鏈表L,L不再存在
*/
Status DestroyList(LinkList *L) {
ClearList(L);
FreeNode(&L->head);
return OK;
}
/**
已知h指向線性鏈表的頭結(jié)點,將s所指結(jié)點插入在第一個結(jié)點之前
*/
Status InsFirst(LinkList *L, Link h, Link s) {
s->next = h->next;
h->next = s;
if (h == L->tail) // 表尾
L->tail = h->next;
L->len++; // 鏈表長度加1
return OK;
}
/**
已知h指向線性鏈表的頭結(jié)點,刪除鏈表中的第一個結(jié)點并以q返回
*/
Status DelFirst(LinkList *L, Link h, Link *q) {
*q = h->next;
if (*q != NULL) { // 鏈表不為空
h->next = (*q)->next;
// free(h->next);
if (!h->next) //刪除的是尾結(jié)點
L->tail = h; // 修改尾指針
L->len--; // 鏈表長度減1
return OK;
}
printf("該鏈表為空!\n");
return ERROR;
}
/**
將指針s所指(彼此以指針相鏈)的一串結(jié)點鏈接在線性鏈表L的最后一個結(jié)點之后,并改變鏈表L的尾指針指向新的尾結(jié)點
*/
Status Append(LinkList *L, Link s) {
int i = 1;
L->tail->next = s;
while (s->next) {
s = s->next;
i++;
}
L->tail = s;
L->len += i;
return OK;
}
/**
刪除線性鏈表L中的尾結(jié)點并以q返回,改變鏈表L的尾指針指向新的尾結(jié)點
*/
Status Remove(LinkList *L, Link *q) {
Link p = L->head;
if (L->len == 0) { // 空表
q = NULL;
printf("該鏈表為空!\n");
return ERROR;
}
while (p->next != L->tail) {
p = p->next;
}
*q = L->tail;
p->next = NULL;
L->tail = p; // 修改尾指針
L->len--;
return OK;
}
/**
已知p指向線性鏈表L中的一個結(jié)點,返回p所指結(jié)點的直接前驅(qū)的位置,若無前驅(qū),則返回NULL
*/
Position PriorPos(LinkList L, Link p) {
Link q = L.head->next;
if (q == p) { // 第一個結(jié)點
printf("第一個結(jié)點沒有前驅(qū)結(jié)點!\n");
return NULL;
} else {
while (q->next != p)
q = q->next;
return q;
}
}
/**
已知p指向線性鏈表L中的一個結(jié)點,將s所指結(jié)點插入在p所指結(jié)點之前,并修改指針p指向新插入的結(jié)點
*/
Status InsBefore(LinkList *L, Link *p, Link s) {
if ((*L).len == 0 || (*L).head == (*L).tail) {
printf("該鏈表為空!\n");
return ERROR;
}
Link prior_p = PriorPos(*L, *p); // 找出(*p)的前驅(qū)
if (!prior_p) // *q無前驅(qū)
prior_p = L->head;
s->next = *p;
prior_p->next = s;
*p = s;
L->len++;
return OK;
}
/**
已知p指向線性鏈表L中的一個結(jié)點,將s所指結(jié)點插入在p所指結(jié)點之后,并修改指針p指向新插入的結(jié)點
*/
Status InsAfter(LinkList *L, Link *p, Link s) {
if ((*L).len == 0 || (*L).head == (*L).tail) {
printf("該鏈表為空!\n");
return ERROR;
}
if (*p == L->tail) // 在尾指針后插入s
L->tail = s; // 修改尾指針
s->next = (*p)->next;
(*p)->next = s;
*p = s;
L->len++; // 鏈表長度加1
return OK;
}
/**
創(chuàng)建一個具有n個結(jié)點的鏈表
*/
Status CreateList(LinkList *L, int n) {
for (int i = 0; i < n; i++) {
// printf("請輸入第%d個結(jié)點的數(shù)據(jù)\n", i+1);
// ElemType e = 0;
// scanf("%d", &e);
Link p;
MakeNode(&p, i+1);
InsFirst(L, L->tail, p);
}
return OK;
}
/**
已知p指向線性鏈表L中的一個結(jié)點,用e更新p所指結(jié)點中數(shù)據(jù)元素的值
*/
Status SetCurElem(Link *p, ElemType e) {
(*p)->data = e;
return OK;
}
/**
已知p指向線性鏈表中的一個結(jié)點,返回p所指結(jié)點中數(shù)據(jù)元素的值
*/
ElemType GetCurElem(Link p) {
return p->data;
}
/**
若線性鏈表L為空表,則返回TRUE,否則返回FALSE
*/
Bool ListEmpty(LinkList L) {
return L.len==0;
}
/**
返回線性鏈表L中元素的個數(shù)
*/
int ListLength(LinkList L) {
return L.len;
}
/**
返回線性鏈表L中頭結(jié)點的位置
*/
Position GetHead(LinkList L) {
return L.head;
}
/**
返回線性鏈表L中最后一個結(jié)點的位置
*/
Position GetLast(LinkList L) {
return L.tail;
}
/**
已知p指向線性鏈表L中的一個結(jié)點,返回p所指結(jié)點的直接后繼的位置,若無后繼,則返回NULL
*/
Position NextPos(Link p) {
return p->next;
}
/**
返回p指示線性鏈表L中第i個結(jié)點的位置并返回OK,i值不合法時返回ERROR
*/
Status LocatePos(LinkList L, int i, Link *p) {
if (i<1 || i>L.len) {
printf("訪問的位置不存在!\n");
return ERROR;
}
int cur = 1;
*p = L.head->next;
while (cur!=i) {
cur++;
*p=(*p)->next;
}
return OK;
}
Bool compare(ElemType e1, ElemType e2) {
return e1 == e2;
}
/**
返回線性鏈表L中第1個與e滿足函數(shù)compare()判定關(guān)系的元素的位置,若不存在這樣的元素,則返回NULL
*/
Position LocateElem(LinkList L,ElemType e, Status (* compare)(ElemType, ElemType)) {
Link p = L.head->next;
while (p && !compare(e, p->data)) { // 沒到表尾 并且 沒找到符合條件的元素
p = p->next;
}
return p;
}
void print(ElemType e) {
printf("%d\n", e);
}
/**
依次對L的每個元素調(diào)用函數(shù)visit()。一旦visit()失敗,則操作失敗。
*/
Status ListTraverse(LinkList L, void(*visit)(ElemType)) {
if (L.len==0)
printf("該鏈表為空!");
Link p = L.head->next; // p指向鏈表中第一個結(jié)點
for (int i = 1; i <= L.len; i++) {
visit(p->data);
p=p->next;
}
printf("\n");
return OK;
}
int main(int argc, const char * argv[]) {
LinkList list;
// 初始化一個鏈表
InitList(&list);
// 創(chuàng)建一個鏈表
CreateList(&list, 10);
Link p;
LocatePos(list, 5, &p);
printf("num 5 pos = %p\n", p);
p = LocateElem(list, 5, compare);
printf("data 5 pos = %p\n", p);
ListTraverse(list, print);
DestroyList(&list);
return 0;
}
2.線性表-鏈?zhǔn)酱鎯Ψ绞降膶崿F(xiàn)
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
- 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
- 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
- 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 近幾次總是討論著各種各樣的表,難免有些暈。這次的內(nèi)容依然是一個表(笑哭臉),為了不“暈表”,我們先來理一理:這是個...
- "我想帶你去一個很遠(yuǎn)的地方,青磚綠瓦,墻角開著沒有名字的花,在長著青苔的屋檐下躲雨,在石板路的末尾等心愛的人,日出...
- 正確本身有價值嗎?大多數(shù)人都認(rèn)可的事情意味著什么? 從小到大,父母老師都教導(dǎo)我們要認(rèn)真學(xué)習(xí),好好讀書,用我們高中班...