本例为纯C语言实现,所用编译器为C编译器,非C++编译器
线性表的链式(链表)表示与实现
单向链表
// 本例为纯C语言实现,所用编译器为C编译器,非C++编译器
// 线性表的链式(链表)表示与实现
// 单向链表
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
LinkList createLinkListNode( LinkList L, int n );
int getLinkListElem( LinkList L, int i, int* e );
int insertLinkListNode( LinkList L, int i, int e );
int deleteLinkListNode( LinkList L, int i, int* e);
LinkList mergeLinkList(LinkList La, LinkList Lb, LinkList Lc);
int main(){
int ee;
int* e = ⅇ
LinkList La,Lb,Lc,p;
printf("请输入链表La各元素的值: \n");
if(La=createLinkListNode(La,3)){
getLinkListElem(La,2,e);
printf("第2个元素为: %d\n",*e);
}
printf("\n");
if(insertLinkListNode(La,2,22)){
p = La->next;
printf("插入第2个元素后的链表La为: \n");
while(p){
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
printf("\n");
if(deleteLinkListNode(La,2,e)){
printf("第2个元素为: %d\n",*e);
p = La->next;
printf("删除第2个元素后的链表La为: \n");
while(p){
printf("%d ",p->data);
p = p->next;
}
printf("\n");
deleteLinkListNode(La,5,e);
}
printf("\n");
printf("请输入链表Lb各元素的值: \n");
Lb = createLinkListNode(Lb,4);
if(Lb){
p = Lb->next;
printf("链表Lb为: \n");
while(p){
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
Lc = mergeLinkList(La, Lb, Lc);
p = Lc->next;
printf("La和Lb合并后的链表Lc为: \n");
while(p){
printf("%d ",p->data);
p = p->next;
}
printf("\n");
return 0;
}
LinkList createLinkListNode( LinkList L, int n ){
// 顺序输入n个元素的值, 建立带表头节点的线性表L
// 节点创建成功返回线性表L的地址, 失败返回NULL
int i;
LinkList p,q;
// 创建头结点
L = (LinkList)malloc(sizeof(LNode));
if(!L){
printf("创建头结点失败!\n");
return NULL;
}
L->next = NULL;
// 输入n个元素的值
q = L;
for( i=1; i<=n; i++ ){
p = (LinkList)malloc(sizeof(LNode)); // 建立一个新的节点
if(!p){
printf("创建新节点失败!\n");
return NULL;
}
printf("请输入第%d个元素的值: \n",i);
scanf("%d",&p->data); // 输入元素的值
/* 逆序输入建立链表
p->next = L->next;
L->next = p;
*/
// 顺序输入建立链表
p->next = q->next;
q->next = p;
q = p;
}
return L;
}
int getLinkListElem( LinkList L, int i, int* e ){
// 获取链表中第i个元素的值
int j=1; // while循环所用
LinkList p;
p = L->next; // 指针p指向第一个节点
while(p && j<i){
p = p->next;
j++;
}
if( !p || j>i ){
printf("第%d个元素不存在!\n", i);
return 0;
}
*e = p->data; // 将第i个元素赋值给指针e所指向的地址
return 1;
}
int insertLinkListNode( LinkList L, int i, int e ){
// 在带头结点的链表的第i个结点之前插入元素e
int j=1;
LinkList s,p;
p = L;
while( p && j<i ){
p = p->next;
j++;
}
if( !p || j>i ){
printf("插入结点位置错误!\n");
return 0;
}
s = (LinkList)malloc( sizeof(LNode) );
if( !s ){
printf("插入结点时创建新节点失败!\n");
return 0;
}
s->data = e;
s->next = p->next;
p->next = s;
return 1;
}
int deleteLinkListNode( LinkList L, int i, int* e){
// 在带头结点的链表中删除第i个元素, 将其赋值给e所指向的地址
int j=1;
LinkList q,p = L;
while( p->next && j<i ){
p = p->next;
j++;
}
if( !(p->next) || j>i ){
printf("未找到第%d个结点!\n",i);
return 0;
}
q = p->next;
*e = q->data;
p->next = p->next->next;
free(q);
return 1;
}
LinkList mergeLinkList(LinkList La, LinkList Lb, LinkList Lc){
// 链表La和Lb皆为非递减排列
// 按非递减排列合并链表La和Lb, 得到新的线性表Lc
LinkList pa,pb,pc;
pa = La->next;
pb = Lb->next;
pc = Lc = La;
// 合并链表
while( pa && pb ){
if( pa->data<pb->data ){
pc->next = pa;
pa = pa->next;
pc = pc->next;
}
else{
pc->next = pb;
pb = pb->next;
pc = pc->next;
}
}
pc->next = pa?pa:pb;
free(Lb);
return Lc;
}