实现单链表的基本操作(c语言)

目录

链表介绍

一、实现单链表的具体操作

二、各功能实现函数详解

1.定义链表数据元素

2.创建单链表

①头插法

②尾插法

3.插入结点

4.删除结点

5.查找结点

6. 销毁链表

7.打印链表

总代码



链表介绍

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) +指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。


一、实现单链表的具体操作

  1. 定义链表元素
  2. 创建单链表:①头插法 ②尾插法
  3. 按位序插入结点
  4. 按位序删除结点
  5. 按位查找结点
  6. 销毁顺序表
  7. 打印链表

二、各功能实现函数详解

1.定义链表数据元素

代码如下(示例):

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
//定义结点
typedef struct LNode{
int data; //数据域
struct LNode * next;//指针域
}* LinkList,LNode;

2.创建单链表

①头插法

代码如下(示例):

void CreatList(LinkList * L){
LinkList p,s;
p=*L=(LinkList)malloc(sizeof(LNode)); //创建头结点
p->next=NULL; //将头节点的指针指向NULL,防止存在遗留的脏数据
int x;
printf("请输入元素,选择0即停止输入\n");
scanf("%d",&x);
while(x){
    s=(LinkList)malloc(sizeof(LNode));//创建新的结点
    s->data=x; //将数据赋值给新结点的数据域
    s->next=p->next;
    p->next=s;
    scanf("%d",&x);
}
}

②尾插法

代码如下(示例):

void CreatList1(LinkList * L){
LinkList p,s;
*L=(LinkList)malloc(sizeof(LNode)); //创建头结点
p=*L; //创建一直指向表尾的指针
p->next=NULL; //将头节点的指针指向NULL,防止存在遗留的脏数据
int x;
printf("请输入元素,选择0即停止输入\n");
scanf("%d",&x);
while(x){
    s=(LinkList)malloc(sizeof(LNode));//创建新的结点
    s->data=x; //将数据赋值给新结点的数据域
    p->next=s;
    p=s;
    scanf("%d",&x);
}
p->next=NULL;
}

3.插入结点

void InsertList(LinkList * L,int i ,int e){
if(i<1)
    return;
LNode * p=*L; //p为指向当前结点的指针
int j =0; //p指针指向的当前结点,当前位置为头结点
while(p!=NULL && j<i-1){
    p=p->next;
    j++;
}
LNode * s=(LNode *)malloc(sizeof(LNode));  //创建新结点
s->data = e;
s->next = p->next;
p->next =s;
}

4.删除结点

void DeleteList(LinkList * L,int i){
if(i<1)
    return;
LNode * p=*L; //p为指向当前结点的指针
int j =0; //p指针指向的当前结点,当前位置为头结点
while(p!=NULL && j<i-1){
    p=p->next;
    j++;
}
if(p->next==NULL)
    return;
LNode * s=(LNode *)malloc(sizeof(LNode));
s=p->next;
p->next=s->next;
free(s);
}

5.查找结点

void SearchList(LinkList * L,int i){
if(i<1)
    return;
LNode * p=*L; //p为指向当前结点的指针
int j =0; //p指针指向的当前结点,当前位置为头结点
while(p!=NULL && j<i-1){
    p=p->next;
    j++;
}
printf("该值为%d",p->next->data);
}

6. 销毁链表

void DestoryList(LinkList * L){
LinkList p,temp;
p=(*L)->next;//从第一个结点开始
while(p!=NULL){
temp=p->next;
free(p);
p=temp;
}
(*L)->next=NULL; //让头结点指针指向NULL

}

7.打印链表

void PrintList(LinkList  L){
LinkList p=L->next;
while(p!=NULL){
    printf("%d ",p->data);
    p=p->next;
}
printf("\n");
}

总代码

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
//定义结点
typedef struct LNode{
int data; //数据域
struct LNode * next;//指针域
}* LinkList,LNode;
//函数声明
void CreatList(LinkList * L);//头插法建立链表
void CreatList1(LinkList * L);//尾插法建立链表
void InsertList(LinkList * L,int i ,int e);//插入结点
void DeleteList(LinkList * L,int i);//删除结点
void SearchList(LinkList * L,int i);//按位序查找结点
void DestoryList(LinkList * L);//销毁链表
void DestoryList(LinkList * L);//打印链表


//头插法建立单链表
void CreatList(LinkList * L){
LinkList p,s;
p=*L=(LinkList)malloc(sizeof(LNode)); //创建头结点
p->next=NULL; //将头节点的指针指向NULL,防止存在遗留的脏数据
int x;
printf("请输入元素,选择0即停止输入\n");
scanf("%d",&x);
while(x){
    s=(LinkList)malloc(sizeof(LNode));//创建新的结点
    s->data=x; //将数据赋值给新结点的数据域
    s->next=p->next;
    p->next=s;
    scanf("%d",&x);
}
}
//尾插法创建单链表
void CreatList1(LinkList * L){
LinkList p,s;
*L=(LinkList)malloc(sizeof(LNode)); //创建头结点
p=*L; //创建一直指向表尾的指针
p->next=NULL; //将头节点的指针指向NULL,防止存在遗留的脏数据
int x;
printf("请输入元素,选择0即停止输入\n");
scanf("%d",&x);
while(x){
    s=(LinkList)malloc(sizeof(LNode));//创建新的结点
    s->data=x; //将数据赋值给新结点的数据域
    p->next=s;
    p=s;
    scanf("%d",&x);
}
p->next=NULL;
}
//插入结点
void InsertList(LinkList * L,int i ,int e){
if(i<1)
    return;
LNode * p=*L; //p为指向当前结点的指针
int j =0; //p指针指向的当前结点,当前位置为头结点
while(p!=NULL && j<i-1){
    p=p->next;
    j++;
}
LNode * s=(LNode *)malloc(sizeof(LNode));  //创建新结点
s->data = e;
s->next = p->next;
p->next =s;
}
//按位序查找结点
void SearchList(LinkList * L,int i){
if(i<1)
    return;
LNode * p=*L; //p为指向当前结点的指针
int j =0; //p指针指向的当前结点,当前位置为头结点
while(p!=NULL && j<i-1){
    p=p->next;
    j++;
}
printf("该值为%d\n",p->next->data);
}
//删除结点
void DeleteList(LinkList * L,int i){
if(i<1)
    return;
LNode * p=*L; //p为指向当前结点的指针
int j =0; //p指针指向的当前结点,当前位置为头结点
while(p!=NULL && j<i-1){
    p=p->next;
    j++;
}
if(p->next==NULL)
    return;
LNode * s=(LNode *)malloc(sizeof(LNode));
s=p->next;
p->next=s->next;
free(s);
}
//销毁链表
void DestoryList(LinkList * L){
LinkList p,temp;
p=(*L)->next;//从第一个结点开始
while(p!=NULL){
temp=p->next;
free(p);
p=temp;
}
(*L)->next=NULL; //让头结点指针指向NULL
//free(*L); 销毁头结点;

}
//打印链表
void PrintList(LinkList  L){
LinkList p=L->next;
while(p!=NULL){
    printf("%d ",p->data);
    p=p->next;
}
printf("\n");
}


int main(){
printf("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t请输入下列你想要的操作\t\t\n");
printf("\t\t1.创建链表\t\t\t2.插入结点\t\t\t3.删除结点\t\t\t\n\t\t4.按位查找\t\t\t5.销毁链表\t\t\t6.打印链表\n\t\t0.退出程序\n ");
int command,num;
int e;//输入的所需要查找的数值
int i,a,b,c;//a为输入插入的位置,b为插入的数值,c为需要删除的位置
LinkList L;
do{
scanf("%d",&command);
switch(command)
{
    case 1:
            printf("请选择头插法(1)还是尾插法(2)\n<1-2>\n");
            scanf("%d",&num);
            if(num==1) CreatList(&L);
            else if(num==2) CreatList1(&L);
            else printf("输入有误,请重新输入:");
            break;
    case 2: printf("请输入您需要插入的序列:\n");
            scanf("%d",&a);
            printf("请输入需要插入的元素:\n");
            scanf("%d",&b);
            InsertList(&L,a,b);
            break;
    case 3: printf("请输入您需要删除的内容的序号:");
            scanf("%d",&c);
            DeleteList(&L,c);
            break;
    case 4: printf("请输入需要查找的位置:");
            scanf("%d",&i);
            SearchList(&L,i);
            break;
    case 5: DestoryList(&L);    break;
    case 6: PrintList(L); break;
    case 0: printf("退出成功"); break;

}
}while(command);
}

  • 23
    点赞
  • 138
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
单链表是一种常见的数据结构,用于存储一系列的元素。在C语言中,可以通过定义一个结构体来表示单链表的节点,每个节点包含一个数据域和一个指针域,指向下一个节点。 首先,我们需要定义单链表的节点结构体: ```c struct ListNode { int data; // 数据域 struct ListNode* next; // 指针域,指向下一个节点 }; ``` 接下来,我们可以实现一些基本操作,比如创建单链表、插入节点、删除节点和遍历单链表等。 创建单链表的函数如下所示,可以根据给定的数组创建一个单链表: ```c struct ListNode* createLinkedList(int arr[], int size) { struct ListNode* head = NULL; // 头节点指针 struct ListNode* tail = NULL; // 尾节点指针 for (int i = 0; i < size; i++) { struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode)); newNode->data = arr[i]; newNode->next = NULL; if (head == NULL) { head = newNode; tail = newNode; } else { tail->next = newNode; tail = newNode; } } return head; } ``` 插入节点的函数如下所示,可以在指定位置插入一个新节点: ```c void insertNode(struct ListNode** head, int data, int position) { struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode)); newNode->data = data; newNode->next = NULL; // 插入到链表头部 if (position == 0) { newNode->next = *head; *head = newNode; return; } struct ListNode* curr = *head; struct ListNode* prev = NULL; int count = 0; // 找到插入位置的前一个节点 while (curr != NULL && count < position) { prev = curr; curr = curr->next; count++; } // 插入到链表中间或尾部 if (curr != NULL) { newNode->next = curr; } prev->next = newNode; } ``` 删除节点的函数如下所示,可以删除指定位置的节点: ```c void deleteNode(struct ListNode** head, int position) { if (*head == NULL) { return; } struct ListNode* curr = *head; struct ListNode* prev = NULL; int count = 0; // 找到要删除的节点 while (curr != NULL && count < position) { prev = curr; curr = curr->next; count++; } // 删除头节点 if (prev == NULL) { *head = curr->next; } else { prev->next = curr->next; } free(curr); } ``` 遍历单链表的函数如下所示,可以将单链表中的元素依次输出: ```c void traverseLinkedList(struct ListNode* head) { struct ListNode* curr = head; while (curr != NULL) { printf("%d ", curr->data); curr = curr->next; } } ``` 以上是单链表基本操作实现,你可以根据需要调用这些函数进行单链表的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值