单链表操作

原创 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();
}

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

单链表的实现-简单操作

  • 2016年11月18日 22:50
  • 401KB
  • 下载

笔试面试常考数据结构-单链表常用操作编程实现

单链表是笔试以及面试手写代码中常考的数据结构之一。下面实现了单链表的常见操作:创建单链表、删除节点、打印单链表(包括正向打印以及逆向打印)、反转单链表、找出单链表的倒数第K个节点、合并两个有序单链表等...

单链表操作

  • 2015年08月07日 17:33
  • 2KB
  • 下载

单链表的操作

  • 2014年02月28日 19:21
  • 4KB
  • 下载

单链表的建立,实现和操作

文中引用了一个单链表就地逆序的算法,在下资质愚钝想了半天没想出来,感谢这位仁兄的分享点击打开链接 #include #include #include #include #include using...

单链表基本操作-面试必备

  • 2011年12月29日 13:00
  • 71KB
  • 下载

带头结点和不带头结点的单链表的尾插法以及各种操作

一.带头结点的单链表 先说一下create()建立的链表,采用cycle的方式。 /********************************************************...
  • eric802
  • eric802
  • 2011年08月15日 18:12
  • 7853

单链表的操作

  • 2011年12月31日 11:05
  • 5KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:单链表操作
举报原因:
原因补充:

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