/*------结点-------*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct ListNode{
void *key;
struct ListNode *prev;
struct ListNode *next;
}ListNode;
typedef struct LinkedList{ /*链表类型结构体*/
unsigned long eleSize; /*元素的储存宽度*/
int(*comp)(void *,void *); /*元素数据比较规则*/
ListNode *nil; /*头指针*/
int n; /*元素个数*/
}LinkedList;
ListNode *createListNode(void *d,int size){ /*创建结点*/
ListNode *x=(ListNode *)malloc(sizeof(ListNode));/*为X分配空间*/
assert(x!=NULL); /*若x为空,中断*/
if(d&&size){ /*需要加载的关键值*/
x->key=(void *)malloc(size); /*分配空间*/
assert(x->key!=NULL); /*若x->key为空,中断*/
memcpy(x->key,d,size); /*从d指针中拷贝大小为size长度的数据给key,加载关键值*/
x->prev=x->next=NULL;}return x;} /*链域置空,返回x的值*/
void clearListNode(ListNode *x,void(*proc)(void *)){ /*清理结点*/
if(x!=NULL){
if(proc!=NUll){proc(x->key);free(x->key);} /*处理关键值,释放x->key*/
x->next=x->prev=NULL;} /*链域置空*/
LinkedList *createList(unsigned long size,int(*comp)(void *,void *)){ /*创建新链表*/
LinkedList *L=(LinkedList *)malloc(sizeof(LinkedList)); /*分配空间*/
assert(L!=NULL); /*若L为空,则中断程序*/
L->nil=createListNode(NULL,0); /*将nil的关键值置空*/
L->nil->prev=L->nil->next=L->nil; /*将nil指向自身*/
L->n=0; /*将元素个数置为*/
L->eleSize=size; /*设置元素数据存储宽度*/
L->comp=comp; /*设置元素数据比较规则*/
return L;} /*返回数值L*/
void clearLinkedList(Linkedlist *L,void(*comp)(void *,void *)){ /*清理链表*/
LinkedList *x=L->nil->next; /*x指向头结点*/
while(x!=L->nil){ /*若x非nil*/
LinkedListDelet(L,x); /*删除x*/
clearListNode(x,proc); /*清理x*/
free(x); /*释放x的空间*/
x=L->nil->next;} /*x指向头结点*/
free(L->nil); /*释放哨兵结点的空间*/
L->comp=NULL;}
int LinkedLisrEmpty(LinkedList *L){
return L->nil->next==L->nil;} /*检查链表是否为空*/
void LinkedListTravers(LinkedList *L,void(*proc)(void *)){ /*输出链表*/
ListNode *x=L->nil->next;
while(x!=L->nil){
proc(x->key);
x=x->next;}}
ListNode *Listsearch(LinkedList *L,void *e){ /*在链表中查找*/
int(*comp)(void *,void *)=L->comp;
ListNode *x=L->nil->next; /*x指向头结点*/
while(x!=L->nil&&comp(x->key,e)!=0) /*x非nil且关键值非e*/
x=x->next; /*x后移一个结点*/
return x;}
void LinkedListInsert(Linkedlist *L,ListNode *a,void *k){ /*在L的a之前插入元素k*/
int size=L->eleSize;
ListNode *x=createListNode(k,size);
ListNode *b=a->prev;
L->n++;
x->next=a;
x->prev=b;
a->prev=b->next=x;}
void LinkedListDelete(LinkedList *L,ListNode *x){ /*在链表中删除节点*/
if(x==L->nil)return;
ListNode *a=x->next;
ListNode *b=x->prev;
b->next=a;
a->prev=b;
L->n--;}
void LinkedListPushFront(LinkedList *L,void *k){ /*在表首插入*/
LinkedListInsert(L,L->nil->next,k);}
void LinkedListPushBack(LinkedList *L,void *k){ /*在表尾插入*/
LinkedListInsert(L,L->nil,k);}
你贴一下报的什么错误吧,链表的逻辑我没有仔细看,就只说一些小问题:
首先,你这有很多拼写错误,clearListNode里面那个if,NULL写成了NUll,并且这个函数的大括号不匹配,最后少了一个。
clearLinkedList的第一个参数,LinkedList,你写成了Linkedlist。
LinkedListInsert的第一个参数同样打成了Linkedlist。
第二,一个赋值类型错误,clearLinkedList的第一行,next指针得到的是一个Node,你怎么赋给List。
第三,一些调用错误,clearLinkedList里面调用clearListNode,第二个参数proc根本就没有定义,LinkedListDelet也没有在前面声明(而且和后面定义的函数比也少了个e)。
最后,assert这个宏没有导进来,需要#include<assert.h>,而且也没什么必要用这个。
解决上述问题之后就没有语法错误了,运行中会不会有什么错误就得再调试解决了
typedef struct ListNode{
void *key;
struct ListNode *prev;
struct ListNode *next;
}ListNode;
void LinkedListDelete(LinkedList *L,ListNode *x){ /*在链表中删除节点*/
if(x==L->nil)return;
ListNode *a=x->next;
ListNode *b=x->prev;
b->next=a;
a->prev=b;
L->n--;}
错误:
E:\VC文件\LinkedList\Linkedlist.c(72) : error C2275: 'ListNode' : illegal use of this type as an expression
E:\VC文件\LinkedList\Linkedlist.c(10) : see declaration of 'ListNode'
E:\VC文件\LinkedList\Linkedlist.c(72) : error C2065: 'a' : undeclared identifier
E:\VC文件\LinkedList\Linkedlist.c(73) : error C2275: 'ListNode' : illegal use of this type as an expression
E:\VC文件\LinkedList\Linkedlist.c(10) : see declaration of 'ListNode'
E:\VC文件\LinkedList\Linkedlist.c(73) : error C2065: 'b' : undeclared identifier
E:\VC文件\LinkedList\Linkedlist.c(74) : error C2223: left of '->next' must point to struct/union
E:\VC文件\LinkedList\Linkedlist.c(75) : error C2223: left of '->prev' must point to struct/union
执行 cl.exe 时出错.
@jorks: 这个我这没问题啊,可能是编译器的问题吧,你试试下面两种方法:
1. 把结构体声明里面用到本结构体对象的地方用另一个名字替代如换成小写:
typedef struct listnode{
void *key;
struct listnode *prev;
struct listnode *next;
}ListNode;
2. C语言要求变量声明都在函数最前面,不过gcc对于不这么做的只会报一个warn,可能VC比较严格吧,把这个函数改成下面这样:
void LinkedListDelete(LinkedList *L,ListNode *x){ /*在链表中删除节点*/
ListNode *a, *b;
if(x==L->nil)return;
a=x->next;
b=x->prev;
b->next=a;
a->prev=b;
L->n--;}
@琴剑飘零: 没用····
typedef struct listnode{
void *key;
struct listnode *prev;
struct listnode *next;
}ListNode;
void LinkedListDelete(LinkedList *L,ListNode *x){ /*在链表中删除节点*/
if(x==L->nil)return;
ListNode *a,*b;
a=x->next;
b=x->prev;
b->next=a;
a->prev=b;
L->n--;}
错误:
:\VC文件\LinkedList\Linkedlist.c(72) : error C2275: 'ListNode' : illegal use of this type as an expression
E:\VC文件\LinkedList\Linkedlist.c(10) : see declaration of 'ListNode'
E:\VC文件\LinkedList\Linkedlist.c(72) : error C2065: 'a' : undeclared identifier
E:\VC文件\LinkedList\Linkedlist.c(72) : error C2065: 'b' : undeclared identifier
E:\VC文件\LinkedList\Linkedlist.c(72) : error C2100: illegal indirection
E:\VC文件\LinkedList\Linkedlist.c(73) : warning C4047: '=' : 'int ' differs in levels of indirection from 'struct listnode *'
E:\VC文件\LinkedList\Linkedlist.c(74) : warning C4047: '=' : 'int ' differs in levels of indirection from 'struct listnode *'
E:\VC文件\LinkedList\Linkedlist.c(75) : error C2223: left of '->next' must point to struct/union
E:\VC文件\LinkedList\Linkedlist.c(76) : error C2223: left of '->prev' must point to struct/union
执行 cl.exe 时出错.
Creating browse info file...
LinkedList.exe - 1 error(s), 0 warning(s)
@jorks: ListNode *a,*b;这一句放在函数的最前面(if(x==L->nil)return;的前面)呢?C里应该是变量声明在所有代码的前面,我没用过VC,我这也没编译环境,只能是猜。你是每个函数里面都有这么一大堆错吧?
@琴剑飘零: 就只有这个了!我在写链表程序!