使用C语言实现双向链表的建立、删除和插入

要求:(1)演示程序以用户和计算机的对话方式执行。即在计算机终端上显示“提示信息”之后,
由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据和运算结果显示在其后。
(2)程序执行的命令包括:建立双向链表;在指定的位置上插入一个元素;删除指定的元素
;输出结果;结束。
【测试数据】:
第一组:
输入1,3,5,7,9,11,13,15,建立双向链表。
在第5个元素前插入元素20;
删除元素11,19。
第二组:
输入2,4,6,8,10,12,14,20建立双向链表。
在第10个元素前插入元素25;
删除元素10,19。

#include<stdio.h>
#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=0;i<3;i++)
{
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);

}
温馨提示:内容为网友见解,仅供参考
第1个回答  2016-02-06
#include<stdio.h>
#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;
}
}
第2个回答  2008-01-18
查下不就行了

你好,数据结构(C语言)中实现有序链表的插入,删除结点基本操作,及两个有...
else if(node == head && head->next != NULL) \/\/删除头节点 { node=head; head=head->next; free(node); printf("\\n---删除信息成功---\\n"); \/\/头节点删除成功 n=n-1; } else if(node ->next != NULL) \/\/删除中间节点 { p1->next=node->next; free(node); printf("\\n---删除信...

C++ 双向链表 插入1,2,3,4,5,6,7,8,9,10到随机任意位置 然后再按1-1...
}LNodeo,*LinkList;\/\/打印双向链表 void PrintfLink(LinkList phead){ if(phead == NULL)printf("双向链表为空!\\n");while(phead !=NULL){ printf("%d ",phead->data);phead=phead->next;} printf("\\n");} \/\/生成双链表 LinkList CreatLink(){ LinkList head=NULL,p,t,t1;int...

c语言 链表操作:建立,显示及节点的插入,删除
L->next = NULL; \/\/ 先建立一个带头结点的单链表 for (i=n; i>0; --i){ p = (LinkList)malloc(sizeof(LNode)); \/\/ 生成新结点 p->data = rand()%200; \/\/ 改为一个随机生成的数字(200以内)p->next = L->next;L->next = p; \/\/ 插入到表头 } } \/\/ Create...

如何用C语言创建一个链表,实现增、删、改、查?
}NODE;\/\/1、写出建立一个带头结点的线性链表的函数,其中每个结点包括学号、姓名、分数三个数据域。函数形式如下:NODE *creat_link(int direction){ NODE *head,*p,*tail;int xh,i=1;if(direction==1) \/\/当direction的值为1时,新建立的结点连到尾部 { tail=head=(NODE *)malloc(sizeof(NOD...

用C语言编写链式存储结构下实现线性表的创建,插入,删除,按值查找
int data;\/\/链表数据 struct LNode* next;\/\/链表指针 }LNode,*LinkList;\/*头插法-建立单链表*\/ LinkList HeadCreate(LinkList la){ int num;la=(LinkList)malloc(sizeof(LNode));\/\/建立头结点 la->next=NULL;scanf("%d",&num);while(num!=10){ LNode *p=(LinkList)malloc(sizeof(...

...内容是建立一个链表,还有链表的插入与删除。
void createlist_wei(linklist &l,int n)\/\/尾插法 { l=new lnode;l->next=NULL;linklist p,s;p=new lnode;p=l;cout<<"请输入单链表:"<<endl;for(int i=n;i>0;--i){ s=new lnode;cin>>s->data;p->next=s;s->next=NULL;p=s;} } void createlist_tou(linklist &l,...

c语言数据结构(双向链表排序)
s->prior=p->prior;\/\/新节点的插入 s->next=p;p->prior->next=s;p->prior=s;p=(*L)->next;\/\/将指针回指到链表第一个非空节点,主要是为了下次查找插入位置 i++;} } void Display(DulLinkList L){ DulNode *p;p=L->next;printf("双向链表中的数据为:\\n");while(p!=L){ pr...

图解数组、双链表的插入与删除操作
插入:s->prior = p->prior;p->prior->next = s;s->next = p;p->prior = s;\/\/第一句必须在第四句之前完成,否则*p的前驱结点就丢掉了。删除:p->prior->next = p->next;p->next->prior = p->prior;free(p);\/\/绕过p \/\/在双向链表中进行插入和删除时,对指针的修改需要同时修改...

用C语言编写程序建立链表结构体类型实现链表初始化遍历和插入算法
include <stdlib.h> define telemtype char define ok 1 define error 0 define overflow -1 typedef int status;typedef struct bitnode { telemtype data;struct bitnode *lchild,*rchild;}bitnode,*bitree;void preordertraverse(bitree T){ if(T){ printf("%c ",T->data);preordertraverse(T...

求算法:在双向链表的值为a,b的两个结点之间插入值为x的结点?要完整的代...
p->prior->next=q;\/\/插入操作 q->next=p;q->prior=p->prior;p->prior=q;if(i==1)\/\/如果插入位置在第一个结点,调整头结点 L=q;return 1;\/\/插入成功返回1 } \/\/\/以下是删除函数,参数为链表头地址和删除位置 int Delete(LinkList &L,int i){ LinkList p;if(!(p=GetElem(L,i)...

相似回答