//如果你的指向问题搞不清楚,请一定记住等于号的左边指向等于号的右边
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#define LEN sizeof(NODE)
typedef struct node{
int data;
struct node *prev;
struct node *next;
}NODE;
//定义的双向链表为全局变量
NODE *p;
//创建双向链表函数
void create_link(){
NODE *temp,*new,*rear;
int n;
int a;
p = (NODE *)malloc(LEN);
p->next = NULL;
rear = p;
printf("insert length you want create!\n");
scanf("%d",&n);
getchar();
printf("input data you want to insert:\n");
while(n > 0){
new = (NODE *)malloc(LEN);
scanf("%d",&a);
new->data = a;
rear->next = new; //赋值操作,rear这个节点指向new新节点,头节点为空
new->prev =rear; //成为双向链表
rear = new; //每创建新的节点,则将rear向后移动
//头尾双向
//p = rear->next;
rear->next = p;
p->prev = rear;
//rear = p->prev;
n --;
}
printf("create success!------\n");
}
//将链表顺序输出函数
void output_link1(){
NODE *t;
t = p->next;
if(t == NULL)
printf("link is empty!\n");
else{
do{
printf("%d\n",t->data);
t = t->next;
}while(t != p); //限定条件为循环到头节点则停止
}
}
//将链表逆序输出函数
void output_link2(){
NODE *t;
t = p->prev;
if(t == NULL)
printf("link is empty!\n");
else{
do{
printf("%d\n",t->data);
t = t->prev;
}while(t != p);
}
}
//查找链表中指定值的函数,输出节点序号
void search_link(){
int num;
NODE *t;
t = p->next;
int section = 1;
printf("please input data you want to search!\n");
scanf("%d",&num);
if(t ==NULL)
printf("link is empty!\n");
else{
do{
if(t->data ==num){
printf("find success!the %d section!\n",section);
break;
}
else{
section++;
t = t->next;
}
}while(t != p);
}
}
//输入指定插入data位置的插入操作函数
void insert_link(){
int num;
int pos;
int i = 1;
NODE *t;
NODE *new;
printf("please input positon you want to insert!\n");
scanf("%d",&pos);
printf("please input data you want to insert!\n");
scanf("%d",&num);
t = p->next;
if( t == NULL)
printf("please input data you want to search!\n");
else{
do{
if(i== pos){
new = (NODE *)malloc(LEN);
//以下操作是个四个指针的指向问题,首先注意的链表指向不能断开,其次是哪个先指向哪个。
//先让t节点之前的节点指向新的节点,因为t已经存在在那里,不会lose,如果直接让让new指向t,那么如何找到t之前的那个节点呢?这个时候就存在问题了。
new->data = num;
t->prev->next = new;
//new->next = t;
new->prev = t->prev;
new->next = t;
t->prev = new;
break; //找到则break,break很重要!
}
else{
t = t->next;
++i;
}
}while(t != p);
output_link1();
}
}
//删除入定的节点data的函数。
void deleate_link(){
int num;
NODE *t;
t = p->next;
printf("please input data you want to deleate!\n");
scanf("%d",&num);
if(t ==NULL)
printf("the link is empty!\n");
else{
do{
if(t->data == num){
t->prev->next = t->next;
//t>next = t->prev->next;
t->next->prev = t->prev;
//t->prev = t->next->prev;
output_link1();
break;
}
else t = t->next;
}while(t != p);
}
}
int main(int argc,char *argv[]){
//NODE *p;
int a;
while(1){
printf("double link chocies------\n");
printf("create number 1:\noutput number in turn 2:\noutput number in reverse 3:\nsearch number 4:\ninsert number 5:\ndeleat number 6:\n");
scanf("%d",&a);
switch(a){
case 1:create_link();break;
case 2:output_link1();break;
case 3:output_link2();break;
case 4:search_link();break;
case 5:insert_link();break;
case 6:deleate_link();break;
default:;break;
}
}
return 0;
}
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#define LEN sizeof(NODE)
typedef struct node{
int data;
struct node *prev;
struct node *next;
}NODE;
//定义的双向链表为全局变量
NODE *p;
//创建双向链表函数
void create_link(){
NODE *temp,*new,*rear;
int n;
int a;
p = (NODE *)malloc(LEN);
p->next = NULL;
rear = p;
printf("insert length you want create!\n");
scanf("%d",&n);
getchar();
printf("input data you want to insert:\n");
while(n > 0){
new = (NODE *)malloc(LEN);
scanf("%d",&a);
new->data = a;
rear->next = new; //赋值操作,rear这个节点指向new新节点,头节点为空
new->prev =rear; //成为双向链表
rear = new; //每创建新的节点,则将rear向后移动
//头尾双向
//p = rear->next;
rear->next = p;
p->prev = rear;
//rear = p->prev;
n --;
}
printf("create success!------\n");
}
//将链表顺序输出函数
void output_link1(){
NODE *t;
t = p->next;
if(t == NULL)
printf("link is empty!\n");
else{
do{
printf("%d\n",t->data);
t = t->next;
}while(t != p); //限定条件为循环到头节点则停止
}
}
//将链表逆序输出函数
void output_link2(){
NODE *t;
t = p->prev;
if(t == NULL)
printf("link is empty!\n");
else{
do{
printf("%d\n",t->data);
t = t->prev;
}while(t != p);
}
}
//查找链表中指定值的函数,输出节点序号
void search_link(){
int num;
NODE *t;
t = p->next;
int section = 1;
printf("please input data you want to search!\n");
scanf("%d",&num);
if(t ==NULL)
printf("link is empty!\n");
else{
do{
if(t->data ==num){
printf("find success!the %d section!\n",section);
break;
}
else{
section++;
t = t->next;
}
}while(t != p);
}
}
//输入指定插入data位置的插入操作函数
void insert_link(){
int num;
int pos;
int i = 1;
NODE *t;
NODE *new;
printf("please input positon you want to insert!\n");
scanf("%d",&pos);
printf("please input data you want to insert!\n");
scanf("%d",&num);
t = p->next;
if( t == NULL)
printf("please input data you want to search!\n");
else{
do{
if(i== pos){
new = (NODE *)malloc(LEN);
//以下操作是个四个指针的指向问题,首先注意的链表指向不能断开,其次是哪个先指向哪个。
//先让t节点之前的节点指向新的节点,因为t已经存在在那里,不会lose,如果直接让让new指向t,那么如何找到t之前的那个节点呢?这个时候就存在问题了。
new->data = num;
t->prev->next = new;
//new->next = t;
new->prev = t->prev;
new->next = t;
t->prev = new;
break; //找到则break,break很重要!
}
else{
t = t->next;
++i;
}
}while(t != p);
output_link1();
}
}
//删除入定的节点data的函数。
void deleate_link(){
int num;
NODE *t;
t = p->next;
printf("please input data you want to deleate!\n");
scanf("%d",&num);
if(t ==NULL)
printf("the link is empty!\n");
else{
do{
if(t->data == num){
t->prev->next = t->next;
//t>next = t->prev->next;
t->next->prev = t->prev;
//t->prev = t->next->prev;
output_link1();
break;
}
else t = t->next;
}while(t != p);
}
}
int main(int argc,char *argv[]){
//NODE *p;
int a;
while(1){
printf("double link chocies------\n");
printf("create number 1:\noutput number in turn 2:\noutput number in reverse 3:\nsearch number 4:\ninsert number 5:\ndeleat number 6:\n");
scanf("%d",&a);
switch(a){
case 1:create_link();break;
case 2:output_link1();break;
case 3:output_link2();break;
case 4:search_link();break;
case 5:insert_link();break;
case 6:deleate_link();break;
default:;break;
}
}
return 0;
}