///链表的实现
///单链表存储
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#define ERROR -1
#define OK 1
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode, *LinkList;
void CreateList_L(LinkList &L,int n)
{
///逆位序输入n个元素的值,建立带表头结点的单链表线性表
L = (LinkList) malloc (sizeof(LNode));
L ->next = NULL; /// 先建立一个带头节点的单链表
for(int i=n ;i >0; --i){
LinkList p = (LinkList) malloc (sizeof(LNode)); /// 生成新的节点
scanf("%d", &p->data); /// 输入新的节点的值
p ->next = L->next;
L->next = p;
}
}
void Printf_L(LinkList L)
{
///输出单链表L
printf("该单链表值为:");
LinkList p = L->next;
while(p)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
printf("\n");
}
bool GetElem_L(LinkList L,int i,int &e)
{
///L为带头节点的头指针
///当第i个元素存在时,其赋值给e并返回OK,否则ERROR
LinkList p = L->next;
int j=1; /// 初始化p指向第一个节点,j计数器
while(p && j <i){
p = p->next; ++j;
}
if(!p || j>i) return ERROR;
e = p->data;
return OK;
}
bool ListInsert_L(LinkList &L, int i, int e)
{
///带头节点的单链表L中第i个位置之前插入元素e
LinkList p = L;
int j=0;
while(p && j < i-1) { p = p->next; ++j; } /// 寻找第i-1个节点
if(!p || j>i-1) return ERROR; /// i小于1或者大于表长加1
LinkList s = (LinkList) malloc (sizeof(LNode)); ///生成新的结点
s -> data = e; s -> next = p->next; ///插入L中
p -> next = s;
return OK;
}//ListInsert_L
bool ListDelete_L(LinkList &L, int i,int &e)
{
///在带头结点的单链表线性表L中,删除第i个元素,并有e返回其值
LinkList p = L;
int j=0;
while(p->next && j < i-1){ /// 寻找第i个节点,并令p指向其前驱
p = p->next; ++j;
}
if(!(p->next) || j > i-1) return ERROR; ///删除位置不合理
LinkList q = p->next; p->next = p->next->next; ///删除并释放节点
e = q->data; free(q);
return OK;
}
int MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc)
{
///已知单链线性表La和Lb的元素按值非递减排列
///归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列
LinkList pa = La->next, pb = Lb ->next;
LinkList pc = Lc = La; /// 用La的头节点作为Lc的头节点
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); ///释放Lb的头结点
}///MergeList_L
int main()
{
int n;
LinkList L;
printf("请输入要输入节点个数:");
scanf("%d",&n);
CreateList_L(L,n);
Printf_L(L);
///测试GetElem
int e,i;
printf("输入要找的元素的i:");
scanf("%d",&i);
GetElem_L(L,i,e);
printf("该元素是%d\n",e);
printf("\n");
///测试ListInsert_L
printf("请输入要插入的位置:");
scanf("%d",&i);
printf("请输入要要插入的值:");
scanf("%d",&e);
ListInsert_L(L,i,e);
Printf_L(L);
///测试ListDelete_L
printf("请输入要删除的元素的位序:");
scanf("%d",&i);
ListDelete_L(L,i,e);
Printf_L(L);
///测试MergeList_L
LinkList Lb;
printf("请输入Lb要输入节点个数:");
scanf("%d",&n);
CreateList_L(Lb,n);
Printf_L(Lb);
LinkList Lc;
MergeList_L(L,Lb,Lc);
printf("Lc");
Printf_L(Lc);
return 0;
}
(数据结构第二章)线性链表的实现
最新推荐文章于 2024-06-08 16:55:40 发布
本文详细介绍了单链表的基本操作,包括创建、遍历、获取元素、插入元素、删除元素等核心方法,并提供了完整的C语言实现示例。此外,还展示了如何通过归并两个有序链表来生成一个新的有序链表。
863

被折叠的 条评论
为什么被折叠?



