#include"stdio.h"
#include"stdlib.h"
typedef struct LNode
{
int data;
struct LNode *next;
}Lnode;
//尾插法建立单链表
void createListR(LNode *&C,int a[],int n)
{
LNode *s,*r;//s指向新申请的节点,r指向C的终端节点
C=(LNode *)malloc(sizeof(LNode));//申请头结点
C->next=NULL;
r=C;
int i;
for(i=0;i<n;i++)
{
s=(LNode *)malloc(sizeof(LNode));
s->data=a[i];
r->next=s;
r=r->next;
}
r->next=NULL;
}
//头插法
void createListL(LNode *&C,int a[],int n){
LNode *s;
C=(LNode *)malloc(sizeof(LNode));//申请头结点
C->next=NULL;
int i;
for(i=0;i<n;i++){
s=(LNode *)malloc(sizeof(LNode));
s->data=a[i];
//头插法关键2步,
s->next=C->next;
C->next=s;
}
}
//归并2个递增的单链表成一个非递减有序的单链表C
void merge(LNode *A,LNode *B,LNode *&C){
LNode *p=A->next;
LNode *q=B->next;
LNode *r; //始终指向C的尾节点
C=A; //将A的头结点来做C的头结点
C->next=NULL;
free(B);
r=C;
while(p!=NULL&&q!=NULL){
if(p->data<=q->data)
{
r->next=p;
p=p->next;
r=r->next;
}
else{
r->next=q;
q=q->next;
r=r->next;
}
r->next=NULL; //可以不写,下2个if语句必执行一个
if(p!=NULL) r->next=p;
if(q!=NULL) r->next=q;
}
}
//删除单链表中元素x
void deleteNode(LNode *&L,int x)
{
LNode *p,*pre; //pre为前驱结点,p为查找的结点。
p = L;
pre=L;
while(p->data != x) //查找值为x的元素
{
pre = p;
p = p->next;
}
pre->next = p->next; //删除操作,将其前驱next指向其后继。
free(p);
}
//查找x并删除
int findanddelete(LNode *&L,int x)
{
LNode *p,*q; //p为前驱结点,q为查找的结点。
p = L;
while(p->next!=NULL) //查找值为x的元素
{
if(p->next->data==x)
break;
p = p->next;
}
//查找部分结束
if(p->next==NULL)
return 0;
else
{
//删除操作,
q=p->next;
p->next=q->next; //将其前驱P的next指向其后继q的next
free(q);
return 1;
}
}
//在第i个位置插入元素
void insertList(LNode *&L,int i,int x)
{
LNode *pre; //pre为前驱结点
pre = L;
int tempi = 0;
for (tempi = 1; tempi < i; tempi++)
pre = pre->next; //查找第i个位置的前驱结点
LNode *p; //插入的结点为p
p = (LNode *)malloc(sizeof(LNode));
p->data = x;
p->next = pre->next;
pre->next = p;
}
//输出单链表
void printList(LNode *L)
{
LNode *p=L;
while(!p->next==NULL)
{
p=p->next;
printf("%d ",p->data);
}
printf("\n");
}
int main()
{
LNode *listA,*listB,*listC;
int a[]={0,1,2,4,5,7,8,9};
int b[]={3,6,10,15,17};
//根据a,b数组建立2个单链表
createListR(listA,a,8);
createListR(listB,b,5);
//打印单链表
printf("单链表A:");
printList(listA);
printf("\n单链表B:");
printList(listB);
//归并单链表并打印
merge(listA,listB,listC);
printf("\n合并后单链表C:");
printList(listC);
//删除元素x并打印
//deleteNode(listC,0);
findanddelete(listC,0);
printf("\n删除单链表C中元素:");
printList(listC);
//插入元素9
insertList(listC,1,9);
printf("\n单链表C中插入元素:");
printList(listC);
return 0;
}
数据结构--单链表
猜你喜欢
转载自blog.csdn.net/huanniangyuan5422/article/details/80862680
今日推荐
周排行