顺序表
在黑框输入数据时出现 “0xC0000005: 写入位置 0xCDCDCDC 时发生访问冲突”
异常,先贴在这咯
#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable : 4996)
#define ListSize 10
#define ListIncrement 3
typedef int LElemType;
typedef struct {
LElemType *base;
int length;
int listsize;
}Sqlist;
void InitSqlist(Sqlist &L) {
L.base = (LElemType*)malloc(ListSize * sizeof(LElemType));
if (!L.base)
return;
int length = 0;
int listsize = ListSize;
}
int ListEmpty(Sqlist L) {
if (L.length != 0)
return 0;
return 1;
}
int ListLength(Sqlist L) {
return L.length;
}
void GetElem(Sqlist L, int i, int &e) {
if (i<0 || i>L.length)
return;
e = L.base[i - 1];
}
int LocateElem(Sqlist L, int e) {
int i = 0;
while (i < L.length) {
if (e == L.base[i])
return i+1;
i++;
}
return 0;
}
void ListInsert(Sqlist &L, int i, int e) {
if (i<1 || i>L.length+1)
return;
if (L.length >= L.listsize) {
LElemType *newbase = (LElemType*)realloc(L.base, (ListSize + ListIncrement)*sizeof(LElemType));
if (!newbase)
return;
L.base = newbase;
L.listsize = ListSize + ListIncrement;
for (int j = L.length; j>=i; j--)
L.base[j] = L.base[j - 1];
L.base[i] = e;
L.length++;
}
}
void ListDelete(Sqlist &L, int i,int &e) {
if (i<0 || i>L.length)
return;
e = L.base[i- 1];
while (i < L.length) {
L.base[i - 1] = L.base[i];
i++;
}
L.length--;
}
int main() {
Sqlist L;
InitSqlist(L);
printf("请输入整型数据,按ctrl+z +enter 结束输入/n");
int i = 0;
while (scanf("%d", L.base[i]) != EOF) {
L.length++;
i++;
}
if (ListEmpty(L)) {
printf("为空/n");
}
else
printf("非空/n");
int j;
printf("输入带查找的元素位序/n");
scanf("%d",&j);
printf("第%d个元素值为%d", j, GetElem);
printf("输入待插入元素位序和值/n");
int a, b;
scanf("%d%d",&a,&b);
ListInsert(L,a,b);
printf("输入待查找位序的元素值/n");
int c;
scanf("%d", &c);
printf("%d", LocateElem(L,c));
//.........//
return 0;
}
单链表
#include <stdio.h>
#include <stdlib.h>
typedef int LElemType;
typedef struct LNode {
LElemType data;
struct LNode *next;
}LNode,*LinkList; //节点的结构,包括数据和指向下一个节点的指针
void CreatLinkList_Head(LinkList &L, int n) { //引用作为形参,与指针相比减少空间使用
L= (LinkList)malloc(sizeof(LNode)); //申请头节点( malloc函数返回开辟空间的第一个地址)赋给头指针L(指向列表的第一个节点,标志列表)
L->next = NULL; //使用头指针进行操作,数据为空 链向NULL
int i = 0;
while (i < n) {
LinkList p = (LinkList)malloc(sizeof(LNode)); //申请待插入节点
scanf("%d", &p->data);
p->next = L->next;
L->next = p;
i++;
}//头插法是在头节点后不断插入,最后遍历数据与输入数据次序相反
}
void CreatLinkList_Tail(LinkList &L, int n) {
L = (LinkList)malloc(sizeof(LNode));
LinkList pre = L; //作为移动指针记住尾节点
int i = 0;
while (i < n) {
LinkList p = (LinkList)malloc(sizeof(LNode));
scanf("%d", &p->data);
pre->next=p; //第一次遍历把新节点链到了头节点(此时链表的末尾节点)后,
pre = p; //pre指向了末尾节点,之后的遍历同样都是在链在了末尾节点后
}
pre->next = NULL;
}//尾插法是在一个作为标记的尾节点后不断插入
int ListEmpty(LinkList L) {
if (!L->next)
return 1;
return 0;
} //判表空,空则返回1
int ListLength(LinkList L) {
int count = 0;
LinkList pre = L;
while (pre) {
pre = pre->next;
count++;
}
return count - 1; //pre=L->next; return count;
} //使用计数器变量求表长
void GetElem(LinkList L, int i, LElemType &e) {
LinkList pre = L->next; int j = 1;
while (pre&&j < i) {
pre = pre->next;
j++;
}
if ( !pre)
return;
pre->data;
}
int LocateElem(LinkList L, LElemType e) {
LinkList pre = L->next; int j = 1;
while (pre) {
if (pre->data == e)
return j;
pre = pre->next;
j++;
}
return 0;
}
void ListInsert(LinkList &L,int i, LElemType e) {
int j = 0; LinkList pre =L;
while (pre&&j<i-1) { //查找第i-1个元素
j++; pre = pre->next;
}
if (!pre)
return; //if(!pre||j>i-1)????
LinkList p = (LinkList)malloc(sizeof(LNode));
p->data = e;
p->next = pre->next;
pre->next = p;
}
void ListDelete(LinkList &L, int i, LElemType &e) {
int j = 0; LinkList pre = L;
while (pre->next&&j < i - 1) {
j++; pre = pre->next;
}
if (!pre)
return;
LinkList s = pre->next;
pre->next = s->next;
e = s->data;
free(s);
}
int main() {
return 0;
}