一、操作代碼簡述
- void createList(int Element); //創建鏈表操作
- void ScanList(); //對鏈表掃描輸出操作
- Node *findElem(int k); //根據輸入參數定位指定結點操作
- void deleteHead(); //刪除頭結點操作
- void deleteTail() //刪除尾結點操作
- void deleteTheElem(int m); //刪除指定結點操作
- void addElem(int index,int n); //在某個位置增加特定元素操作
二、具體代碼展示
#include <stdio.h>
#include <stdlib.h>
//自定義結構體
typedef struct Node{
int a;
struct Node *next;
}Node;
//宏觀定義頭指針和尾指針
Node *head = NULL;
Node *end = NULL;
//創建鏈表操作
void createList(int a){
Node *s=(Node *)malloc(sizeof(Node));
s->a=a;
s->next=NULL;
if(NULL == head){
head = s;
}else{
end->next = s;
}
end = s;
}
//對鏈表掃描輸出操作
void ScanList(){
Node *s = head;
while(s != NULL){
printf("%d \n",s->a);
s = s->next;
}
}
//根據輸入參數定位指定結點操作
Node *findElem(int k){
Node *s = head;
while(s != NULL){
if(k == s->a){
return s;
}
s = s->next;
}
return NULL;
}
//刪除頭結點操作
void deleteHead(){
//將舊頭放入臨時結點暫存
Node *s = head;
if(NULL == head){
printf("鏈表爲空!");
return;
}
head = head->next;
free(s);
}
//刪除尾結點操作
void deleteTail(){
if(NULL == end){
printf("鏈表爲空!");
return;
}
if(head == end){
head = NULL;
end = NULL;
free(head);
}else{
Node *s = head;
while(s->next != end){
s = s->next;
}
free(end);
end = s;
end->next = NULL;
}
}
//刪除指定結點操作
void deleteTheElem(int m)
{
//鏈表判斷 是不是爲空
if(NULL == head)
{
printf("鏈表爲空 \n");
return;
}
//鏈表不爲空,找這個節點
Node* s =findElem(m);
if(NULL == s)
{
printf("查無此點\n");
return;
}
//找到了,且只有一個節點
if(head == end)
{
free(head);
head = NULL;
end = NULL;
}
else if(head->next == end) //有兩個節點
{
//看是刪除頭還是刪除尾
if(end == s){ deleteHead(); }
else if(s==head){ deleteTail(); }
}
else//多個節點
{
//看是刪除頭還是刪除尾
if(end == s)
deleteTail();
else if(s == head)
deleteHead();
else //刪除中間某個節點
{ //找要刪除temp前一個,遍歷
Node *e =head;
while(e->next!=s)
{
e=e->next;
}
//找到了
//讓前一個直接連接後一個 跳過指定的即可
e->next = s->next;
free(s);
}
}
}
//在某個位置增加特定元素操作
void addElem(int index,int n)
{
if (NULL == head)
{
printf("鏈表沒有節點\n");
return;
}
Node* e =findElem(index);
if(NULL == e) //沒有此節點
{
printf("沒有指定節點\n");
return;
}
//有此節點
//創建臨時節點,申請內存
Node* s =(Node *)malloc(sizeof(Node));
//節點成員進行賦值
s->a = n;
s->next = NULL;
//連接到鏈表上 1.找到的節點在尾部 2.找到的節點在中間
if (e == end)
{
//尾巴的下一個指向新插入的節點
end->next = s;
//新的尾巴
end = s;
}else{
// 先連後面 (先將要插入的節點指針指向原來找到節點的下一個)
s->next=e->next;
//後連前面
e->next=s;
}
}
//主函數測試
int main() {
int i;
Node *findRes;
for(i = 0; i < 6; i++){
createList(i);
}
addElem(4,14);
//deleteTail();
//deleteTheElem(4);
ScanList();
findRes = findElem(5);
if(findRes != NULL){
printf("%d \n",findRes->a);
}else{
printf("not find!");
}
}
三、代碼測試地址
C語言在線編輯器測試網址,可以點擊測試!
這個在線工具挺不錯的,大家可以以後在這個上面編寫代碼並測試。