- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我刚开始使用链接列表,不太确定我是否做得对。我正在尝试初始化一个链接列表并用.txt文件中的信息填充它。然后使用打印功能,我只想打印出链接列表中的信息。但是每次我试图遍历链表并打印出指针中的内容时,它都会崩溃。任何提示都会有帮助和感激。这是我的代码:
struct employeeData {
int EMP_ID;
char name[20];
int dept;
int rank;
double salary;
};
struct employeeData employee;
struct node {
struct employeeData employee;
struct node *next;
};
struct node *myList = NULL;
struct node initializeList (struct employeeData employee[], struct node myList[]);
void print (struct employeeData employee[], struct node myList[]);
int main () {
int x;
initializeList(&employee, &*myList);
print(&employee, &*myList);
System("PAUSE");
return 0;
}
struct node initializeList (struct employeeData employee[], struct node myList[]){
struct node *newNode = (struct node*)(malloc(sizeof(struct node)));
FILE *ifp;
ifp = fopen("empInfo.txt", "r");
fscanf(ifp, "%d %s %d %d %lf\n", &newNode->employee.EMP_ID, newNode->employee.name, &newNode->employee.dept, &newNode->employee.rank, &newNode->employee.salary);
//newNode->next = NULL;
myList = newNode;
struct node *temptr = myList;
while (newNode->employee.EMP_ID != 0) {
fscanf(ifp, "%d %s %d %d %lf\n", &newNode->employee.EMP_ID, newNode->employee.name, &newNode->employee.dept, &newNode->employee.rank, &newNode->employee.salary);
temptr->next = newNode;
newNode->next = NULL;
}
return *myList;
}
void print (struct employeeData employee[], struct node myList[]){
struct node *temptr = myList;
printf("WOW");
while(temptr->next!=NULL){
printf("WOW");
printf("%d %s %d %d %lf\n", temptr->employee.EMP_ID, temptr->employee.name, temptr->employee.dept, temptr->employee.rank, temptr->employee.salary);
temptr = temptr->next;
}
}
最佳答案
首先,您不必创建两个独立的结构来创建链接列表。。
你可以这样做:
struct list {
/* struct members */
struct list *next;
}
struct employeeData ** data_array
,一个指针作为
struct employeeData * data
。所以在
struct employeeData employee[]
中没有意义。另外,this:
&*employee
与this:
employee
完全相同,只是第二个稍有效率,因为在第一个变量中,您得到变量的地址,然后取消对它的引用,实际上什么也不做。
struct employeeData {
int EMP_ID;
char name[20];
int dept;
int rank;
double salary;
struct employeeData *next;
};
initializeList function ..
fscanf
两次。
struct employeeData *getEmployeeData (const char * filename) {
FILE *ifp = fopen(filename, "r");
if ( ifp == NULL )
return NULL;
struct employeeData *employee = malloc(sizeof(struct employeeData));
struct employeeData *temptr = employee;
int num = (int)getNumberOfLines(filename);
for (int line = 1;
(fscanf(ifp, "%d %s %d %d %lf\n", &temptr->EMP_ID, temptr->name, &temptr->dept, &temptr->rank, &temptr->salary) == 5)
&& line < num; ++line) {
temptr->next = malloc(sizeof(struct employeeData));
temptr = temptr->next;
}
fclose(ifp); /* fopen uses malloc internally */
return employee;
}
temptr->next = malloc(sizeof(struct employeeData))
。这无疑是程序崩溃的原因,因为您只对节点的第一个元素malloc,并尝试对甚至没有在内存中分配的结构成员使用fscanf。这就是为什么你必须在使用前分配它。记住,一个节点中的每个元素(大部分)都是独立的,即使在内存分配中也是如此。
getNumberOfLines
的函数,该函数获取文件中的行数。
size_t getNumberOfLines(const char * filename) {
FILE *stream = fopen(filename, "r");
if ( stream == NULL )
return EOF;
size_t lines = 0;
char c;
while (( c = getc(stream)) != EOF )
if ( c == '\n' )
lines++;
fclose(stream);
return lines;
}
fscanf
找不到要存储在变量中的格式化文本,它只是将“0”存储为浮点、in t、char甚至字符串。
fscanf
扫描一个空行,它只在所有变量中存储0。。
fscanf
只扫描占用的行,即使它们的格式不正确,因为检查
fscanf
是否返回5(需要存储的变量数)的另一个条件在该行格式不正确时将不为真,但是如果该行甚至没有被占用(这是我在gcc实现方面的经验,如果不需要,请删除它)。
void print (struct employeeData *employee){
for( struct employeeData *temptr = employee; ( temptr != NULL ); temptr = temptr->next )
printf("%d %s %d %d %lf\n", temptr->EMP_ID, temptr->name, temptr->dept, temptr->rank, temptr->salary);
}
void releaseData(struct employeeData *data) {
/* freeing nodes in reverse because nodes are connected in memory, if you free the first, you lose grasp on the second and the third, resulting in a memory leak .. */
if (data->next)
releaseData2(data->next);
free(data);
}
void releaseData(struct employeeData *data) {
/* freeing nodes in reverse because nodes are connected in memory, if you free the first, you lose grasp on the second and the third, resulting in a memory leak .. */
struct employeeData * temptr = data;
int num = 0, first = 1;
while ( temptr != NULL ) {
if ( temptr->next != NULL ) {
if (first) {
while ( temptr->next != NULL ) {
temptr = temptr->next;
num++;
}
first = 0;
} else {
for(int i = 0; i < num - 1; ++i)
temptr = temptr->next;
num--;
}
}
free(temptr);
temptr = (num == 0) ? NULL : data;
}
/* We could have used recursion, but that come with unnecessary overhead and less memory efficiency */
}
num
和
first
。
num
用于计算有多少嵌套节点要通过,因为当我
free
指针时,它肯定不是
NULL
所以循环是无限的,因为它只是检查其中的值。。
first
用于指示是否是第一次运行循环,因为如果是,我们肯定不知道其中有多少节点。
int main () {
/* Never dereference a malloc'd pointer before freeing it, so we'll get the pointer returned from the function as is */
struct employeeData *employee = getEmployeeData("empInfo.txt"); /* Getting employee data in the struct */
print(employee); /* Printing them out */
releaseData(employee); /* Freeing Dynamic Memory */
return 0;
}
关于c - 如何在函数中使用链接列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25962209/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!