c語言單連結串列的實現,包括連結串列的建立、插入、查詢、刪除、列印、長度計算
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
char data;
struct node *next;
}LINKLIST;
// 連結串列初始化操作,返回一個空連結串列
LINKLIST *INITLIST()
{
LINKLIST *head;
head = (LINKLIST*)malloc(sizeof(LINKLIST));
head->next = NULL;
return head;
}
// 連結串列的建立1(尾插入法建立連結串列,就是從連結串列的直接尾部新增資料用指標連起來)
LINKLIST *rCreate()
{
LINKLIST *head,*last,*p;
char ch;
head = (LINKLIST*)malloc(sizeof(LINKLIST));
head->next = NULL;
last = head;
printf("請輸入連結串列數值(尾插入法),@符號終止輸入:\n");
while((ch = getchar()) != '@')
{
// 接收到@字元時跳出迴圈
p = (LINKLIST*)malloc(sizeof(LINKLIST));
p->data = ch;
last->next = p;
last = p;//重新對last賦值
p->next = NULL;//到尾了
}
return head;
}
// 連結串列的建立2(頭插入法建立連結串列,每一個資料都是直接插入在head的後面,然後將後面的資料後移,有點像堆疊,先進後出)
LINKLIST *hCreate()
{
LINKLIST *head,*p;
char ch;
head = (LINKLIST*)malloc(sizeof(LINKLIST));
head->next = NULL;
printf("請輸入連結串列數值(頭插入法),@符號終止輸入:\n");
while((ch = getchar()) != '@')
{
p = (LINKLIST*)malloc(sizeof(LINKLIST));
p->data = ch;
p->next = head->next;//讓head第一次指向的元素向後移動一個單位
head->next = p;//head指向的下一個就是p
}
return head;
}
// 計算連結串列的長度
int LENGTH(LINKLIST *head)
{
// 注意這個地方,傳入的head的是結構指標
// 改變結構指標裡面東西是不會像原來改變整數一樣改變原來的head內容的(這裡的p有點像是區域性變數,不會改變head)
int i = 0;
LINKLIST *p = head;
while(p = p->next)
i++;
return i;
}
// 尋找連結串列裡的第n個節點(n>=1),其實就是獲得第n個之後的連結串列
LINKLIST *GET(LINKLIST *head,int n)
{
LINKLIST *p = head;
int i = 1;
while(i<=n&&p)
{
p = p->next;
i++;
}
return p;
}
// 根據使用者輸入的節點data值尋找節點
LINKLIST *LOCATE(LINKLIST *head,char data)
{
LINKLIST *p = head->next;
while(p&&(p->data!=data))
p = p->next;
return p;//這裡的p最終指向的已經是NULL了,沒找到不用賦值直接返回
}
// 插入操作,輸入一個n,在n-1位置插入(類似於陣列的插入,但是此處n>=2)
void INSERT(LINKLIST *head,int n,char data)
{
LINKLIST *inserted,*p;
inserted = (LINKLIST*)malloc(sizeof(LINKLIST));//給要插入的節點malloc
inserted->next = NULL;
inserted->data = data;
p = GET(head,n-1);//查詢插入元素的前一位數
if(p)
{
// 找到了該節點,開始插入
inserted->next = p->next;
p->next = inserted;
printf("insert successful!\n");
}else{
printf("insert fail\n");
}
}
// 刪除第n個元素
void DELETE(LINKLIST *head,int n)
{
LINKLIST *p,*q;
p = GET(head,n-1);//獲取到要刪除的前一位元素
if(p&&p->next)
{
q = p->next;
p->next = q->next;
free(q);
printf("delete success\n");
}else{
printf("delete fail\n");
}
}
// 判斷連結串列是否為空
int isEmpty(LINKLIST *head)
{
if(head->next)
return 1;
return 0;
}
// 單連結串列的列印
void listPrint(LINKLIST *head)
{
LINKLIST *p;
p = head->next;
if(!p){
printf("連結串列有誤!請檢查後再列印\n");
return;
}
while(p){
printf("%c->",p->data);
p = p->next;
}
printf("\n");
}
int main()
{
// LINKLIST *list = rCreate();
LINKLIST *list = INITLIST();
// LINKLIST *list = hCreate();
// LINKLIST *get = GET(list,1);
// LINKLIST *locate = LOCATE(list,'2');
// int emp = isEmpty(list);
// DELETE(list,4);
// INSERT(list,3,'i');
int len = LENGTH(list);
listPrint(list);
// printf("%d",emp);
printf("length=%d",len);
}
相關文章
- 資料結構__連結串列_單連結串列的初始化、插入、刪除、修改、查詢列印(基於C語言實現)資料結構C語言
- 資料結構_連結串列_單向迴圈連結串列 & 雙向連結串列的初始化、插入、刪除、修改、查詢列印(基於C語言實現)資料結構C語言
- 資料結構_連結串列_單向迴圈連結串列的初始化、插入、刪除、修改、查詢列印(基於C語言實現)資料結構C語言
- 資料結構_連結串列_雙向迴圈連結串列的初始化、插入、刪除、修改、查詢列印(基於C語言實現)資料結構C語言
- 資料結構_連結串列_雙向迴圈連結串列 & 棧 的初始化、插入、刪除、修改、查詢列印(基於C語言實現)資料結構C語言
- 單向迴圈連結串列——查詢、刪除、插入結點
- 雙向連結串列————查詢、刪除、插入結點
- 單向連結串列————遍歷、查詢、插入結點 (基於C語言實現)C語言
- 連結串列基礎2(超簡單)--單連結串列的插入和刪除
- C語言實現帶表頭結點單連結串列的初始化、查詢、插入、刪除、輸出、撤銷等操作C語言
- C\C++之用結構體實現連結串列的建立、遍歷、結點插入、結點刪除C++結構體
- 資料結構:單迴圈連結串列的建立插入與刪除資料結構
- 單向加頭連結串列的[構建、插入、刪除、查詢、輸出]
- C語言單向連結串列的增刪操作C語言
- C語言實現雙連結串列的(終端)新增和查詢C語言
- 為什麼陣列查詢比連結串列要快?而插入刪除比連結串列效率低陣列
- 連結串列-單連結串列實現
- (c語言實現)刪除有序連結串列中重複出現的元素C語言
- 單連結串列實現增刪改查
- 用c語言實現資料結構——單連結串列C語言資料結構
- 資料結構——單連結串列介面實現(C語言)資料結構C語言
- 【連結串列問題】刪除單連結串列的中間節點
- 單連結串列建立連結串列出現問題
- 資料結構之單連結串列的建立與刪除資料結構
- 資料結構_連結串列的原理與應用1_單連結串列(基於C語言實現)資料結構C語言
- c語言單向連結串列逆轉實現方法C語言
- 單連結串列的建立
- 雙向迴圈連結串列:(建立、插入、遍歷、求長、查詢、刪除、排序、銷燬)待測排序
- Go 語言介面及使用介面實現連結串列插入Go
- 【連結串列問題】打卡3:刪除單連結串列的中間節點
- 資料結構實驗之連結串列七:單連結串列中重複元素的刪除資料結構
- 連結串列入門與插入連結串列
- 單向連結串列的建立
- C語言線性連結串列C語言
- 【連結串列問題】打卡2:刪除單連結串列的第 K個節點
- C語言資料結構:單向迴圈連結串列的增刪操作C語言資料結構
- “c語言+結構體+連結串列”實現名片系統C語言結構體
- 單向迴圈連結串列介面設計(C語言)C語言