单链表操作

原创 2016年08月30日 11:00:15
/*************单链表的操作函数总结*****************/

#include <QCoreApplication>
#include <iostream>
#include <stdio.h>
#include <malloc.h>

using namespace std;

struct STU{
    char name[20];
    char stuno[10];
    int age;
    int score;
}stu[50];
typedef struct STU ElemType;

struct LNODE{
    ElemType data;
    struct LNODE *next;
};
typedef struct LNODE LNode;
typedef struct LNODE *LinkList;

/*比较两个链表元素的大小*/
int Less_EqualList(ElemType *e1,ElemType *e2)
{
    if(strcmp(e1->name,e2->name) <= 0)
        return 1;
    else
        return 0;
}

/*打印链表*/
int printList(LinkList L)
{
    LinkList p;
    p = L;
    printf("name       stuno        age     score\n");
    while(p->next)
    {
        p = p->next;
        printf("%-10s %s\t%d\t%d\n",p->data.name,p->data.stuno,p->data.age,p->data.score);
    }

    return 1;
}

/*节点初始化*/
int init(LinkList *L)
{
    //用malloc动态分配节点
    *L = (LNode *)malloc(sizeof(LNode));
    if(!L)     //若分配失败,返回
        return 0;
    //初始化数据域
    memset(&((*L)->data),0,sizeof(struct STU));
   
    //初始化指针域
    (*L)->next = NULL;
    return 1;
}

/*测试数据是否存在*/
int GetElem(LinkList L,int i,ElemType *e)
{
    LinkList p;
    int j;
    
    p = L->next;
    j = 1;
    
    while(p && j<i){
        p = p->next;
        ++j;
    }
    
    if(!p || j>1)
        return 0;
    
    *e = p->data;
    return 1;
}

/*向链表中插入数据*/
int ListInsert(LinkList L,int i,ElemType e)
{
    LinkList p,s;
    int j;
    
    p = L;
    j = 0;
    
    while(p && j<i-1){
        p = p->next;
        ++j;
    }
    
    if(!p || j>i-1)
        return 0;
    
    s = (LinkList)malloc(sizeof(LNode));
    s->data = e;
    
    s->next = p->next;
    p->next = s;

    return 1;
}

/*从链表中删除数据*/
int ListDelete(LinkList L,int i)
{
    LinkList p;
    int j;
    p = L;
    j = 0;
    while(p && j<i-1)
    {
        p = p->next;
        ++j;
    }
    if(!p || j>i-1)
        return 0;

    p->next = p->next->next;
    p->next->data = p->next->next->data;

    return 1;
}

/*合并两个链表*/
void MergeList(LinkList La,LinkList Lb,LinkList *Lc)
{
    /*合并单链表La和Lb到Lc中*/
    LinkList pa,pb,pc;
    pa = La->next;
    pb = Lb->next;
    *Lc = pc = La;

    while(pa && pb)
    {
        if(Less_EqualList(&pa->data,&pb->data))
        {
            pc->next = pa;
            pc = pa;
            pa = pa->next;
        }
        else
        {
            pc->next = pb;
            pc = pb;
            pb = pb->next;
        }
    }
    pc->next = pa?pa:pb;
    free(Lb);
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    
    struct STU e; //定义一个data
    LinkList La,Lb,Lc;
    printf("\n\n----------List Demo is running...----------\n\n");
    printf("First is InsertList function.\n");

    init(&La);
    strcpy(e.name,"stu1");
    strcpy(e.stuno,"100001");
    e.age = 80;
    e.score = 1000;
    ListInsert(La,1,e);

    strcpy(e.name,"stu3");
    strcpy(e.stuno,"100002");
    e.age = 80;
    e.score = 1000;
    ListInsert(La,2,e);

    printList(La);
    getchar();

    strcpy(e.name,"stu5");
    strcpy(e.stuno,"100003");
    e.age = 80;
    e.score = 1000;
    ListInsert(La,3,e);

    printList(La);
    getchar();

    init(&Lb);
    strcpy(e.name,"stu2");
    strcpy(e.stuno,"100001");
    e.age = 80;
    e.score = 1000;
    ListInsert(Lb,1,e);

    strcpy(e.name,"stu4");
    strcpy(e.stuno,"100002");
    e.age = 80;
    e.score = 1000;
    ListInsert(Lb,2,e);

    strcpy(e.name,"stu6");
    strcpy(e.stuno,"100001");
    e.age = 80;
    e.score = 1000;
    ListInsert(Lb,3,e);

    printList(Lb);
    getchar();

    MergeList(La,Lb,&Lc);
    printList(Lc);
    getchar();

    return a.exec();
}

版权声明:资源共阅,资源共享。

单链表基本操作详解

#  单链表基本操作 文中提到的内容的链接一并列在这里: 顺序表:http://blog.csdn.net/bitboss/article/details/51559175 冒泡排序:...
  • bitboss
  • bitboss
  • 2016年06月04日 22:12
  • 2869

数据结构 单链表操作(源代码)

//ChainList #include #include #include #include //包含strcmp()函数,不包含也可以,但会警告strcmp未定义返回值 #pragma wa...
  • u010286232
  • u010286232
  • 2014年04月21日 00:34
  • 1012

单链表的基本操作-----图形解析

首先我们需要思考的是为什么需要单链表呢? 单链表和顺序表相比较,又有什么优点呢? 在顺序表中,当我们需要头插,或者在顺序表的中间位置插入元素时,就必须将后面的元素一一后移,再将需要插入的元...
  • qq_34992845
  • qq_34992845
  • 2016年12月31日 01:12
  • 2540

数据结构实验一--单链表的基本操作的算法

1、 掌握单链表存储结构的类型定义; 2、 实现单链表各种基本运算的算法。 3、 实现单链表各种基本运算的算法以及改进实验代码。...
  • hu1020935219
  • hu1020935219
  • 2013年10月08日 18:38
  • 2331

Java中单链表的描述与对单链表的各种操作

首先创建结点类的描述/** * 结点类的描述 * * 单链表是由若干个结点连接而成,要实现单链表,首先需要设计结点类 * * 结点类由data和next组成 * * data是数据...
  • awozuiniu
  • awozuiniu
  • 2015年08月24日 10:51
  • 1476

数据结构实验报告单链表的基本操作

错误1 public void add(int idx,AnyType x){ Node newNode=new Node(x); if(headNode==null||idx==0){ newNod...
  • moonlululu
  • moonlululu
  • 2016年02月15日 16:57
  • 1539

数据结构 - C语言版 - 单链表 所有基本操作

C语言 - 单链表 所有基本操作 #include #include #include typedef struct OLNode { int data; struct OLNode * ...
  • u012495182
  • u012495182
  • 2013年11月11日 17:51
  • 1553

单链表的C实现及演示

单链表的C实现及演示
  • renjunsong0
  • renjunsong0
  • 2016年08月18日 21:45
  • 182

单链表面试题——基础篇

1.比较顺序表和链表的优缺点,说说它们分别在什么场景下使用 总结: 1.若线性表需要频繁查找,很少进行插入、删除操作,宜采用顺序存储结构。若需要频繁插入和删除时,宜采用单链表结构; 2.当线性表...
  • sssssuuuuu666
  • sssssuuuuu666
  • 2017年06月13日 17:37
  • 474

数据结构单链表的各种操作C++实现

//该程序实现了线性表的链式存储结构之单链表和各项操作 #include #include using namespace std;//****线性表和一些基础的定义***** #define E...
  • huafeihuazyr
  • huafeihuazyr
  • 2016年06月26日 20:53
  • 176
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:单链表操作
举报原因:
原因补充:

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