最近正好在複習資料結構,鍊錶作為比較重要的資料結構,特地自己實現了一遍。
首先我們要理解幾個概念:
1、鏈式儲存是最常用的儲存方式之一,可以表示線性和非線性的資料結構。
2、按照鏈式儲存的線性表簡稱為鍊錶。
3、單鏈表是一種鏈式訪問的資料結構,用一組位址任意的儲存單元來存放線性表中的資料元素。
4、鍊錶由節點構成,每個節點的構成為:元素+指標(指向後繼元素)
理解這幾個基本的概念之後,考慮如何鍊錶的功能:1、初始化鍊錶2、建立鍊錶3、新增元素(往頭部新增、往尾部新增、中間新增)4、刪除元素(頭刪除、尾刪除、中間刪除)5、查詢節點6、查詢元素7、修改節點元素8、清空鍊錶9、鍊錶大小10、逆序鍊錶
除此之外,在具體實現上為了方便起見,我們可以為鍊錶設定乙個頭節點。
下面見**:
#include#include#includetypedef int elemtype;
typedef struct nodenode;
//1、初始化鍊錶
void init(node** pnode)
//1、建立鍊錶
node* create(node* phead)
memset(p1, 0, sizeof(node));
printf("輸入節點值(非正數結束):");
scanf_s("%d", &p1->element);//輸入新節點
p1->next = null;
while (p1->element > 0)
else
p2 = p1;//重新讓p2做尾節點
p1 = (node*)malloc(sizeof(node));
if (p1 == null || p2 == null)
memset(p1, 0, sizeof(node));
printf("輸入節點值(非正數結束):");
scanf_s("%d", &p1->element);
p1->next = null;
} printf("鍊錶建立成功\n");
return phead;
}//列印鍊錶
void print(node* phead)
else
printf("\n"); }}
//清空鍊錶
void clear(node* phead)
while (phead->next != null)
printf("鍊錶清空\n");
}//鍊錶長度
int size(node* phead)
printf("鍊錶長度%d\n", size);
return size;
}//鍊錶是否為空
int isempty(node* phead)
printf("鍊錶非空\n");
return 0;
}//獲取指定位置的元素
elemtype get(node* phead, int pos)
if (phead == null)
while (phead != null)
phead = phead->next;
} if (i < pos)
return phead->element;
}elemtype *getaddr(node* phead, elemtype x)
if (x < 0)
while ((phead->element != x) && (phead->next != null))
if ((phead->element != x) && phead != null)
if (phead->element == x)
return &(phead->element);
}//修改指定位置的元素
int modify(node* pnode, int pos, elemtype x)
if (pos < 1)
while (phead != null)
phead = phead->next;
} if (i < pos)
pnode = phead;
pnode->element = x;
printf("modifyelem函式執行,修改%d出值為%d\n",pos,x);
return 1;
}//插入頭節點
int inserthead(node** pnode, elemtype ele)
//插入尾節點
int insertlast(node** pnode, elemtype ele)
phead->next = pinsert;
*pnode = ptmp;
printf("向表尾插入元素:%d\n",ele);
return 1;
}//在指定位置插入元素
int insertmid(node** pnode, int pos, elemtype ele)
if (pos < 1)
while (phead != null)
phead = phead->next;
} if (i < pos)
nhead = phead->next;//儲存後乙個節點
pinsert->next = phead->next;
phead->next = pinsert;
printf("插入中間節點\n");
return 1;
}//刪除指定位置元素
int deletemidele(node** pnode, int pos)
while (phead != null)
phead = phead->next;
} de = phead->next;
phead->next=de->next;
printf("刪除元素成功\n");
return 1;
}//刪除第乙個節點
int delhead(node** pnode)
if (phead->next == null)
phead = phead->next;//設定原先頭節點的下乙個節點為頭節點
*pnode = phead;
printf("刪除頭節點成功\n");
return 1;
}//刪除尾節點
int dellast(node** pnode)
while (phead->next!= null)
printf("刪除尾節點\n");
free(phead);
predel->next = null;
return 1;
}//逆序鍊錶
void reverse(node** pnode)
current = *pnode;//a1
while (current->next!=null)
printf("逆序鍊錶\n");
}void main()
1、建立另外乙個單獨鍊錶,用來儲存待逆序鍊錶遍歷過成中從後往前的節點;
2、每次遍歷過程中,當前元素都與第乙個元素交換位置。比如:1,2,3,4逆序
第一次:2,1,3,4
第二次:3,2,1,4
第三次:4,3,2,1
(**中使用的便是這種方法)
從演算法複雜度來說,建議採用第二種。當然還有其他的方案,此處不做說明了。
資料結構 單鏈表基本操作
實現單鏈表的初始化,頭插法建表,尾插法建表,查詢元素,插入元素,刪除元素等功能 include using namespace std define elemtype char typedef struct node node,linklist 初始化單鏈表 void initlist linkli...
《資料結構》單鏈表基本操作實現
define ok 1 define error 1 typedef int elemtype typedef int status typedef struct node lnode,linklist 構造空表 status initlist linklist l void creatlist l...
資料結構2 單鏈表基本操作
單鏈表操作 初始化 建立單鏈表 尾插 判空 求長度 取第i個元素 查詢某元素位序 插入 刪除 include include define ok 1 define error 0 typedef int status typedef int elemtype typedef struct lnode...