发的文件main. c运行出来是这个样子的,但在的项目里面又运行的出来,的复制粘贴过来我项目里也没有运行出来,请问是什么问题
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
typedef int* Elemtype;
#define overflow -2
#define error -1
typedef int Elemtype;
/*双链表链表结点结构体定义*/
typedef struct DuLNode{
Elemtype data; //数据域
struct DuLNode *prior; //指针域,指向前驱
struct DuLNode *next; //指针域,指向后继
}DuLNode,*DuLinkList;
/*尾插法,建立双向循环链表*/
void CreateListR(DuLinkList *DL, int n){
/************头结点*************/
*DL = (DuLNode*)malloc(sizeof(DuLNode));
if(!(*DL)) exit(overflow);
(*DL)->prior = NULL;
(*DL)->next = NULL;
/************头结点*************/
int i;
DuLinkList DR;
DR=*DL; //DR指向尾结点
/************循环建立新结点,并将新结点尾插在当前尾结点后*************/
for(i=0;i<n;i++){
DuLinkList DP;
DP = (DuLNode*)malloc(sizeof(DuLNode));
if(!DP) exit(overflow);
DP->data = i+1;
DP->prior = DR; //尾插操作序列
DR->next = DP;
DR = DP;
}
/************循环建立新结点,并将新结点尾插在当前尾结点后*************/
/************建立循环链表,尾结点next域指向头结点,头结点prior域指向尾结点*************/
DR->next = (*DL);
(*DL)->prior = DR;
/************建立循环链表,尾结点next域指向头结点,头结点prior域指向尾结点*************/
}
/*遍历双向循环链表,返回链表长度*/
int ListTraverse(DuLinkList DL){
/*************判断链表是否为空,请思考下判断双循环链表是否为空的条件*************/
if(DL->next == DL || DL->prior == DL) {
printf("DuLinkList is NULL\n");
return 0;
}
/*************判断链表是否为空,请思考下判断双循环链表是否为空的条件*************/
int length = 0;
printf(" DuLinkList is:\n");
DuLinkList DR = DL->next;
/*************DR向后遍历链表,打印数据,请思考下循环结束的条件*************/
while(!(DR == DL)){
printf("%d\t",DR->data);
DR=DR->next;
length++;
}
/*************DR向后遍历链表,打印数据,请思考下循环结束的条件*************/
printf("\n");
return length;
}
/*设以带头结点的双向循环链表表示的线性表为L=(a1,a2,a3,…,an)。
试写一时间复杂度O(n)的算法,将L改造为L=(a1,a3,…,an,…,a4,a2)。*/
void ListTransform(DuLinkList *DL,int ListLength){
/*************判断链表是否为空,判断链表长度是否小于等于2,若满足则不做修改*************/
if( (*DL) == NULL || (*DL)->next == DL || (*DL)->prior == DL) return;
if(ListLength ==1 || ListLength==2 )return;
/*************判断链表是否为空,判断链表长度是否小于等于2,若满足则不做修改*************/
DuLinkList DP,DQ,DR,DW;//DP指向第1个结点,DQ指向第2个结点,DR指向奇数结点,DW指向偶数结点
/*************将尾结点的next域断开,是否需要断开呢?*************/
(*DL)->prior->next = NULL;
(*DL)->prior = NULL;
/*************将尾结点的next域断开,是否需要断开呢?*************/
/*************断开链表,只保留头结点后的两个结点DP和DQ,
并用DR保留第三个结点后的链表*************/
DP = (*DL)->next; DQ = DP->next; DR = DQ->next;
DQ->next = (*DL); (*DL)->prior = DQ;
DP->next = NULL; DQ->prior = NULL; DR->prior = NULL; //断开DP和DQ
/*************断开链表,只保留头结点后的两个结点DP和DQ,
并用DR保留第三个结点后的链表*************/
/*************遍历第三个结点后的链表数据,奇数结点尾插至DP后面,
偶数结点头插至DQ前面*************/
while(!(DR == NULL)){
/*************更新DW**************/
DW=NULL; //这是关键一步,同学们思考下如果没有这步会发生什么情况
if(!(DR->next==NULL)) {
DW=DR->next;
}
/*************更新DW**************/
/*************DR尾插至DP之后**************/
DR->next = NULL;
DR->prior = DP;
DP->next = DR;
DP=DR;
/*************DR尾插至DP之后**************/
/*************DW头插至DQ之前,并更新DR**************/
if(!(DW==NULL)){
DR = DW->next;
DW->prior = NULL;
DW->next = DQ;
DQ->prior = DW;
DQ=DW;
}else{
DR = NULL;
}
/*************DW头插至DQ之前,并更新DR**************/
}
/*************遍历第三个结点后的链表数据,奇数结点尾插至DP后面,
偶数结点头插至DQ前面*************/
DP->next = DQ; DQ->prior = DP;//连接DP和DQ
}
int main(int argc, char *argv[]) {
DuLinkList DL;
printf("\n************************建立双循环链表**************************\n");
CreateListR(&DL,9);
int ListLength = ListTraverse(DL);
printf("\n************************变换双循环链表**************************\n");
ListTransform(&DL,ListLength);
ListTraverse(DL);
return 0;
}