具体思路同数据结构C语言基础代码5:单链表相关操作(全)_Maxg1en-的博客-CSDN博客
仅有creatListByhead()和insertNode()、deleElem()进行了修改。
创建creatListByhead()代码更改多了一步:
s->pre = L;
insertNode()多了一步:
k->pre = s;
deleElem()多了一步:
s->next->pre = s;
其他与单链表一样完整代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode* next,
* pre;
}LNode, * LinkList;
void printfList(LinkList L)
{
L = L->next;
while (L->next != NULL)
{
printf("%d", L->data);
L = L->next;
}
printf("%d", L->data);
printf("\n");
}
LNode* GetElemposition(LinkList L, int i)
{
int j = 1;
LNode* s = L->next;
if (i == 0)
{
return L;
}
if (i <= 0)
return 0;
while (j < i && s != NULL)
{
s = s->next;
j++;
}
return s;
}
LinkList creatListByhead(LinkList L, int n)
{
LNode* s;
int x;
//建立头结点
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
L->pre = NULL;
//下来赋值
for (int i = 0;i < n;i++)
{
scanf("%d", &x);
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
s->pre = L;
L->next = s;
}
return L;
}
int length(LinkList L)
{
LinkList s = L->next;
int number = 1;
while (s->next != NULL)
{
s = s->next;
number++;
}
return number;
}
void insertNode(LinkList L, int position, int value)
{
if (position <= 0 || position > length(L) + 1)
return 0;
int j = 1;
//LNode *s = GetElemposition(L, position-1);
LNode* s = L->next;
while (j < position && s != NULL)
{
s = s->next;
j++;
}
LNode* k = (LNode*)malloc(sizeof(LNode));
k->data = value;
k->next = s->next;
k->pre = s;
s->next = k;
}
void deleElem(LinkList L, int pos, ElemType* e)
{
LinkList s = GetElemposition(L, pos - 1);
LinkList p = s->next;
s->next = s->next->next;
s->next->pre = s;
*e = p->data;
free(p);
}
int main()
{
LinkList L=(LinkList)malloc(sizeof(LNode));
LinkList L1=creatListByhead(L,5);
printfList(L1);
insertNode(L1,2,999);
printfList(L1);
int num;
deleElem(L1,2,&num);
printfList(L1);
printf("\n");
printf("%d",num);
return 0;
}