1. 程式人生 > >單鏈表基本操作的C語言實現(鏈式儲存結構)

單鏈表基本操作的C語言實現(鏈式儲存結構)

#include<stdio.h>
#include<stdlib.h>

typedef int DataType;

typedef struct Node{
    DataType data;
    struct Node *next;
}List;

#define Num 3

List* InitList();
void CreateListHead(List *l, int n);
void CreateListTail(List *l, int n);
int Length(List *l);
void TraverseList(List *l);
int Find(List *l, DataType d);
void Insert(List *l, int n, DataType data);
void Delete(List *l, int n);
void ClearList(List *l);

void main()
{
    int n, pos, input;
    List *l;

    l = InitList();

    /*CreateListHead(l, Num);
    printf("線性表的長度是%d\n", Length(l));
    TraverseList(l);*/

    CreateListTail(l, Num);
    printf("線性表的長度是%d\n", Length(l));
    TraverseList(l);

    //printf("%d %d %d %d\n", l->data, l->next->data, l->next->next->data, l->next->next->next->data);//分別列印各個節點的資料域

    printf("請輸入要查詢的元素:");
    scanf_s("%d", &input);
    printf("要查詢的元素在連結串列中第%d個位置\n", Find(l, input));
    
    printf("請輸入要插入的元素位置和相應資料:");
    scanf_s("%d%d", &pos, &input);
    Insert(l, pos, input);
    printf("線性表的長度是%d\n", Length(l));
    TraverseList(l);

    printf("請輸入要刪除的節點下標:");
    scanf_s("%d", &n);
    Delete(l, n);
    printf("線性表的長度是%d\n", Length(l));
    TraverseList(l);

    ClearList(l);
    printf("清空線性表後長度為%d\n", Length(l));
    TraverseList(l);

}

//連結串列初始化(即分配頭結點的記憶體空間)
List* InitList()
{
    List *l;
    l = (List*)malloc(sizeof(List));

    if (!l)
    {
        printf("初始化失敗");
        exit(1);
    }
    l->next = NULL;//頭結點指標域為空

    return l;
}

//建立帶頭結點的線性表(頭插法)
void CreateListHead(List *l, int n)
{
    int i, data;
    List *p;

    for (i = 0; i < n; i++)
    {
        p = (List*)malloc(sizeof(List));
        printf("請輸入資料:\n");
        scanf_s("%d", &data);
        p->data = data;
        p->next = l->next;//確定邏輯關係
        l->next = p;
    }
}

//建立帶頭結點的線性表(尾插法)
void CreateListTail(List *l, int n)
{
    int i, data;
    List *p,*r = l;

    for (i = 0; i < n; i++)
    {
        p = (List*)malloc(sizeof(List));
        printf("請輸入資料:\n");
        scanf_s("%d", &data);
        p->data = data;
        //p->next = r->next;
        r->next = p;//確定邏輯關係
        r = p;
    }
    r->next = NULL;
}

//求線性表的長度
int Length(List *l)
{
    List *r = l;//不要拿原指標計算
    int i = 0;

    while (r->next)
    {
        i++;
        r = r->next;
    }
    return i;
}

//遍歷線性表
void TraverseList(List *l)
{
    List *r = l;
    printf("連結串列中的元素依次為:");
    while (r->next)
    {
        r = r->next;
        printf("%d ", r->data);
    }
    printf("\n");
}

//查詢連結串列中某結點資料是否存在
int Find(List *l, DataType d)
{
    int i = 1;
    List *r = l;
    r = r->next;
    while (r && r->data != d)
    {
        r = r->next;
        i++;
    }
        
    if (!r)
        return 0;
    else
        return i;
}

//在連結串列中插入一個新節點(在第n個節點前插入)
void Insert(List *l, int n, DataType data)
{
    int i = 0;
    List *p, *r = l;

    while (r->next && i < n-1)//尋找第n-1個節點
    {
        r = r->next;
        i++;
    }

    if (r->next == NULL)
        printf("第%d個節點不存在", n);
    else
    {
        p = (List*)malloc(sizeof(List));//確定邏輯關係
        p->data = data;
        p->next = r->next;
        r->next = p;
    }
}

//刪除連結串列中某一節點
void Delete(List *l, int n)
{
    int i = 0;
    List *s, *r = l;

    while (r->next && i < n-1)//尋找第n-1個節點
    {
        r = r->next;
        i++;
    }

    if (r->next == NULL)
        printf("第%d個節點不存在", n);
    else
    {
        s = r->next;//確定待刪除節點
        r->next = s->next;//確定邏輯關係
        free(s);
    }
}

//清空連結串列(保留頭結點,指標域為NULL)
void ClearList(List *l)
{
    List *s, *r = l;
    while (r->next)
    {
        s = r->next;
        r->next = s->next;//確定邏輯關係
        free(s);
    }
}

相關推薦

單鏈基本操作C語言實現儲存結構

#include<stdio.h> #include<stdlib.h> typedef int DataType; typedef struct Node{ DataType data; struct Node *next; }

C++ 單鏈表基本操作分析與實現 連結串列   連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點連結串列中每一個元素稱為結點組成,結

連結串列   連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:一個是儲存資料元素的資料域,另一個是儲存下一個結點地址的指標域。 相比於線性表

單鏈基本操作c語言實現

#include<stdio.h> #define false 0 #define ok 1 //定義節點的結構 typedef struct node{ int data; struct node *next; }node; ty

線性及其應用C語言實現資料結構複習最全筆記

一、順序表的表示與實現 1.線性表的順序結構定義 #define LIST_INIT_SIZE 100 //線性表儲存空間的初始分配量 #define LISTINCREMENT 10 //線性表儲存空間的分配增量 typedef struct { ElemType* el

單鏈結點刪除 C語言實現

實現程式碼: #include<stdlib.h> #include<stdio.h> #define N 15 typedef struct linklist {

演算法與資料結構-棧的基本操作C語言實現

序言 複習棧的基本操作及其C語言實現,主要以鏈式棧為例。 本文將介紹棧的以下基本操作: 棧的建立(順序棧和鏈式棧) 棧的初始化 棧遍歷 棧清空/銷燬 判斷棧是否為空 求棧的長度 返回並刪除棧頂元素 1. 棧建立 - 順序棧和鏈式棧 //順序棧的

字串的基本操作,c語言實現

話不多說,直接上程式碼。如果有什麼錯誤,直接噴! #include <stdio.h> #include <stdlib.h> #define LEN 100 #define LENINC 10 int main() {     char strin

演算法與資料結構-佇列的基本操作C語言實現

序言 佇列有順序佇列和鏈式佇列,順序佇列通過陣列方式來實現,鏈式佇列通過連結串列方式來實現。 陣列方式實現便於資料訪問(大小和空間確定),連結串列方式實現便於資料操作(插入和刪除靈活)。 這裡介紹

處理機排程演算法C語言實現註釋得當!!

/* created by herbert on 10 Nov */ #include <iostream> #include <queue> #include <algorithm> #include <c

0x00資料結構——C語言實現棧+字尾表示式計算

0x00資料結構——C語言實現(棧) 棧的實現 /* 棧(tack)是限制插入和刪除只能在一個位置上進行的表,該位置是表的末端,叫做棧的頂(top)。 對棧的基本操作有Push(進棧)和Pop(出棧)。 Functions: (在連結串列中增加

佇列的C語言實現通過核心連結串列

0. 環境說明 本文的實驗環境是: win7作業系統+Keil 5 IDE. 非常適合嵌入式軟體開發 1. 打造自己的“list.h” 在微控制器程式開發中,有時候會用到佇列。能否設計一個通用的佇列呢?我想,可以把核心連結串列用起來。 以下程式碼是我

資料結構C語言實現佇列的6種演算法程式碼

#include <stdio.h>#include <stdlib.h>typedef int elemType;/************************************************************************//* 以下是關於佇列連

順序基本操作C語言實現詳解版

我們學習了順序表及初始化的過程,本節學習有關順序表的一些基本操作,以及如何使用 C 語言實現它們。 順序表插入元素 向已有順序表中插入資料元素,根據插入位置的不同,可分為以下 3 種情況: 插入到順序表的表頭; 在表的中間位置插入元素; 尾隨順序表中已有元素,作為順序表中的最後一個元素; 雖然資

資料結構c語言——線性單鏈基本操作

#include <stdio.h> #include <stdlib.h> typedef int Element; typedef char(*Status)[10]; #define ERROR "error" #define OK "ok"

《資料結構與演算法》-單鏈基本操作C語言實現

最近在學演算法內容,發現很多演算法依賴於基本的資料結構,所以從新溫習資料結構,記錄一下,以後知識點忘記可以提醒自己哪裡比較容易出錯。 所用教材《資料結構與演算法分析》by Mark Allen Weiss 《資料結構》(C語言

資料結構:順序基本操作 C語言

順序表   標頭檔案: Sqlist.h #include<stdio.h> #include<stdlib.h> #define SIZE 15 #pragma once typedef struct Sqlist { int elem[SIZ

c++學習筆記—單鏈基本操作實現

用c++語言實現的單鏈表基本操作,包括單鏈表的建立(包括頭插法和尾插法建表)、結點的查詢、刪除、排序、列印輸出、逆置、連結串列銷燬等基本操作。 IDE:vs2013 具體實現程式碼如下: #include "stdafx.h" #include <malloc.h

c++實現單鏈基本操作

程式媛決定好好學習寫程式碼 連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:一個是儲存資料元素的資料域,

基本操作java語言實現

auth ndb ack pan log 定義 pac ext col package com.baorant; public class JavaDemo { public static void main(String[] args) {

在STM32上實現NTFS之4:GPT分區C語言實現1:主GPT表頭的實現

center mbr分區 sum 對齊 字節數 決定 容器 alt 水平 題外話:在荒廢了很久沒有更新之後……某日突然收到讀者的站內信!內容大體是詢問GPT分區表信息的讀取方式,筆者激動萬分之下,決定繼續解剖NTFS……其實GPT嚴格上不算是NTFS的內容, GPT和M