單鏈表的創建和基本操作 C語言


創建單鏈表,首先要建立一個結構體,如下:

#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct Lnode{
    ElemType data;
    struct Lnode *next;
}Lnode,*LinkList;

創建鏈表,這里使用的是尾插法建立鏈表,它主要是在表尾不斷地添加新元素,直到輸入-1,然后退出。

LinkList CreatList()//創建列表 
{
    ElemType x;
    LinkList head,p,tail;
    head=(LinkList)malloc(sizeof(Lnode));
    head->next=NULL;
    tail=head;
    scanf("%d",&x);
    while(x!=-1){
        p=(LinkList)malloc(sizeof(Lnode));
        p->data=x;
        p->next=NULL;
        tail->next=p;
        tail=p;
        scanf("%d",&x); 
    }
    return head;
}

計算表長,運用遍歷,將鏈表的長度利用一個變量存儲,然后有指針存儲。

int LongList(LinkList head,int* length)//計算表長 第一個元素列表 第二個存儲表長 
{
    LinkList p;
    p=(LinkList)malloc(sizeof(Lnode));
    p=head->next;
    if(p==NULL){
        return 0;
    } 
    int i=1;
    while(p){
        p=p->next;
        i++;
    }
    *length=i-1;//因為每次先查詢后面的元素,所以i也把最后一個NULL加了進去,所以要減一 
    return 1;
}

插入元素,單鏈表插入元素,需要知道該位置的鏈表元素,然后先將插入元素的尾部連接到鏈表內,再將該節點的頭部接入。

int insert(LinkList head,int i,ElemType x)//插入 1鏈表 2插入位置 3插入元素 
{
    LinkList p,s;
    p=(LinkList)malloc(sizeof(Lnode));
    p=head->next;
    int j=1;
    while(p&&j!=i-1){
        p=p->next;
        j++;
    }
    if(p==NULL||j!=i-1){
        return 0;
    }
    s=(LinkList)malloc(sizeof(Lnode));
    s->data=x;
    s->next=p->next;
    p->next=s;
    return 1;
}

刪除元素,需要知道該元素前面位置的鏈表節點,然后進行刪除,並返回刪除元素,同時也要將該節點內存釋放。

int DelList(LinkList head,int i,ElemType *n)//刪除元素 1鏈表 2刪除位置 3記錄刪除元素 
{
    LinkList p,s;
    p=(LinkList)malloc(sizeof(Lnode));
    p=head->next;
    s=(LinkList)malloc(sizeof(Lnode));
    int j=1;
    while(j!=i-1&&p){
        p=p->next;
        j++;
    }
    if(j!=i-1||p->next==NULL){
        return 0;
    }
    s=p->next;
    p->next=s->next;
    *n=s->data;
    free(s);
    return 1;
}

查詢元素,利用遍歷列表,找到要查找位置的元素,並返回。

int search(LinkList head,int i,ElemType *n)//查找元素 1鏈表 2查找元素的位置 3該位置上的元素是什么 
{
    LinkList p;
    p=(LinkList)malloc(sizeof(Lnode));
    p=head->next;
    int j=1;
    while(j!=i&&p){
        p=p->next;
        j++;
    }
    if(p==NULL||j!=i){
        return 0;
    }
    *n=p->data;
    return 1;
}

輸出單鏈表所有元素。

void print(LinkList head)//輸出 
{
    LinkList p;
    p=head->next;
    while(p){
        printf("%d ",p->data);
        p=p->next;
    }
}

在該鏈表的創建和基本操作中,我都返回了0或1,其作用是測試單鏈表的操作是否符合規則,操作成功,返回1,失敗,返回0。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM