关闭

双向链表的基本操作

129人阅读 评论(0) 收藏 举报
分类:
/* 项目名称:双向链表的基本操作
 *
 * 项目成员:
 *
 * 开始时间:2010年9月23日  16:00
 * 预计完成时间:2010年9月25日
 * 实际完成时间:2010年9月24日  00:20
 *
 * 项目功能:
 * 创建链表、遍历(打印)、求长度、排序、插入、删除、查找
 *
 * 项目总结:
 *
 * */

#include <stdio.h>
#include <stdlib.h>

typedef struct Node
{
    int data;
    struct Node * next;
    struct Node * prior;
}NODE, *PNODE;

PNODE create_list(void);    //创建节点
void traverse_list(PNODE pHead);    //遍历链表(打印)
int length_list(PNODE pHead);        //求链表长度
void sort_list(PNODE pHead);        //排序
void insert_list(PNODE pHead, int pos, int val);        //插入节点
void delect_list(PNODE pHead, int pos, int *val);    //删除节点
int find_list(PNODE pHead, int val,int *pos);        //查找元素

int main(int argc, char* argv[])
{
    int pos_insert;
    int val_insert;
    int pos_delect;
    int val_delect;
    int pos_find;
    int val_find;

    PNODE pHead = NULL;

    pHead = create_list();
    printf("/n原来链表:/n");
    traverse_list(pHead);
    printf("链表的长度是:%d/n",length_list(pHead));
    printf("/n");

    printf("请输入您要插入的元素位置:pos = ");
    scanf("%d",&pos_insert);
    printf("请输入您要插入的元素值:val = ");
    scanf("%d",&val_insert);
    printf("插入元素后:/n");
    insert_list(pHead, pos_insert, val_insert);
    traverse_list(pHead);
    printf("链表的长度是:%d/n",length_list(pHead));
    printf("/n");

    printf("请输入您要删除的元素位置:pos = ");
    scanf("%d",&pos_delect);
    printf("删除元素后:/n");
    delect_list(pHead, pos_delect, &val_delect);
    traverse_list(pHead);
    printf("链表的长度是:%d/n",length_list(pHead));
    printf("您删除的节点元素是:%d/n",val_delect);
    printf("/n");

    printf("请输入您要查找的元素的值:val = ");
    scanf("%d",&val_find);
    printf("查找元素:/n");
    if(find_list(pHead, val_find, &pos_find) == 0)
    {
        traverse_list(pHead);
        printf("您要查找的元素位置是:%d/n", pos_find);
        printf("/n");
    }
    else
        printf("您要查找的元素不存在!/n");
    printf("/n");

    printf("排序后:/n");
    sort_list(pHead);
    traverse_list(pHead);
    printf("链表的长度是:%d/n",length_list(pHead));
    printf("/n");

    return 0;
}

PNODE create_list(void)
{
    int len;
    int i, val;
    PNODE pTail;

    PNODE pHead = (PNODE)malloc(sizeof(NODE));
    if(NULL == pHead)
    {
        printf("动态内存分配失败,程序终止!/n");
        exit(-1);
    }
    pTail = pHead;
    pTail->next = NULL;

    printf("请输入您要创建链表的长度:/nlen = ");
    scanf("%d",&len);

    for(i = 0; i < len; i++)
    {
        printf("请输入第%d个节点的值:val = ", i+1);
        scanf("%d",&val);

        PNODE pNew = (PNODE)malloc(sizeof(NODE));
        if(NULL == pNew)
        {
            printf("新节点动态内存分配失败,程序终止!/n");
            exit(-1);
        }
        pNew->data = val;
        pTail->next = pNew;
        pTail = pNew->prior;
        pNew->next = NULL;
        pTail = pNew;
    }
    return pHead;
}

void traverse_list(PNODE pHead)
{
    PNODE p;
    p = pHead->next;
    if(NULL == p)
    {
        printf("链表为空!/n");
    }
    while(NULL != p)
    {
        printf("%d  ",p->data);
        p = p->next;
    }
    printf("/n");

    return;
}

int length_list(PNODE pHead)
{
    int len = 0;
    PNODE p;
    p = pHead;

    while(NULL != p)
    {
        len++;
        p = p->next;
    }
    return len-1;

}

void sort_list(PNODE pHead)
{
    int len, i, j, temp;
    PNODE p, q;

    len = length_list(pHead);

    for(i = 0,p = pHead->next; i < len; i++,p = p->next)
    {
        for(j = i+1, q = p->next; j < len; j++, q = q->next)
        {
            if(p->data > q->data)
            {
                temp = p->data;
                p->data = q->data;
                q->data = temp;
            }
        }
    }
    return;
}

void insert_list(PNODE pHead, int pos, int val)
{
    int i;
    PNODE pNew, p;
    p = pHead;

    pNew = (PNODE)malloc(sizeof(NODE));
    if(NULL == pNew)
    {
        printf("新节点动态内存分配失败,程序终止!/n");
        exit(-1);
    }
    pNew->data = val;

    if((pos > (length_list(pHead)+1)) || (pos <= 0))
    {
        printf("插入失败,插入位置不正确!/n");
        exit(-1);
    }
    for(i = 0; i < pos-1; i++)
    {
        p = p->next;
    }
    pNew->next = p->next;
    p->next = pNew;
    p = pNew->prior;

    return;
}

void delect_list(PNODE pHead, int pos, int *val)
{
    int i;
    PNODE p = pHead;

    if(length_list(pHead) == 0)
    {
        printf("链表为空,没有内容可以删除!/n");
        exit(-1);
    }
    if((pos > length_list(pHead)) || (pos <= 0))
    {
        printf("删除元素的位置不是合法位置,删除失败!/n");
        exit(-1);
    }
    for(i = 0; i < pos-1; i++)
    {
        p = p->next;
    }
    if(NULL == p->next->next)
    {
        *val = p->next->data;
        p->next = NULL;
    }
    else if(NULL == p->next->next->next)
    {
        *val = p->next->data;
        p->next->next = NULL;
       
    }
    else
    {
        *val = p->next->data;
        p->next = p->next->next;
        p->next->next->prior = p;
    }

    return;
}

int find_list(PNODE pHead, int val,int *pos)
{
    PNODE p = pHead;
    int i = 0;

    while(p != NULL)
    {
        i++;
        if(p->data == val)
        {
            *pos = i-1;
            return 0;
        }
        p = p->next;
    }

    return 1;

}

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

双向链表的基本操作

双向链表的插入顺序: 双向链表的删除顺序: #include #include typedef struct doubleLink { int data;...
  • acm_JL
  • acm_JL
  • 2016-03-21 20:30
  • 1752

双向链表的建立与基本操作

双向链表比单链表有更好的灵活性,其大部分操作与线性表相同。下面总结双向链表与单链表之间的不同之处及我在实现过程中所遇到的问题。1.双向链表的建立 双向链表在初始化时,要给首尾两个...
  • kelvinmao
  • kelvinmao
  • 2016-04-02 18:39
  • 3303

双向循环链表的基本操作

总结一下双向循环链表的buf
  • u013228403
  • u013228403
  • 2014-04-27 23:28
  • 1128

实例讲解C++ 双链表基本操作

1.概念   双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我...
  • whChina
  • whChina
  • 2016-04-26 08:09
  • 1941

双向链表基本操作及代码优化技巧

以下是本人对双向链表的相关操作及相应的代码优化学习笔记 1 双向链表的插入有4种情况: 1.1 插入到链表的开始位置 1.2 插入到链表的中间位置 1.3 插入到链表的结束位置 1.4 链表为空,既...
  • pengqian652
  • pengqian652
  • 2013-10-30 15:59
  • 1030

数据结构之---c语言实现双向链表操作

数据结构之---c语言实现双向链表操作
  • u012965373
  • u012965373
  • 2015-05-16 11:02
  • 1021

《数据结构》双向链表的基本操作

双向链表的操作 双向链表的基本操作包括:判断链表是否为空、计算链表的长度、遍历链表,这3中操作的方法和单链表一样,主要和双向链表中的指向后继的指针有关。 双向链表的插入和删除操作和单链表是有区别的:双...
  • sungaochao
  • sungaochao
  • 2016-03-04 23:18
  • 311

双向链表的基本操作(python)

用python实现单链表的增删改查 #!/usr/bin/python #coding: utf-8 class Node(object): u"数据类" def __init__(self, ...
  • You_are_my_dream
  • You_are_my_dream
  • 2017-01-26 10:54
  • 140

双向链表的基本操作

学过单向链表的小伙伴都知道单向链表中的每一个节点有且只有一个指针,这个指针就是用来指向下一个节点的,单向链表顾名思义就是链表方向是单方向的,而本文要介绍的双向链表就是链表方向是双方向的,也就是双向链表...
  • zouleideboke
  • zouleideboke
  • 2017-07-27 22:46
  • 189

链表的基本操作,建立,测长,删除,打印,插入

老早就想自己写写链表的基本操作的实现, 写写来练练手。#include #include #include using namespace std; typedef struct Node{ in...
  • zwguo982008
  • zwguo982008
  • 2015-10-17 22:58
  • 307
    个人资料
    • 访问:15277次
    • 积分:348
    • 等级:
    • 排名:千里之外
    • 原创:18篇
    • 转载:13篇
    • 译文:0篇
    • 评论:1条