单链表的创建和基本操作 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。