双链表建立和删除

#include<iostream>
#include<cstring>
#include<cstdio>
#include<stdlib.h>
using namespace std;
typedef struct student
{
    int data;
    struct   student*next;
    struct student *pre;
}dnode;
dnode*creat()//双链表的建立
{
    dnode *head,*p,*s;
    int x,cycle=1;
    head=new dnode;
    p=head;
    while(cycle)
    {
      printf("请输入数据\n");
      scanf("%d",&x);
      if(x<=0)
          break;
      s=new dnode;
      s->data=x;
      s->pre=p;
      p->next=s;
      p=s;

    }
    head=head->next;
    head->pre=NULL;
    p->next=NULL;
    return head;
}
dnode *del(dnode *head,int num)
{
    dnode *s,*p,*q;
    s=head;
    while(s->next!=NULL)
    {
        if(s->data==num)
        {
            if(s==head)
                {
                    head=head->next;
                    head->pre=NULL;
                    delete  s;
                    return head;
                }
            else if(s->next==NULL)
            {
                s->pre->next=NULL;
                delete s;
                 return head;
            }
             else{
            p=s->pre;
            q=s->next;
            q->pre=p;
            p->next=q;
           delete s;
             }
        }
        s=s->next;
    }
    if(s==NULL)
        printf("链表没有这个数\n");
    else
       return head;

}
void print(dnode *head)//单链表打印
{
       dnode *p=head;
         p=head;
         while(p!=NULL)
         {
           printf("%d ",p->data);
            p=p->next;
         }
         printf("\n");
}
int main()
{
    dnode *head;
    int num1,num2;
    head=creat();
    print(head);
    printf("请输入要删除的数\n");
    scanf("%d",&num1);
    head=del(head,num1);
    print(head);
    return 0;
}
时间: 2024-10-08 21:54:18

双链表建立和删除的相关文章

双链表(建立、删除、添加节点、打印)

#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <curses.h> using namespace std; typedef struct student { int data; struct student *next; struct student *pre; }dnode; dnode *creat() { dn

C语言实现非循环双链表节点的删除(带头结点尾结点)

我在之前一篇博客<C语言实现非循环双链表节点的删除(不带头结点)>中详细讲解了不含头尾节点的双链表中删除一个节点,处理过程还是稍显麻烦.自从我们学习使用头尾节点来处理双链表后,删除过程就非常方便.代码上传至 https://github.com/chenyufeng1991/DeleteNodeDoubleLinkedList_HeadList . 核心代码如下: //删除pos位置的节点 int DeletePosList(Node *pHead,Node *pTail,int pos){

C语言实现非循环双链表节点的删除(不带头结点)

不带头结点的非循环双链表在删除节点的时候比价麻烦,因为同时要维护prior和next两个指针.在处理第一个节点和最后一个节点的时候都要分别考虑,同时也需要考虑节点数量为1的情况.删除情况分为下面两类: (1)删除pos位置的节点: (2)判断x是否在链表中,若存在则删除: 代码上传至 https://github.com/chenyufeng1991/DeleteNodeDoubleList  . 核心代码如下: //删除pos位置的节点 Node *deletePosList(Node *pN

双链表删除/插入节点

//双链表删除节点 dnode *del(dnode *head, int num) { dnode *p1, *p2; p1 = head; while (num != p1->data && p1->next != NULL) { p1 = p1->next; } if (num == p1->data) { if (p1 == head) { head = head->next; head->pre = NULL; free(p1); } else

双链表(非循环)相关操作:创建、析构、删除、冒泡排序

struct dulnode { int val; dulnode *pre; dulnode *next; }; //这里创建的不是双循环链表 dulnode* create_dulnode(int n) { if (n <= 0) return NULL; int i = 0; dulnode *head, *p1, *p2; //生成头节点 head = new dulnode; head->val = rand() % RAND_MAX; head->pre = NULL; //

算法总结之 在单链表和双链表中删除倒数第k个节点

分别实现两个函数,一个可以删除单链表中倒数第k个节点,另一个可以删除双链表中倒数第k个节点 思路: 如果链表为空,或者k<1 参数无效 除此之外 让链表从头开始走到尾,每移动一步,就让k的值减1 当链表走到头时候 如果k值大于0   说明不用调整  因为链表根本没有倒数第k个节点 此时将原链表直接返回即可 如果k值=0,说明链表倒数第k个节点就是头节点,此时直接返回head.next 也就是原链表的第二个节点 让第二个节点作为链表的头节点,此时直接返回head.next 如果k值<0  重新从

[算法]在单链表和双链表中删除倒数第k个结点

题目: 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 要求: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 解答: 让链表从头走到尾,每移动一步,就让K值减一,当链表走到结尾时,如果K值大于0,说明不用调整链表,因为链表根本没有倒数第K个节点,此时将原链表直接返回即可:如果K值等于0,说明链表倒数第K个节点就是头结点,此时直接返回head.next,相当于删除了头结点.当K的值小于零时,再次从头结点开始走,每移动一步,就让

数据结构-编程实现一个双链表的建立,双链表的打印,双链表的测长

1:双链表的建立,打印,代码如下: // ConsoleApplication24.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<malloc.h> #include <iostream> #include <assert.h> using namespace std; typedef struct DbNode //双向链表结构体 { int data;//节点数据 DbNode *lef

双链表删除一个节点

写了一个删除双链表节点的程序,在这里记录一下,直接上代码,代码中的主要步骤都有注释. 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <assert.h> 5 typedef struct NODE{ 6 struct NODE *prior; 7 struct NODE *next; 8 int value; 9 }Node; 10 void print