#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
}
总体描述:就是一个多线程安全型双向链表操作的具体实现主要数据结构:根据需求不同而定制不同的结点数据
模块功能:插入,删除,复制,打印,交,并集;
流程图:看源程序不就得了吗?
实现思路:源代码。
程序使用:看下源代码不就得了嘛!
嘿嘿!