欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言动态分配数组

程序员文章站 2023-12-26 15:14:15
...

C语言动态分配数组

函数动态分配空间

函数名 参数及返回类型 注意事项
malloc void *malloc(size_t size) 1. void *为常指针 2. 不要忘记空字符的空间 malloc(n+## 标题1) 3.未进行初始化
calloc void *calloc(sizet nmemb,size size) 1.为分配的空间初始化成0 2.不是很常用,多用于结构体
relloc void *relloc(void *ptr,size_t size) 1.作用与上两个函数不太一样,用于调整已分配函数内存大小。2.size 表示新尺寸,当内存块不够时,relloc函数会在其它地方开辟内存块,此时地址会发生变化,故注意指针的更新。 3.对扩充的空间不会进行初始化

使用实例:

char *p;
p=(char *)malloc(20*sizeof(char);

struct part{int x,y}*p
p=calloc(1,sizeof(struct part))

char *p;
p=(char *)malloc(20*sizeof(char);
p=relloc(p,30*sizeof(char));

1.在分配空间不再需要时,一定要记住释放空间(free§),避免空间被占完
2.在没有释放空间之前,不要随意改变指向该空间的指针,避免垃圾空间的出现。
3.在释放完空间后,一定将指向该空间的指针进行赋值,(或为NULL,或为新的指向),避免悬空指针。

链表介绍
定义:由一连串结构组成
1.链表的申明
struct node{
int value;
struct node *next;
}
还需要一个时终指向第一个节点的变量,此变量名为first.
struce node *first=NULL
2.创造节点
a.分配空间
b,赋值
c.插入代码块

struct node{
int value;
struct node *next;
}*p;
p=malloc(sizeof(struct part));
p->value=20;
p->next=first;
first=p;

搜索链表

struct node *seach_list(struct node *list,int n){
while(list!=NULL && list->value!=n){
list=list->next
}
return list;
}

删除节点:
1.定位要删除的节点;
2.改变前一个节点使绕过要删除的节点;
3.用free函数回收删除节点的空间。

struct node *delete_from_list(struct node *list,int n){
struct node *per,*cur;

for(cur=first,pre=NULL;cur!=NULL && cur->value!=n;pre=cur,cur=cur->next);
if(cur=NULL){
return list}
if(pre=NULL){
  list=list->next}
 else{
 pre->next=cur->next;
 free(cur);
 }
 return list;
 }

有序链表`

#include "MyStdio.h"

void read_line(char str[], int n) {
	int i=0, ch;

	while ((ch = getchar()) != '\n') {
		if (i < n) {
			str[i++] = ch;
		}
		str[i] = '\0';
	}

}

struct part *find_part(int number) {
	struct part *p;

	for (p = inventory; p != NULL && number > p->number; p = p->next);
	if (p != NULL && number == p->number)
	{
		return p;
	}
	return NULL;
}

void   insert(void) {
	struct part *cur, *prev, *new_code;

	new_code = (struct part*)malloc(sizeof(struct part));
	if (new_code = NULL) {
		printf("Datebase is full;can not add more parts");
		return;
	}

	printf("Enter part number:");
	scanf("%d", &new_code->number);        //??小疑问

	for (cur = inventory, prev = NULL;
		cur != NULL&&new_code->number > cur->number;
		prev = cur, cur = cur->next);
	if (cur != NULL && new_code->number == cur->number) {
		printf("part is already exist");
		free(new_code);
		return;
	}

	printf("Enter part name:");
	read_line(new_code->name, STR_LEN);
	printf("Enter quality on hand");
	scanf("%d",## 标题 &new_code->on_hand);

	new_code->next = cur;
	if (prev == NULL) {
		inventory = new_code;
	}
	else {
		prev->next = new_code;
	}
}

void   search(void) {
	int number;
	struct part *p;

	printf("Enter part number:");
	scanf("%d", &number);
	p = find_part(number);
	if (p != NULL) {
		printf("Part name:%s", p->name);
		printf("Part on hand:%d", p->on_hand);
	}
	else {
		printf("Part not find");
	}
	return;

}

void   update(void) {
	int number, change;
	struct part *p;

	printf("Enter part number:");
	scanf("%d", &number);
	p = find_part(number);

	if (p != NULL) {
		printf("Enter the change in quality on hand:");
		scanf("%d", &change);
		p->on_hand += change;
	}
	else {
		printf("part not find.\n");
	}
}

void   print(void) {
	struct part *p;

	printf("Part Number  Part Name  Quality on Hand\n");
	for (p = inventory; p != NULL; p = p->next) {
		printf("%7d   %-25s%11d\n", p->number, p->name, p->on_hand);
	}

}

相关标签: C语言

上一篇:

下一篇: