3.双向链表的纠结

#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
struct Node{
    Node *next;
    Node *prior;
    ElemType data;
};
void CreateList(Node*&L)
{
    L = (Node*)malloc(sizeof(Node));
    if(!L) exit(-2);
    L->next = L;
    L->prior = L;
    L->data = 0;
}
void InsertList(Node*&L,int n,ElemType e)//较之前版本 改为插入到任意位置
{
    Node *p = L;
    for(int i=0;i<n-1;++i)
    {
        p=p->next;
    }
    Node *s = NULL;
    s=(Node*)malloc(sizeof(Node));
    s->data = e;

    p->prior->next = s; s->prior = p->prior;
    p->prior = s;s->next = p;
    ++(L->data);
}
void DeleteList(Node*&L,int n)
{
    Node*p = L;
    if(n<1||n>L->data) exit(-2);
    for(int i = 0;i < n;i++)//L是头结点,不能被销毁
    {
        p=p->next;
    }
    p->prior->next = p->next;p->next->prior = p->prior;
    free(p);
    --(L->data);
}
void ShowList(Node*&L)
{
    Node *p = L;

    while(p->next!=L){

        printf(">%d\t",(p)->data);
        p=p->next;
        if(p->next == L)
        {
            printf(">%d\t",(p)->data);
        }
    }

    printf("\n");
}
int main()
{
    Node *N1;
    CreateList(N1);
    InsertList(N1,1,1);
    ShowList(N1);
    InsertList(N1,1,2);
    ShowList(N1);
    InsertList(N1,1,3);
    ShowList(N1);
    InsertList(N1,1,4);
    ShowList(N1);
    DeleteList(N1,1);
    ShowList(N1);
    DeleteList(N1,2);
    ShowList(N1);
}
    

有第一个L头结点的存在,导致后面的删除函数不能在p指向L时进行销毁。

完善不够 权当备份。

时间: 2024-08-08 14:59:43

3.双向链表的纠结的相关文章

uva133-救济金发放

此题为小白书里数据结构基础关于线性表的题目 翻译请戳 http://luckycat.kshs.kh.edu.tw/ 解题思路 当时直接用动态的双向链表模拟了... 但是用双向链表很纠结啊,如果你加入头结点之后的查找会变得很麻烦, 如果不加头结点的话,插入节点会很麻烦... 但已经写了就不想改了...如果你用静态链表实现亦可以,看个人喜好. 注意 如果有头结点,一开始从头结点数起,第一次删除后,以后的删除都要忽略头结点(跳过不计). 代码: #include<iostream> #includ

数据结构第四篇——线性表的链式存储之双向链表

?注:未经博主同意,不得转载. 前面讨论的单链表,每个结点中只有一个指针域,用来存放指向后继结点的指针,因此,从某个结点出发只能顺时针往后查找其他结点.若要查找某个结点的直接前驱,则需要从头指针开始沿链表探寻,处理起来十分不方便.为克服单链表的这一缺点,可引入双向链表. 双向链表中每一个结点含有两个指针域,一个指针指向其直接前驱结点,另一个指针指向直接后继结点.和单链表类似,双向链表一般也只有头指针唯一确定:同样也可设头结点,使得双向链表的某些操作简便一些. 双向链表结构定义如下:  双向链表是

双向链表(一)

参考: http://blog.sina.com.cn/s/blog_7d44748b01013fsf.html    (写的太好啦) http://blog.163.com/haibianfeng_yr/blog/static/34572620201453061036702/ 双(向)链表中有两条方向不同的链,即每个结点中除next域存放后继结点地址外,还增加一个指向其直接前趋的指针域prior.双向链表在查找时更方便 特别是大量数据的遍历 注意:    ①双链表由头指针head惟一确定的. 

新写了一个控制器,结果粗心导致出现了一个问题纠结了半天

新写了一个控制器,结果粗心导致出现了一个问题纠结了半天     误信息如下: 经过逐步排查发现时因为我的方法中用了一个Model ,却把Model的包引入错误所以造成上面的问题: 错误引入的包为:import com.sun.tools.xjc.model.Model; 正确的包为: import org.springframework.ui.Model;

shell if判断(曾经被一个字符串相等的判断纠结半小时,最后只是if后少了个空格!) 和 awk引用外部变量判断

一.if判断 数字: $A=12 $B=15 if(("$A"<"$B")) if(("$A"=="$B")) 字符串: $A="HELLO" $B="WORLD" if [ "$A" = "FACT_LOGIN_USER" ] if [ "$A" = "$B" ] PS:字符串比较的时候注意 'if'

c语言双向链表

typedef int ElemType; typedef struct _Node { ElemType value; struct _Node* pnext; struct _Node* prev; }node, *pNode; //创建双向链表 pNode Create_Double_List(int count) { pNode pn = NULL; pNode pb = NULL; pNode phead = (pNode)malloc(sizeof(node)); printf("请

C++__双向链表(练习)

双向链表 link.h #ifndef LINK_H_ #define LINK_H_ #define HEADER 0 #define TAIL -1 typedef int data_type; enum LINK_OP { LINK_ERR = -1, LINK_OK }; class LINK { private: data_type data; LINK *next; LINK *last; public: LINK(); LINK(data_type data); virtual ~

剑指offer:二叉搜索树与双向链表

1.题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 2.解题思路: (1)将左子树构造成双向链表,并返回链表头节点: (2)定位左子树双链表的尾节点: (3)如果左子树链表不为空,将当前root连缀其链尾: (4)将右子树构造出双向链表,并返回链表头节点: (5)如果右子树链表不为空,将当前root连缀其表头: (6)根据左子树链表是否为空,确定返回的节点. 3.JavaScript实现: function Conv

Uva 12657 Boxes in a Line 双向链表

操作4比较特殊,为了避免一次性修改所有元素的指针,由于题目只要求输出奇数盒子的编号,所以我们可以灵活的根据是否进行过操作4对操作1 操作2 进行改动 操作3不受操作4影响 上代码.... #include<cstdio> #include<algorithm> const int maxn=100000+5; int right[maxn],left[maxn]; void link (int L,int R){ right[L]=R;left[R]=L; } //在双向链表这样复