#include<stdlib.h>
#include<malloc.h>
struct list{
int data
struct list *next
struct list *pre
}
typedef struct list node
typedef node *link
link front=NULL,rear,ptr,head=NULL
link push(int item){
link newnode=(link)malloc(sizeof(node))
newnode->data=item
if(head==NULL)
{
head=newnode
head->next=NULL
head->pre=NULL
rear=head
}
else
{
rear->next=newnode
newnode->pre=rear
newnode->next=NULL
rear=newnode
}
return head
}
void makenull(){
front=NULL
rear=NULL
}
empty(){
if(front==NULL)
return 1
else
return 0
}
int tops(){
if(empty())
return NULL
else
return rear->data
}
void pop(){
if(empty())
printf("stack is empty!\n")
else
rear=rear->pre
}
void display(link l){
link p
p=l
while(p!=NULL){
printf("%d->",p->data)
p=p->next
}
}
void main(){
int n,i
printf("input your first data!\n")
scanf("%d",&n)
front=push(n)
/*another data*/
for(i=0i<3i++)
{
printf("input:\n")
scanf("%d",&n)
push(n)
}
ptr=front
display(ptr)
printf("\n Please enter any key to pop")
pop()
ptr=front
display(ptr)
}
#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)
}
}
打个比方。把链表节点看作是一个人,把链表指针看作是人的手(左手是前向指针,右手是后向指针)。非循环的单向链表是这样的:若干个人排成一排,每个人都抬起右手指向他右边的人,最右边的人的右手指向了空气(NULL)。如果要想找到这一排中任意一个人,必须从排头(链表头)开始沿手指的方向挨个查找。
循环单向链表是这样的:若干个人围成一圈,每个人都抬起右手指向他右边的人,这样每个人的右手都能指到一个人(如果只有一个人,那么他的右手指向自己)。从任意一个人开始,沿着手指的方向,可以不停地循环找到每一个人。
非循环的双向链表是这样的:若干个人排成一排,每个人都抬起左手指向他左边的人,并且每个人都抬起右手指向他右边的人,那么最左边的人的左手指向了空气(NULL),最右边的人的右手指向了空气(NULL)。如果要想找到这一排中某个目标人,从任意一个人开始,可以沿左手方向尝试查找,如果找不到,可以继续沿右手方向查找,直到找到目标人。
循环双向链表是这样的:若干个人围成一圈,每个人都抬起左手指向他左边的人,并且每个人都抬起右手指向他右边的人,这样每个人的左右手都可以指到一个人(如果只有一个人,那么他的左右手都指向自己)。无论选择左手方向还是右手方向,都可以不停地循环找到每一个人。