单链表的基本操作(留下你的小星星哦)
#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
typedef int Element;
typedef struct LNode
{
Element data;
struct LNode *next;
}LNode,*LinkList;
//初始化链表(头插法)
void init_LinkList(LinkList *L,int n)
{
LinkList fp;
fp = (LinkList )malloc(sizeof(LNode));
fp -> next = NULL;
int i;
for(i = 0;i < n;i ++){
LinkList p = (LNode *)malloc(sizeof(LNode));
printf("请输入该节点的信息:");
scanf("%d",&(p->data));
p -> next = fp -> next;
fp -> next = p;
}
fp->data = n;
*L = fp;
}
//插入数据
void LinkList_insert_node(LinkList L,int i,Element e)
{
LinkList p = L;
int j = 0;;
while(p != NULL && j < i - 1){
p = p->next;
j ++;
}
if(p == NULL || j > i - 1){
//小于1或大于表长加1
return ERROR;
}
LinkList
s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
L->data++;
}
//删除数据
void delete_data_in_LinkList(LinkList L,int i,Element *e)
{
LinkList p;
p = L;
int j = 0;
//插入和删除都是一样的,要找到删除位置的前一个节点
while(p != NULL && j < i - 1){
p = p -> next;
j ++;
}
if(p == NULL || j > i - 1){
return ERROR;
}
LinkList q;
q = p -> next;
p -> next = q -> next;
*e = q -> data;//将删除的元素进行返回
free(q);
L -> data --;
}
//打印链表
void print_LinkList(LinkList L)
{
int i;
LinkList p = L;
printf("***********开始打印*************\n");
for(i = 0;i < L->data;i ++){
p = p->next;
printf("%d\n",p->data);
}
}
//合并两个链表,产生一个新的链表,并且是非递减的顺序
void MergeList_L(LinkList La,LinkList Lb,LinkList *Lc)
{
//将La和Lb得到的新的单链表Lc,Lc的元素按值非递减排列
LinkList pa,pb,pc;
pa = La -> next;
pb = Lb -> next;
pc = La;
*Lc = pc;
pc -> data = La -> data + Lb -> data;
while(pa != NULL && pb != NULL){
if(pa -> data <= pb -> data){
pc -> next = pa;
pc = pa;
pa = pa -> next;
}else{
pc -> next = pb;
pc = pb;
pb = pb -> next;
}
}
if(pa == NULL){
pc -> next = pb;
}else{
pc -> next = pa;
}
//pc -> next = pa ? pa:pb;
free(Lb);
}
int main()
{
Element e;
LinkList L;
init_LinkList(&L,5);
print_LinkList(L);
LinkList_insert_node(L,1,1314);
print_LinkList(L);
delete_data_in_LinkList(L,3,&e);
print_LinkList(L);
printf("e:%d",e);
printf("===========================\n");
LinkList La,Lb,Lc;
printf("输入La链表的值\n");
init_LinkList(&La,5);
printf("输入Lb链表的值\n");
init_LinkList(&Lb,7);
MergeList_L(La,Lb,&Lc);
printf("打印Lc链表的值\n");
print_LinkList(Lc);
print_LinkList(La);
return 0;
}
输出结果