#include<stdio.h> #define Maxsize 7 typedef int DataType; //顺序表定义 typedef struct { DataType data[Maxsize]; int length; }SeqList; void InsertSeqlist(SeqList* L,DataType x,int i); void DeleteSeqlist(SeqList* L,int i); int LocateSeqlist(SeqList* L,DataType x); //单链表定义 typedef struct node{ DataType data; //数据域 struct node* next;//指针域 } Node,*LinkList; LinkList InitateLinkList(); int LengthLinkList(LinkList head); Node * GetLinkList(LinkList head,int i); int LocateLinkList(LinkList head,DataType x); void InsertLinkList(LinkList head,DataType x,int i); void DeleteLinkList(LinkList head,int i); LinkList head;
Liner.h
#include<stdio.h> #include<stdlib.h> #include"Liner.h" void InsertSeqlist(SeqList* L,DataType x,int i) { int j=0; //将元素x插入到顺序表L的第i个数据元素之前 if(L->length==Maxsize) { exit(1); } //检测位置 if(i<1 || i>L->length+1) exit(1); for(j=L->length;j>=i;j--) L->data[j]=L->data[j-1]; L->data[j]=x; L->length++; } void DeleteSeqlist(SeqList* L,int i) { int j=0; if(i<1 || i>L->length) { printf("删除位置错误!"); exit(1); } //删除操作 for(j=i-1;j<L->length-1;j++) { L->data[j]=L->data[j+1]; } L->length--; } int LocateSeqlist(SeqList* L,DataType x) { int i=0; while((i<L->length) && L->data[i]!=x) i++; if(i<L->length) return i+1; else return 0; } //单链表操作算法 LinkList InitateLinkList() { //建立一个空的单链表 LinkList head; head=(LinkList)malloc(sizeof(Node));//强制转换 head->next=NULL; return head; } int LengthLinkList(LinkList head) { //求单链表的长度 Node *p=head; int cnt=0; while(p->next!=NULL) { p=p->next; cnt++; } return cnt; } Node * GetLinkList(LinkList head,int i) { int c=1; //获取指定为位置的节点 Node *p; p=head->next;//head节点不存储数据 while(c<i && p!=NULL) { p=p->next;c++; } if(i==c) return p; else return NULL; } int LocateLinkList(LinkList head,DataType x) { //根据数据元素查找位置 int i=1; Node *p=head->next; while(p!=NULL && p->data!=x) { p=p->next;i++; } if(p->data==x) return i; else return 0; } void InsertLinkList(LinkList head,DataType x,int i) { Node *p; Node *pre; Node *node; int index=0; //在表head的第i个数据元素节点之前插入一个以x为值的新节点 if(1>i || i>LengthLinkList(head)) { printf("对不起,插入位置错误!插入位置介于%d至%d",1,LengthLinkList(head)); exit(1); } p=head->next; pre=NULL;//上一个 while(p!=NULL && index+1!=i) { pre=p; p=p->next;index++; } //插入操作 if(index+1==i) { node=(Node*)malloc(sizeof(Node)); node->data=x; node->next=p; pre->next=node; } } void DeleteLinkList(LinkList head,int i) { Node *q,*p; if(i==1) q=head; else q=GetLinkList(head,i-1); if(q!=NULL && q->next!=NULL) { p=q->next; q->next=p->next; free(p); } else exit(1); }
Liner.c
错误提示:
错误 1 error C2371: “SeqList”: 重定义;不同的基类型 datastruct\datastruct\linearl.h 11 1 DataStruct
错误 2 error C2011: “node”:“struct”类型重定义 datastruct\datastruct\linearl.h 14 1 DataStruct
插入第i个数,插错了吧应该是L.data[j]=x;应该是L.data[j-1]=x;吧
没有错误,这个问题是工程项目本身的问题。新建一个项目后把代码拷贝过去编译通过...
@IceS: 编译是可以通过,是你插入的地方要的错了
@blue fire: if(i<1 || i>L->length)
{
printf("删除位置错误!");
exit(1);
}
这个也错了吧,你下面i<L->length-1,那么上面就应该是
if(i<1 || i>=L->length)
{
printf("删除位置错误!");
exit(1);
}
@blue fire: 没有错误,下面是测试代码。
#include<stdio.h> #include"Liner.h" int main(void) { int i=0; SeqList student={{0},0};//声明并初始化 InsertSeqlist(&student,1,1); InsertSeqlist(&student,2,2); InsertSeqlist(&student,3,3); InsertSeqlist(&student,4,4); printf("显示信息表元素:"); PrintfSeqList(student); printf("线性表长度:%d\r\n\r\n",student.length); for(i=student.length;i>0;i--) { printf("执行删除操作...\r\n删除第%d个\r\n",i); DeleteSeqlist(&student,i); PrintfSeqList(student); printf("\r\n"); } getchar(); return 0; }