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

原创 2012年03月22日 18:24:35
//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;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

学习心得:链表的操作(C语言实现)

今天将给大家讲述链表的学习心得。学习数据结构,毋庸置疑链表必须学好,后面的栈、队列、树、图都是以链表为基础的;链表的种类很多,有单链表、双链表、循环链表、非循环链表;在此,我们以非循环单链表为例,来讲...

数据结构--单向链表C实现

链表是非常重要的数据结构,它是动态地分配内存和动态增删的一种数据结构。与数组比起来 数组需要连续的存储空间,而且大小固定(至少c是这样)不够灵活,但是优点就是访问速度快 。 (因为是连续的地址空间,访...

Linux C 数据结构---链表(单向链表)

上一篇我们讲到了线性表,线性表就是数据元素都一一对应,除只有唯一的前驱,唯一的后继。        线性表存储结构分为顺序存储、链式存储。        顺序存储的优点: ...

Linux C 数据结构---链表(单向链表)

上一篇我们讲到了线性表,线性表就是数据元素都一一对应,除只有唯一的前驱,唯一的后继。        线性表存储结构分为顺序存储、链式存储。       ...

数据结构单向链表

数据结构的基础-单向链表所构造的栈 c++实现

第一次写博客,也同时在学算法,在这里我将把最近学习的算法写出,尽量生动,以此代表学习的轨迹,也希望能帮助到大家,谢谢! 也希望有专家指出我的错误,以及可优化的地方,感激不尽! 下面,我将刚写的 单...

【数据结构】单向循环链表实现

#include #include #include typedef struct Linklist{ int data; struct Linklist *next; }LL; LL *cre...

C语言数据结构之单向链表(已经调试可以实现相应的功能了,可是还是有几个问题现在还是不大理解,希望大家能够一起探讨)

#include #include typedef struct NodeStruct {     int num;     struct NodeStruct *next; }Nod...

数据结构学习系列三-单向循环链表(c++实现且应用模板)

单向循环链表且带模板的实现真正意义上c++实现节点数据结构采用class形式,为了方便操作数据结构用public。#include using namespace std; /*1 应用模板 2使...

【数据结构|剑指Offer】单向链表的各项操作实现

本博文着重实现《剑指Offer》上面的单向链表操作。 //数据结构 struct ListNode { int data; ListNode *next; ListNode(int x) :d...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)