单链表结构体及状态码定义
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
#define ElemType int //自定义数据类型
typedef int Status; //定义状态码类型
#define OK 1 //完成
#define OVERFLOW 0 //失败
#define ERROR 0 //错误
//单链表的结构体
typedef struct LNode {
ElemType data; //数据
struct LNode* next; //下一个数据地址
}LNode,*Linklist;
表尾插入创建单链表
//从表尾到表头逆向建立单链表
Linklist CreateList(Linklist L, int n) {
//逆位序输入n个元素的值,建立带表头结点的单链表L
L = (Linklist)malloc(sizeof(LNode));
L->next = NULL;
LNode* s = NULL;
LNode* t = L;
int data;
for (int i = 0; i < n; i++) {
s = (Linklist)malloc(sizeof(LNode));
printf("请输入:");
scanf("%d",&data);
s->next = NULL;
s->data = data;
t->next=s;
t = s;
}
printf("创建成功\n");
return L;
}
获取第i个元素
//获取某个元素
Status GetElem(Linklist L, int i) {
//L为带头结点的单链表的头指针
Linklist p;
p = L->next; //初始化,p指向第一个结点
int j = 1; //j是计数器
while (p && j < i) { //顺指针向后查找,直到p指向第i个元素或p为空
p = p->next;
j++;
}
if (!p || j > i) {
printf("获取失败\n");
return(ERROR); //第i个元素不存在
}
printf("第%d个元素是%d\n", i, p->data);
return OK;
}
插入
//插入结点:在第i位置之前插入元素e
Status ListInsert(Linklist L, int i, ElemType e) {
Linklist p;
p = L;
int j = 0;
while (p && j < i - 1) { //寻找第i-1个结点
p = p->next;
j++;
}
if (!p || j > i - 1) { //i小于1或者大于表长+1
printf("插入失败\n");
return ERROR;
}
Linklist s = (Linklist)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
printf("在第%d个位置插入元素%d\n", i, e);
return OK;
}
删除结点
//删除结点:删除第i个结点
Status ListDelete(Linklist L, int i) {
Linklist p;
p = L;
int j = 0;
while (p->next&&j<i-1) //寻找第i个结点,并令p指向其前驱
{
p = p->next;
j++;
}
if (!(p->next) || j > i - 1) { //删除位置不合理
printf("删除失败\n");
return ERROR;
}
LNode* q;
q = p->next;
p->next = q->next;
free(q);
printf("删除成功\n");
return OK;
}
合并链表
//合并链表
Linklist MergeList(Linklist La, Linklist Lb) {
//把La和Lb归并为一个新的Lc,按非递减排列
Linklist pa, pb,pc,Lc;
pa = La->next;
pb = Lb->next;
Lc = pc = La;
while (pa&&pb)
{
if (pa->data <= pb->data) {
pc->next = pa;
pc = pa;
pa = pa->next;
}
else
{
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
pc->next = pa ? pa : pb;
free(Lb);
printf("合并成功\n");
return Lc;
}
顺序输出链表
//顺序输出单链表
void PrintList(Linklist L) {
Linklist p=L;
printf("单链表为:");
while (p->next!=NULL)
{
p = p->next;
printf("%d\t", p->data);
}
printf("\n打印成功\n");
}
完整代码
#include <stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
#define ElemType int //自定义数据类型
typedef int Status; //定义状态码类型
#define OK 1 //完成
#define OVERFLOW 0 //失败
#define ERROR 0 //错误
//单链表的结构体
typedef struct LNode {
ElemType data; //数据
struct LNode* next; //下一个数据地址
}LNode,*Linklist;
//获取某个元素
Status GetElem(Linklist L, int i) {
//L为带头结点的单链表的头指针
Linklist p;
p = L->next; //初始化,p指向第一个结点
int j = 1; //j是计数器
while (p && j < i) { //顺指针向后查找,直到p指向第i个元素或p为空
p = p->next;
j++;
}
if (!p || j > i) {
printf("获取失败\n");
return(ERROR); //第i个元素不存在
}
printf("第%d个元素是%d\n", i, p->data);
return OK;
}
//插入结点:在第i位置之前插入元素e
Status ListInsert(Linklist L, int i, ElemType e) {
Linklist p;
p = L;
int j = 0;
while (p && j < i - 1) { //寻找第i-1个结点
p = p->next;
j++;
}
if (!p || j > i - 1) { //i小于1或者大于表长+1
printf("插入失败\n");
return ERROR;
}
Linklist s = (Linklist)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
printf("在第%d个位置插入元素%d\n", i, e);
return OK;
}
//删除结点:删除第i个结点
Status ListDelete(Linklist L, int i) {
Linklist p;
p = L;
int j = 0;
while (p->next&&j<i-1) //寻找第i个结点,并令p指向其前驱
{
p = p->next;
j++;
}
if (!(p->next) || j > i - 1) { //删除位置不合理
printf("删除失败\n");
return ERROR;
}
LNode* q;
q = p->next;
p->next = q->next;
free(q);
printf("删除成功\n");
return OK;
}
//从表尾到表头逆向建立单链表
Linklist CreateList(Linklist L, int n) {
//逆位序输入n个元素的值,建立带表头结点的单链表L
L = (Linklist)malloc(sizeof(LNode));
L->next = NULL;
LNode* s = NULL;
LNode* t = L;
int data;
for (int i = 0; i < n; i++) {
s = (Linklist)malloc(sizeof(LNode));
printf("请输入:");
scanf("%d",&data);
s->next = NULL;
s->data = data;
t->next=s;
t = s;
}
printf("创建成功\n");
return L;
}
//合并链表
Linklist MergeList(Linklist La, Linklist Lb) {
//把La和Lb归并为一个新的Lc,按非递减排列
Linklist pa, pb,pc,Lc;
pa = La->next;
pb = Lb->next;
Lc = pc = La;
while (pa&&pb)
{
if (pa->data <= pb->data) {
pc->next = pa;
pc = pa;
pa = pa->next;
}
else
{
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
pc->next = pa ? pa : pb;
free(Lb);
printf("合并成功\n");
return Lc;
}
//顺序输出单链表
void PrintList(Linklist L) {
Linklist p=L;
printf("单链表为:");
while (p->next!=NULL)
{
p = p->next;
printf("%d\t", p->data);
}
printf("\n打印成功\n");
}
void main() {
Linklist L=NULL;
L=CreateList(&L, 4);
PrintList(L);
GetElem(L, 2);
ListInsert(L, 2, 3);
PrintList(L);
ListDelete(L, 2);
PrintList(L);
/*Linklist Lb = NULL;
Linklist Lc = NULL;
Lb = CreateList(&Lb, 5);
Lc = MergeList(L, Lb);
PrintList(Lc);*/
}
代码演示