2023-03-28-双链表DLinklist基本操作

发布时间 2023-03-28 18:04:59作者: 正方形的被子
 1 //双链表
 2 
 3 #include <stdio.h>
 4 #include <stdbool.h>
 5 #include <malloc.h>
 6 
 7 typedef struct DNode
 8 {
 9     int data;
10     struct DNode *prior,*next;//prior指向上一个结点,next指向下一个结点
11 }DNode,*DLinkList;
12 
13 bool InitList(DLinkList L)//初始化双链表
14 {
15     L=NULL;
16     return true;
17 }
18 
19 DLinkList createDLinkList(DLinkList L)//尾插法建立双链表
20 {
21     L=(DLinkList)malloc(sizeof(DNode));
22     L->next=NULL;
23     DNode *s;
24     DNode *e=L;//e为表尾的结点,此时L就是最后的结点
25     int value;
26     scanf("%d",&value);
27     while(value!=9999)
28     { 
29         s=(DNode *)malloc(sizeof(DNode));
30         s->data=value;
31         e->next=s;
32         s->prior=e;//s的上一个结点指向e
33         e=s;//将e指向s,即最后一个结点
34         scanf("%d",&value);
35     }
36     return L;
37 }
38 
39 DNode *GetElem(DLinkList L,int i)//按位查找结点
40 {
41     DNode *p;//存放最后返回的结点
42     p=L->next;//先从第一个结点开始遍历
43     if(i==0)
44     {
45         return L;//第零个节点是头指针?头结点是第一个结点?
46     }
47     if(i<1)
48     {
49         return NULL;
50     }
51     int j=1;//此时p在第一个结点处
52     while(p!=NULL && j<i)
53     {
54         p=p->next;//第一次循环,p遍历到第二个结点
55         j++;
56     }
57     return p;//返回p结点
58 }
59 
60 void DLinklist_insert(DLinkList L,int i,int value)//插入操作
61 {
62     DNode *p;
63     DNode *s = GetElem(L,i-1);//获取前一个结点
64     p=(DNode *)malloc(sizeof(DNode));
65     p->next=s->next;
66     s->next->prior=p;
67     p->prior=s;
68     s->next=p;
69     p->data=value;
70 }
71 
72 void DLinklist_delete(DLinkList L,int i)//删除操作
73 {
74     DNode *p=GetElem(L,i);
75     p->prior->next=p->next;
76     p->next->prior=p->prior;
77     free(p);//不要忘记释放内存
78 }
79 
80 int main()
81 {
82     DLinkList L;
83     InitList(L);
84     L = createDLinkList(L);
85     DLinklist_insert(L,3,666);
86     DLinklist_delete(L,3);
87     printf("%d",GetElem(L,3)->data);
88     return 0;
89 }