关于双向循环链表的插入元素

关于双向循环链表的插入元素,第1张

对于插入元素来说,最重要的是不要插入后丢了以前链表中的元素。只要保证插入后不丢元素,顺序你可以改的:

上面的题中,你找到了插入点并用指针P指向它,也就是到现在你只知道头指针和插入点的指针P,要在P所指向的结点之前插入元素,以前以前元素的信息都靠P来传达,所以要先修改新增结点中的信息,以使P以前的元素的信息不丢失,再来修改P的信息,可以:

1.s->next = p

2.s->prior = p->prior

3.p->prior->next = s

4.p->prior = s

//此程序实现功能不完善,因为添加,删除都是利用上一步的链表并没有处理插入位置、删除位置异常的情况,仅供参考

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

#include<stdlib.h>

typedef struct LNode

{

int data

struct LNode *next

}LNode, *LinkList//typedef用法。用LNode替换结构体类型,用LinkList替换结构体指针类型。

LinkList CreateList_L(LinkList L, int n)//返回链表的地址

{

LinkList p=NULL

L = (LinkList)malloc(sizeof(LNode))

L->next = NULL//建立头结点;

for (int i = ni>0i--)//头插法--导致输出时是倒序的;

{

p = (LinkList)malloc(sizeof(LNode))

scanf("%d", &p->data)

p->next = L->next

L->next = p

}

return L//因为是头插法,返回的L的地址就是链表的首地址;

}

void Show_L(LinkList L){

LinkList p

p = L->next

while (p){

printf("%d ", p->data)

p = p->next

}

printf("\n")

}

LinkList locate(LinkList L, int k)//返回插入位置k的地址;这个函数相当于查找,用一个值把第i个位置的数字返回出来就行;

{

LinkList p

int i = 1

p = L

while (p!=NULL&&i <k)

{

p = p->next

i++

}

if (p != NULL&&i == k)

return p

else

return 0

}

LinkList ListInsert_L(LinkList L, int i, int e)

{

LinkList s, p

p = locate(L,i)

if (p == NULL)

return 0

s = (LinkList)malloc(sizeof(LNode))

if (s == NULL)

printf("存储空间分配失败!")

else

{

s->data = e

s->next = p->next

p->next = s

}

return L

}

LinkList del(LinkList L, int i)

{

LinkList p, s

p = locate(L, i)

if (p == NULL)

return 0

else

{

s = p->next

p->next = s ->next

free(s)

}

return L

}

void main()

{

LinkList L1=NULL,L2=NULL,L3=NULL

int n,i,e

printf("你想创建的链表的长度是:")

scanf("%d", &n)

printf("请输入链表的初始值\n")

L1=CreateList_L(L1, n)

Show_L(L1)

printf("请输入插入的位置和数字\n")

scanf("%d%d", &i, &e)

L2 = ListInsert_L(L1, i, e)

Show_L(L2)

printf("请输入你想删除的位置:\n")

scanf("%d", &i)

L3 = del(L2, i)

printf("删除后的链表为:\n")

Show_L(L3)

system("pause")

声明一个结构体,该结构体包含一个值,和一个指向下一个链表的指针next!起始时,头结点指向其自身,增加一个结点时,使插入的结点的next指向头结点,使头结点的next指向插入节点。

详细代码如下:

#include <stdio.h>

#include <malloc.h>

typedef struct LNode{

int data

struct LNode *next

}LNode,*LinkList

void CreateList_L(LinkList &L,int &n)

{

char c

bool fl=true

L=(LinkList) malloc (sizeof(LNode))

L->next=NULL

LinkList p

while(fl)

{

if(scanf("%d",&c))

{

p=(LinkList) malloc (sizeof(LNode))

p->data=c

p->next=L->nextL->next=p

n++

}

else{fl=false}

}

}

void main()

{

LinkList L

int n=0

printf("请输入整型链表值,输入除整型字符外的字符退出:\n")

CreateList_L(L,n)

LinkList q

q=L

for(int i=ni>0--i)

{

q=q->next

printf("%d\n",q->data)

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11473553.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存