C语言实现顺序表和单链表的基本操作

顺序表

在黑框输入数据时出现 “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;
}

发布了28 篇原创文章 · 获赞 12 · 访问量 1262

猜你喜欢

转载自blog.csdn.net/weixin_43264478/article/details/101714413