数据结构的C实现_单向链表

//L为头结点的单链表
#include <stdio.h>
#include <stdlib.h>
#define	OK 1
#define ERROR 0
typedef int elemType;//元素类型

//定义结点
typedef struct _LNode
{
	elemType data;
	struct _LNode *Next;
}LNode;

//尾插建立链表
void CreatList2(LNode *L,elemType e)
{
    LNode *s=(LNode*)malloc(sizeof(LNode));
    s->data=e;
    s->Next=NULL;
    LNode *p=L;
    while(p->Next!=NULL)
    {
        p=p->Next;
    }
    p->Next=s;
}

//遍历单链表
void TraverseList(LNode *L)
{
	LNode *p;
	p=L->Next;
	//printf("线性表La=");
	while(p)
	{
		printf("%d ",p->data);
		p=p->Next;
	}
	printf("\n");
}

//在第pos个位置前插入元素e
int ListInsert(LNode *L,int pos,elemType e)
{


	LNode *p;
	LNode *s=(LNode *)malloc(sizeof(LNode));
	int j=0;
	p=L;
	//printf("在第%d个位置前插入元素%d\n",pos,e);
	while(p&&j<pos-1)
	{
		p=p->Next;
		++j;
	}
	if(!p||j>pos-1) return ERROR;

	s->data=e;
	s->Next=p->Next;
	p->Next=s;
	return OK;
}

//删除第pos个位置上的元素,并返回其值
int ListDelete(LNode *L,int pos)
{
	LNode *p=L;
	LNode *q;
	int j=0;
	while(p->Next&&j<pos-1)
	{
		p=p->Next;
		++j;
	}
	if(j>pos-1||!p->Next)
		return ERROR;
	q=p->Next;
	p->Next=q->Next;
	//printf("删除的元素是:%d\n",q->data);
	free(q);
	return OK;
}

//查找函数
int ListSearch(LNode *L,elemType e)
{
    LNode *p=L->Next;
    int cursor=1;
    while(p->Next!=NULL)
    {
        if(p->data==e)
        {
            printf("找到,%d在第%d个位置\n",e,cursor);
            return cursor;
        }
        p=p->Next;cursor++;
    }//while
    printf("没找到\n");
}

//逆置单向链表
LNode *ListInverse(LNode *L)
{
    if(L==NULL)
    return NULL;
    if(L->Next==NULL) return L;
    LNode *pre=L->Next;
    LNode *cur=pre->Next;
    LNode *next=cur->Next;
    pre->Next=NULL;
    cur->Next=pre;
    pre=cur;
    cur=next;
    while(cur!=NULL)
    {
        next=cur->Next;
        cur->Next=pre;
        pre=cur;
        cur=next;
    }
    L->Next=pre;
    return L;
}

//单链表合并
LNode *MergeList(LNode *La,LNode *Lb,LNode *Lc)
{
    LNode *pa=La->Next;LNode *pb=Lb->Next;LNode *pc;
    Lc=pc=La;

    while(pa&&pb)
    {
        if(pa->data<=pb->data)
        {
            //printf("wrong1\n");
            pc->Next=pa;pc=pa;pa=pa->Next;
        }
        else
        {
            //printf("wrong2\n");
            pc->Next=pb;pc=pb;pb=pb->Next;
        }

    }//while
    pc->Next=pa?pa:pb;
    //printf("wrong3\n");
    free(Lb);
    return La;
}

int main()
{
    LNode *list1=(LNode*)malloc(sizeof(LNode));
    list1->Next=NULL;
    int nums;elemType x;
    scanf("%d",&nums);
    int i;
    for(i=0;i<nums;i++)
    {
        scanf("%d",&x);
        CreatList2(list1,x);
    }
    printf("创建好的线性表La=");
    TraverseList(list1);
    int pos;
    scanf("%d%d",&x,&pos);
    ListInsert(list1,pos,x);
    printf("插入一个元素后的线性表La=");
    TraverseList(list1);
    scanf("%d",&pos);
    ListDelete(list1,pos);
    printf("删除一个元素后的线性表La=");
    TraverseList(list1);
    scanf("%d",&x);
    ListSearch(list1,x);
    list1=ListInverse(list1);
    printf("逆置后的线性表La=");
    TraverseList(list1);
    LNode *list2=(LNode*)malloc(sizeof(LNode));
    list2->Next=NULL;
    scanf("%d",&nums);
    for(i=0;i<nums;i++)
    {
        scanf("%d",&x);
        CreatList2(list2,x);
    }
//    printf("线性表Lb=");
//    TraverseList(list2);

    LNode *list3;
    MergeList(list1,list2,list3);
    printf("合并La和Lb后的线性表=");
    TraverseList(list1);
    return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值