线性表的链式表示(双链表)
数据结构
typedef struct LNode{
int data;
struct LNode* pre;
struct LNode* next;
}LNode, *DLinkList;
初始化、求表长
//初始化表
void InitList(DLinkList& L) {
L = (DLinkList)malloc(sizeof(DLinkList));
L->pre = NULL;
L->next = NULL;
}
//求表长
int Length(DLinkList L) {
int ans = 0;
LNode* p = L->next;
while (p) {
ans++;
p = p->next;
}
return ans;
}
按序号查找结点
//按序号i查找结点,并返回该结点
LNode* GetElem(DLinkList L, int i) {
LNode* p = L->next;
while (p&&i > 0) {
p = p->next;
i--;
}
return p;
}
插入元素
//在链表的i位置插入e元素,i以及i以后的元素往后移
void ListInsert(DLinkList& L, int i, int e) {
LNode* p = GetElem(L, i);//i位置的结点
LNode* pre;//i-1结点的位置
if (i == 0) {
pre = L;
}
else {
pre = p->pre;
pre = p->pre;
}
LNode* newNode = (LNode*)malloc(sizeof(LNode));
//LNode* newNode = (LNode*)malloc(sizeof(LNode));
newNode->data = e;
pre->next = newNode;
newNode->next = p;
if (p) {
p->pre = newNode;
}
newNode->pre = pre;
}
删除元素
//删除i处的结点,并返回该结点的值
int DeleteList(DLinkList& L, int i) {
LNode* p = GetElem(L, i);//i处的结点
LNode* preNode = p->pre;//i-1处的结点
LNode* nextNode = p->next;//i+1处的结点
if (p == NULL) {
printf("删除的结点不存在!\n");
return -1;
}
preNode->next = nextNode;
nextNode->pre = preNode;
return p->data;
}
打印表
//打印表数据
void PrintList(DLinkList L) {
LNode* p = L->next;
printf("表数据:");
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
//销毁表、销毁表
void DestroyList(DLinkList& L) {
LNode* p;
LNode* t = L->next;
while (t)
{
p = t;
t = t->next;
free(p);
}
}
测试
int main() {
DLinkList list;
InitList(list);
ListInsert(list, 0, 5);
ListInsert(list, 0, 4);
ListInsert(list, 0, 3);
ListInsert(list, 0, 2);
PrintList(list);
ListInsert(list, 1, 100);
PrintList(list);
DeleteList(list, 3);
PrintList(list);
printf("表长:%d\n", Length(list));
DestroyList(list);
return 0;
}
大佬批评指正