2023-03-28-双链表DLinklist基本操作
//双链表对钩
#include <stdio.h>
#include <stdbool.h>
#include <malloc.h>
typedef struct DNode
{
int data;
struct DNode *prior,*next;//prior指向上一个结点,next指向下一个结点
}DNode,*DLinkList;
bool InitList(DLinkList *L)//初始化双链表
{
*L=(DNode *)malloc(sizeof(DNode));//新建一个头结点
if(*L==NULL)//内存不足分配失败
{
return false;
}
else
{
(*L)->next=NULL;//将头结点的下一个节点设为NULL
return true;
}
}
DLinkList createDLinkList(DLinkList L)//尾插法建立双链表
{
L=(DLinkList)malloc(sizeof(DNode));
L->next=NULL;
DNode *s;
DNode *e=L;//e为表尾的结点,此时L就是最后的结点
int value;
scanf("%d",&value);
while(value!=9999)
{
s=(DNode *)malloc(sizeof(DNode));
s->data=value;
e->next=s;
s->prior=e;//s的上一个结点指向e
e=s;//将e指向s,即最后一个结点
scanf("%d",&value);
}
return L;
}
DNode *GetElem(DLinkList L,int i)//按位查找结点
{
DNode *p;//存放最后返回的结点
p=L->next;//先从第一个结点开始遍历
if(i==0)
{
return L;//第零个节点是头指针?头结点是第一个结点?
}
if(i<1)
{
return NULL;
}
int j=1;//此时p在第一个结点处
while(p!=NULL && j<i)
{
p=p->next;//第一次循环,p遍历到第二个结点
j++;
}
return p;//返回p结点
}
void DLinklist_insert(DLinkList L,int i,int value)//插入操作
{
DNode *p;
DNode *s = GetElem(L,i-1);//获取前一个结点
p=(DNode *)malloc(sizeof(DNode));
p->next=s->next;
s->next->prior=p;
p->prior=s;
s->next=p;
p->data=value;
}
void DLinklist_delete(DLinkList L,int i)//删除操作
{
DNode *p=GetElem(L,i);
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);//不要忘记释放内存
}
int main()
{
DLinkList L;
InitList(&L);
L = createDLinkList(L);
DLinklist_insert(L,3,666);
DLinklist_delete(L,3);
printf("%d",GetElem(L,3)->data);
return 0;
}
C++:
//双链表
#include <stdio.h>
#include <stdbool.h>
#include <malloc.h>
typedef struct DNode
{
int data;
struct DNode *prior,*next;//prior指向上一个结点,next指向下一个结点
}DNode,*DLinkList;
bool InitList(DLinkList &L)//初始化双链表
{
L=(DNode *)malloc(sizeof(DNode));//新建一个头结点
if(L==NULL)//内存不足分配失败
{
return false;
}
else
{
L->next=NULL;//将头结点的下一个节点设为NULL
return true;
}
}
DLinkList createDLinkList(DLinkList L)//尾插法建立双链表
{
L=(DLinkList)malloc(sizeof(DNode));
L->next=NULL;
DNode *s;
DNode *e=L;//e为表尾的结点,此时L就是最后的结点
int value;
scanf("%d",&value);
while(value!=9999)
{
s=(DNode *)malloc(sizeof(DNode));
s->data=value;
e->next=s;
s->prior=e;//s的上一个结点指向e
e=s;//将e指向s,即最后一个结点
scanf("%d",&value);
}
return L;
}
DNode *GetElem(DLinkList L,int i)//按位查找结点
{
DNode *p;//存放最后返回的结点
p=L->next;//先从第一个结点开始遍历
if(i==0)
{
return L;//第零个节点是头指针?头结点是第一个结点?
}
if(i<1)
{
return NULL;
}
int j=1;//此时p在第一个结点处
while(p!=NULL && j<i)
{
p=p->next;//第一次循环,p遍历到第二个结点
j++;
}
return p;//返回p结点
}
void DLinklist_insert(DLinkList L,int i,int value)//插入操作
{
DNode *p;
DNode *s = GetElem(L,i-1);//获取前一个结点
p=(DNode *)malloc(sizeof(DNode));
p->next=s->next;
s->next->prior=p;
p->prior=s;
s->next=p;
p->data=value;
}
void DLinklist_delete(DLinkList L,int i)//删除操作
{
DNode *p=GetElem(L,i);
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);//不要忘记释放内存
}
int main()
{
DLinkList L;
InitList(L);
L = createDLinkList(L);
DLinklist_insert(L,3,666);
DLinklist_delete(L,3);
printf("%d",GetElem(L,3)->data);
return 0;
}
分类:
Data_Structure
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步