关于数组的问题,求救!!
能不能设置一个数组,先不确定它的长度,然后每次进来一个数就依次放到数组里(第0位,第1位,第2位。。。),直到所有的数都存放进来,也就确定了数组的长度。
或者不用数组也行,只要能实现上述功能。请高人指点!!
[解决办法]
参考
http://blog.csdn.net/fm0517/article/details/4254099
http://www.cplusplus.com/reference/stl/vector/
[解决办法]
根据你的需要,你自己取舍。
#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define TRUE 1#define FALSE 0typedef struct Node /* 定义一个结构体变量 用来存储节点的数据域和指针域 */{ int dat; struct Node* pNext;}NODE, *pNODE;pNODE create_list(void); /* 创建一个链表 */int is_empty(pNODE pHead); /* 判断链表是否为空 */void travers_list(pNODE pHead); /* 遍历一个链表 */int delete_node(pNODE pHead); /* 删除一个节点 */int insert_list(pNODE pHead); /* 插入一个链表 */void sort_list(pNODE pHead); /* 给链表中的数值排序 */int length_list(pNODE pHead); /* 计算链表的长度 */int main(void){ pNODE pHead = NULL; pHead = create_list(); printf("链表的长度为:%d\n",length_list(pHead)); sort_list(pHead); travers_list(pHead); printf("\n"); delete_node(pHead); if (delete_node(pHead)) { printf("删除成功!\n"); } printf("链表的长度为:%d\n",length_list(pHead)); travers_list(pHead); printf("\n"); insert_list(pHead); printf("链表的长度为:%d\n",length_list(pHead)); travers_list(pHead); printf("\n"); return 0;}pNODE create_list(void){ int val = 0; int len = 0; pNODE pHead = (pNODE)malloc(sizeof(NODE)); if (NULL == pHead) { printf("内存分配失败!\n"); exit(-1); /* 内存分配失败,退出程序 */ } pNODE pTail = pHead; /* 定义一个临时的头节点指针,因为这个临时的头结点指针会变化, 就是通过这个和后面的节点联系起来的 */ pTail->pNext = NULL; printf("请输入节点数 len = ",len); scanf("%d",&len); for (int i = 0; i < len; i++) { printf("输入第%d个节点的值:", i + 1); scanf("%d", &val); pNODE pNew = (pNODE)malloc(sizeof(NODE)); if (NULL == pNew) { printf("内存分配失败!\n"); exit(-1); } pNew->dat = val; /* 给节点赋值 */ pTail->pNext = pNew; /* 让每个新节点都连接在最后一个节点的后面 */ pNew->pNext = NULL; /* 算给每个新的节点的指针初始化吧 */ pTail = pNew; /* 再让最后一个节点指针指向此新节点 */ } return pHead;}void travers_list(pNODE pHead){ pNODE p = pHead->pNext; /* 定义一个临时的节点指针 */ while (NULL != p) /* 判断是否存在此节点 */ { printf("%d ", p->dat); p = p->pNext; /* p一直指向此节点*/ } printf("\n");}int is_empty(pNODE pHead){ if (NULL == pHead->pNext) { return TRUE; } else { return FALSE; }}int delete_node(pNODE pHead){ int num = 0; int len = length_list(pHead); if (is_empty(pHead)) { printf("此链表是空的,删除节点失败!\n"); return FALSE; } else { printf("请输入被删除节点的序号num = "); scanf("%d", &num); if (num <= 0 || num > len) { printf("删除的节点序号范围有错,删除失败!\n"); return FALSE; } pNODE p = pHead; /* 不能直接使用头结点,因为头结点是不能被改变的 */ pNODE r = NULL; for (int i = 0; i < num - 1; i++) /* 让p指向被删节点的前一个节点 */ { p = p->pNext; } r = p->pNext; /* 用这个临时的指针指向要被删除的节点 */ p->pNext = r->pNext; /* 让被删节点的前一个节点的pNext指向被删节点的后面一个节点 */ free(r); } return TRUE;}int insert_list(pNODE pHead){ int num,val; num = val = 0; pNODE p = pHead; pNODE pNew = (pNODE)malloc(sizeof(NODE)); printf("输入插入的位置num = ",num); scanf("%d",&num); if (num < 1 || num > length_list(pHead) + 1) { printf("插入位置不对,插入失败!\n"); return FALSE; } else { printf("输入插入的值 val = ",val); scanf("%d",&val); for (int i = 0; i < num - 1; i++) { p = p->pNext; } pNODE r = NULL; /* 临时指针 */ r = p->pNext; /* 用这个临时变量指向插入位置 */ p->pNext = pNew; pNew->pNext = r; pNew->dat = val; } return TRUE;}void sort_list(pNODE pHead){ int i,j,t; int len = length_list(pHead); pNODE p,q; p = pHead; for (i = 0,p = p->pNext; i < len - 1;i++,p = p->pNext) { for (j = i + 1,q = p->pNext; j < len; j++,q = q->pNext) { if (p->dat > q->dat) /* 类似于数组中的a[i] > a[j]*/ { t = p->dat; p->dat = q->dat; q->dat = t; } } }}int length_list(pNODE pHead){ int i = 0; pNODE p = pHead; while(p = p->pNext) i++; return i;}
[解决办法]