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);
}
}