C语言双向链表

Python012

C语言双向链表,第1张

#include "stdio.h"

#include "stdlib.h"

typedef int ElemType//元素类型

typedef struct DuLNode

{//双向链表

ElemType data

struct DuLNode *prior, *next

}DuLNode,*DuLinkList

int Create(DuLinkList &L)

{//建立双向链表

DuLinkList p,q

ElemType n,i

L = (DuLinkList) malloc (sizeof(DuLNode))

L->next = NULL

q = L

printf("输入数据个数:")

scanf("%d",&n)

printf("输入数据元素:")

for ( i = 0i <ni++)

{

p = (DuLinkList) malloc (sizeof(DuLNode))

scanf("%d",&p->data)//插入数据

p->prior = q

q->next = p

p->next = 0

q = q->next

}

return 1

}

int Visit(DuLinkList &L)

{//遍历双向链表

DuLinkList p

p = L->next

printf("双向链表为:")

while (p)

{

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

p = p->next

}

printf("\n")

return 1

}

int Clear(DuLinkList &L)

{

DuLinkList p

p = L->next

while(p)

{

L->next = p->next

free(p)

p = L->next

}

return 1

}

main()

{

int i,e,s,num

char c='y'

DuLinkList L

Create(L)

Visit(L)

while (c=='y')

{

printf("\n\n\n1.双向链表插入元素\n2.双向链表中删除元素\n")

printf("3.判断双向链表元素是否对称\n")

printf("4.双向链表中奇数排在偶数前面\n")

printf("5.建立递增链表并有序插入元素\n\n")

printf("选择需要的操作\n\n")

scanf("%d",&num)

switch(num)

{

case 1:

printf("输入插入元素位置以及元素:\n")

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

ListInsert(L, i, e)

Visit(L)

break

case 2:

printf("输入删除元素位置:")

scanf("%d",&i)

Delete(L,i,s)

printf("删除的元素为:%d\n",s)

Visit(L)

break

case 3:

if(Same(L)) printf("链表对称\n")

else printf("链表不对称\n")

break

case 5:

printf("清空原链表,建立递增链表:\n")

XCreate(L)

Visit(L)

break

case 4:

printf("奇数放在偶数前面:\n")

Jiou(L)

Visit(L)

break

}

printf("继续操作(y/n):\n")

scanf("%s",&c)

}

}

循环双向链表就是节点有2个指针,分别指向前后节点,最终形成O型。

头结点是用来找到链表的,既然你不要头节点,那我只能用尾节点(最后添加的节点)。

这里代码功能:通过添加节点生成链表,并通过最后添加的节点找到链表并循环打印整个链表。

#include<stdio.h>

#include<malloc.h>

int idcont=1

int listcont=0//记录节点个数

typedef struct stList

{

    int id

    char content[10]

    struct stList *front

    struct stList *next

}STL

STL *InitList()

STL *addList(STL *stl)

void printfSTL(STL *lastSTL)

int main()

{

    char as

    STL *stl=NULL,*lastSTL=NULL

    stl=InitList()

    while(1)

    {

        lastSTL=addList(stl)

        printf("是否继续添加节点:Y/N? ")

        getchar()

        scanf("%c",&as)

        if(as=='N')

            break

    }

    printfSTL(lastSTL)

    return 0

}

void printfSTL(STL *lastSTL)

{

    STL *stl=lastSTL

    printf("节点编号:%d,内容:%s\n",stl->id,stl->content)

    stl=stl->next

    while(stl!=lastSTL)

    {

        printf("节点编号:%d,内容:%s\n",stl->id,stl->content)

        stl=stl->next

    }

}

STL *InitList()

{

    printf("初始化双向链表\n")

    STL *stl1=(STL *)malloc(sizeof(STL))

    stl1->front=NULL

    stl1->next=NULL

    stl1->id=idcont++

    return stl1

}

STL *addList(STL *stl)

{

    STL *stlnew=NULL

    printf("请输入要添加进链表的节点内容\n")

    if(stl->front==NULL)//首节点

    {

        scanf("%s",stl->content)

        stl->front=stl

        stl->next=stl

    }

    else

    {

        stlnew=(STL *)malloc(sizeof(STL))

        scanf("%s",stlnew->content)

        stlnew->front=stl

        stlnew->next=stl->next

        stlnew->id=idcont++

        stl->next=stlnew

    }

    listcont++

    return stlnew

}

总体描述:就是一个多线程安全型双向链表操作的具体实现

主要数据结构:根据需求不同而定制不同的结点数据

模块功能:插入,删除,复制,打印,交,并集;

流程图:看源程序不就得了吗?

实现思路:源代码。

程序使用:看下源代码不就得了嘛!

嘿嘿!