共计 1961 个字符,预计需要花费 5 分钟才能阅读完成。
单链表是不同于顺序表的另一种线性结构,每一个结点包含了数据域和指针域,可通过每一结点的指针域直接访问下一个结点,顾名思义,是一种链式结构。
本次实现的功能包括:
- 构建空表
- 插入元素
- 删除元素
- 查找元素
- 交换相邻元素
#include<stdio.h>
#include<stdlib.h>
#include "malloc.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef struct LNode{
int data;
struct LNode *next;
}LNode,* Linklist;
Status InitList(Linklist &L){
// 构造空表
L = (Linklist)malloc(sizeof(LNode));
L->data = NULL;
L->next = NULL;
}
Status ListInsert_L(Linklist &L,int i){
// 在带头结点的单链线性表 L 中第 i 个位置插入键盘输入的数
int e,j = 0;
scanf("%d",&e);
Linklist p;
p = L;
while(p && j < i-1){p = p->next; ++j;} // 找到链表中第 i - 1 个元素
if(!p || j>i-1)return ERROR;
Linklist s = (Linklist)malloc(sizeof(LNode));
s->data = e;s->next = p->next;
p->next = s;
return OK;
}
Status Elem_search(Linklist L){
// 查找链表中指定元素
printf("您要查找哪个位置的数 \n");
int i,j = 0;
Linklist p = L;
scanf("%d",&i);
while(p && j < i) {p = p->next;++j;} // 找到链表中第 i 个元素
if(!p || j > i)return ERROR;
printf("您查找的数是:%d\n",p->data);
return OK;
}
Status List_print(Linklist L){
// 打印链表
Linklist p;
p = L;
printf("现有的单链表为:\n");
p = p->next;
while(p->next != NULL) {printf("%d",p->data);p = p->next;}
printf("%d",p->data);
printf("\n");
return OK;
}
Status ListDelete_L(Linklist &L){
// 删除指定元素,并输出
printf("请输入要删除元素的位置:\n");
int i;
scanf("%d",&i);
Linklist p = L;
int j = 0;
while(p->next && j<i-1){p = p->next;++j;} // 找到链表中第 i - 1 个元素
if(!(p->next)||j>i-1)return ERROR; // 保证链表有第 i 个元素
Linklist q = p->next;
p->next = q->next;
printf("%d 被删除了 \n",q->data);
free(q);
return OK;
}
Status List_exchange(Linklist &L){
// 交换指定元素与他后面一个元素的值
printf("请输入要交换元素的位置:\n");
int a,b,j = 0;
scanf("%d",&a);
Linklist p = L;
while(p && j<a){p = p->next;++j;} // 找到链表第 a 个元素
if(!(p->next)||j>a)return ERROR; // 保证链表有第 a + 1 个元素
b = p->data;p->data = p->next->data;p->next->data = b;
printf("位置 %d 和位置 %d 交换了 \n",a,a+1);
return OK;
}
int main(){
Linklist L;
InitList(L);
printf("请依次输入四个整数:\n");
for(int r=1;r <= 4;r++)ListInsert_L(L,r);
List_print(L);
printf("请输入插入的位置和数 ( 用换行分开):\n");
int a;
scanf("%d",&a);
ListInsert_L(L,a);
List_print(L);
Elem_search(L);
ListDelete_L(L);
List_print(L);
List_exchange(L);
List_print(L);
}
单链表的基本操作和顺序表无异,但需要注意:访问顺序表中某一个元素时可直接访问,访问单链表中的某一元素则需要从头结点依次访问。
所用的编译器是 dev c++.
正文完