数据结构C语言链表输入排序问题 20C

题目:

持续输入 学号,姓名,地址

-1终止输入

再按照学号从小到大顺序输出

个人感觉问题可能出在31行到38行
插入在链表最前面的时候会出现问题,其他情况没有问题

测试 输入会错误的情况(插在开头):
3,sfdfs,sdfsfd
2,sdf,sdf,sfd
-1

测试 输入会正确的情况:
3,sdf,sd,sfd
5,fsd,sdf
4,dsf,sdf
-1

/////姓名和地址就乱打几个字符了。。。

下面是关于链的的数据的调试截图(输出_会错误的情况_,数据见上文 )

图片说明

直到输入 —1终止前 ,都是正确的(↑↑↑第一张调试图,排序也是对的)

但是终止后,就会无限输出开头的(↓↓↓最后输入的插到开头的那个数)

主链变成next永远指向自己的。

图片说明

虽然是用双链表写的,但是没什么关系。
个人感觉问题在出在指针返还值或者函数返还值上面,_步骤应该都是没有问题的_,调试了很多遍

 #define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef  struct node
{
    char    name[20];
    char    add[20];
    int nu;

    struct node *pre;
    struct node *next;
}Newnode;


Newnode sort( node *q, Newnode *inser )                                 /* sort+insert 找到位置插入 */
{
    Newnode *temp = q;


    while ( 1 )
    {
        if ( temp->next == NULL && temp->nu < inser->nu )       /* 插在尾的情况,插入数大于所有temp +  第一个数时插在后面 */
        {
            temp->next  = inser;
            inser->pre  = temp;
            return(*q);
        }


        if ( temp->pre == NULL && temp->nu > inser->nu )        /*  第一个数时插在前面 */
        {                                                       /*  printf("okOK"); */
            /*  temp->pre=inser; */
            inser->next = temp;

            return(*inser);
        }
    }
    inser->next = temp;
    inser->pre  = temp->pre;
    temp->pre->next = inser;
    temp->pre   = inser;

    return(*q);
}


Newnode add( Newnode *q )     //q就是主链的地址
{
    int count = 0;


    while ( 1 )
    {
        Newnode *newnode;
        newnode = (Newnode * ) malloc( sizeof(Newnode) );
        scanf( "%d,", &newnode->nu );
        if ( newnode->nu == -1 )
        {
            return(*q);
        }
        newnode->next   = NULL;
        newnode->pre    = NULL;
        scanf( "%[^,]%[^\n]", newnode->name, newnode->add );


        if ( q->pre == NULL && q->next == NULL && count == 0 )
        {
            q = newnode;
            count++;                        /* 第一个数的输入,只输入一次 */
            continue;
        }else
            *q = sort( q, newnode );        /* 从第二个数开始就插入,这里的指针传递对吗。。。 */
    }
    return(*q);
}


void printall( Newnode *q )
{
    Newnode *temp = q; /* temp当前指针 */
    printf( "%d %s %s\n", q->nu, q->name, q->add );
    temp = temp->next;
    /* printf("%d %s %s\n",temp->nu,temp->name,temp->add); */
    while ( temp != NULL )
    {
        printf( "%d %s %s\n", temp->nu, temp->name, temp->add );
        temp = temp->next;
    }
/*  printf("%d %s %s\n",temp->nu,temp->name,temp->add); */
}


/* ////////////////////// */

int main( void )
{
    char inpu; int inpu2;

    Newnode p;

    p.pre   = NULL; p.next = NULL;
    p   = add( &p );

    printall( &p );
}

第一个特别输入
其他 找到位置,然后插入,排序一个插入一个。
调试调试吧。
再次说一下,步骤应该是没有问题的。(除了插在开头的情况会出现错误)调试了很多数据了。感觉问题应该出在指针返还上面。

3个回答

错误有两点:
1是你的sort函数本身排序算法有问题
2.在add函数中你用你sort函数返回一个链表节点赋值给了一个已经在你链表中排序过的节点,造成本身有序的链表又无序了。
改了一下
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
typedef struct node
{
char name[20];
char add[20];
int nu;

struct node *pre;
struct node *next;

}Newnode;

Newnode sort( Newnode *q, Newnode *inser )

{
Newnode *temp = q;

while ( 1 )
{
    if(temp->nu == inser->nu){
        printf("error:duplicate num\n");
        exit(0);
    }
    if ( temp->next == NULL && temp->nu < inser->nu )      
    {
        temp->next  = inser;
        inser->pre  = temp;
        return(*q);
    }

    if ( temp->pre == NULL && temp->nu > inser->nu )        
    {                                                       
        /*  temp->pre=inser; */
        inser->next = temp;

        return(*inser);
    }
    if ( temp->pre != NULL && temp->nu > inser->nu )        
            {                                                    
                temp->pre->next=inser;
                inser->next=temp;
                inser->pre =temp->pre;
                temp->pre=inser;
                return(*q);
            }
    if ( temp->next != NULL && temp->nu < inser->nu )        
            {                                                      

                temp=temp->next;
            }
}

}

Newnode add( Newnode *q ) //q就是主链的地址
{
int count = 0;

while ( 1 )
{
    Newnode *newnode;
    newnode = (Newnode * ) malloc( sizeof(Newnode) );
    scanf( "%d,", &newnode->nu );
    if ( newnode->nu == -1 )
    {
        return(*q);
    }
    newnode->next   = NULL;
    newnode->pre    = NULL;
    scanf( "%[^,]%[^\n]", newnode->name, newnode->add );


    if ( q->pre == NULL && q->next == NULL && count == 0 )
    {
        q->next= newnode;
        count++;
        continue;
    }else
        q->next = sort( q->next, newnode );       
}
return(*q);

}

void printall( Newnode q )
{
Newnode *temp = q; /
temp当前指针 /
printf( "%d %s %s\n", q->nu, q->name, q->add );
temp = temp->next;
/
printf("%d %s %s\n",temp->nu,temp->name,temp->add); /
while ( temp != NULL )
{
printf( "%d %s %s\n", temp->nu, temp->name, temp->add );
temp = temp->next;
}
/
printf("%d %s %s\n",temp->nu,temp->name,temp->add); */
}

/* ////////////////////// */

int main( void )
{
char inpu; int inpu2;

Newnode p;

p.pre   = NULL; p.next = NULL;
p   = add( &p );

printall( p.next );

}

Newnode add( Newnode *q ) //q就是主链的地址
{
int count = 0;

while ( 1 )
{
    Newnode *newnode;
    newnode = (Newnode * ) malloc( sizeof(Newnode) );
    scanf( "%d,", &newnode->nu );
    if ( newnode->nu == -1 )
    {
        return(*q);
    }
    newnode->next   = NULL;
    newnode->pre    = NULL;
    scanf( "%[^,]%[^\n]", newnode->name, newnode->add );


    if ( q->pre == NULL && q->next == NULL && count == 0 )
    {
        q = newnode;
        count++;                        /* 第一个数的输入,只输入一次 */
        continue;                       《-------------
    }else
        *q = sort( q, newnode );        /* 从第二个数开始就插入,这里的指针传递对吗。。。 */
}
return(*q);

}

这里的continue,语句的话好像是用break。continue是跳出本次循环,执行下一次循环。这里感觉你应该是要跳出整个循环体,而不是一次循环,break就是用于跳出循环体。

Newnode sort( node q, Newnode *inser ) / sort+insert 找到位置插入 */
{
Newnode *temp = q;

while ( 1 )
{
    if ( temp->next == NULL && temp->nu < inser->nu )       /* 插在尾的情况,插入数大于所有temp +  第一个数时插在后面 */
    {
        temp->next  = inser;
        inser->pre  = temp;
        return(*q);
    }


    if ( temp->pre == NULL && temp->nu > inser->nu )        /*  第一个数时插在前面 */
    {                                                       /*  printf("okOK"); */
        /*  temp->pre=inser; */
        inser->next = temp;

        return(*inser);
    }
}
inser->next = temp;
inser->pre  = temp->pre;
temp->pre->next = inser;
temp->pre   = inser;

return(*q);

}
这里的话while死循环包裹了上面,也没有跳出语句下面:
inser->next = temp;
inser->pre = temp->pre;
temp->pre->next = inser;
temp->pre = inser;

return(*q);

这几句估计不会执行,输入两个前插或者两个后插 估计就会死循环吧。

我也不是高手,说错请谅解,谢谢!!

既然会调试,那就一个节点一个节点的跟代码
这代码,。。->nu输入一个1,然后输入3,再输入2就死循环了

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
老师要求对链表的每个信息进行排序,但这个链表排序不会啊,求大神求代码?

#include<stdio.h> #include<math.h> #include<string.h> #include<stdlib.h> char ppzz[100] = ""; char lwjj[100] = ""; struct PPZBOOK { char author[1000]; char name[1020]; char isbn[120]; char data[115]; char id[110]; char status[110]; struct PPZBOOK * next; }; struct PPZBOOK * Creat(); void AddBook(struct PPZBOOK * head); void DeleteBook(struct PPZBOOK * head); void PrintBookList(struct PPZBOOK * head); void SearchBook(struct PPZBOOK * head); void SaveBook(struct PPZBOOK * head); struct PPZBOOK * Creat() { struct PPZBOOK * head; head = (struct PPZBOOK *)malloc(sizeof(struct PPZBOOK)); head->next = NULL; return head; } void SaveBook(struct PPZBOOK * head) { struct PPZBOOK *p; FILE *fp; p = head; fp = fopen("books.txt", "w+"); while (p->next != NULL) { p = p->next; fprintf(fp, "|%-6.6s|%-10.10s|%-10.10s|%-10.10s|%-12.12s|%-6.6s|\n", p->id, p->name, p->author, p->isbn, p->data, p->status); } fclose(fp); printf("已将图书数据保存到 books.txt 文件\n"); } void AddBook(struct PPZBOOK *head) { struct PPZBOOK *s, *p; char hihi = 'Y'; p = head; while (p->next != NULL) { p = p->next; } while (hihi == 'Y' || hihi == 'y') { s = (struct PPZBOOK *)malloc(sizeof(struct PPZBOOK)); printf("请输入图书书号: "); fflush(stdin); scanf("%s", s->id); printf("请输入图书书名: "); fflush(stdin); scanf("%s", s->name); printf("请输入图书作者名: "); fflush(stdin); scanf("%s", s->author); printf("请输入图书ISBN: "); fflush(stdin); scanf("%s", s->isbn); printf("请输入图书出版时间: "); fflush(stdin); scanf("%s", s->data); printf("请输入图书状态: "); fflush(stdin); scanf("%s", s->status); p->next = s; p = s; s->next = NULL; printf(" ━━━━ 添加成功!━━━━\n"); printf("继续添加?(Y/N):"); fflush(stdin); scanf("%c", &hihi); if (hihi == 'N' || hihi == 'n') { system("cls"); break; } else if (hihi == 'Y' || hihi == 'y') { system("cls"); continue; } } SaveBook(head); return; } void SearchBook(struct PPZBOOK *head) { struct PPZBOOK * p; p = head; char temp[20]; char ttt[10]; int flog = 0; if (head == NULL || head->next == NULL) { printf(" ━━━━ 图书库为空!━━━━\n"); } else { printf("请输入你要查找的类型\n"); scanf("%s", &ttt); if (strcmp("书名", ttt) == 0) { printf("请输入您要查找的书名: "); fflush(stdin); scanf("%s", &temp); while (p != NULL) { if (strcmp(p->name, temp) == 0) { printf("图书已找到!\n"); printf("书号: %s\t\n", p->id); printf("书名: %s\t\n", p->name); printf("作者名: %s\t\n", p->author); printf("ISBN: %s\t\n", p->isbn); printf("出版时间: %s\t\n", p->data); printf("状态: %s\t\n", p->status); flog = 1; } if (p->next == NULL) { printf("查询完毕!\n"); } p = p->next; } if (flog == 0) { printf("抱歉,你要找的书不存在!\n"); } } else if (strcmp("作者", ttt) == 0) { printf("请输入您要查找的作者: "); fflush(stdin); scanf("%s", &temp); while (p != NULL) { if (strcmp(p->author, temp) == 0) { printf("图书已找到!\n"); printf("书号: %s\t\n", p->id); printf("书名: %s\t\n", p->name); printf("作者名: %s\t\n", p->author); printf("ISBN: %s\t\n", p->isbn); printf("出版时间: %s\t\n", p->data); printf("状态: %s\t\n", p->status); flog = 1; } if (p->next == NULL) { printf("查询完毕!\n"); } p = p->next; } if (flog == 0) { printf("抱歉,你要找的书不存在!\n"); } } else if (strcmp("ISBN", ttt) == 0) { printf("请输入您要查找的ISBN: "); fflush(stdin); scanf("%s", &temp); while (p != NULL) { if (strcmp(p->isbn, temp) == 0) { printf("图书已找到!\n"); printf("书号: %s\t\n", p->id); printf("书名: %s\t\n", p->name); printf("作者名: %s\t\n", p->author); printf("ISBN: %s\t\n", p->isbn); printf("出版时间: %s\t\n", p->data); printf("状态: %s\t\n", p->status); flog = 1; } if (p->next == NULL) { printf("查询完毕!\n"); } p = p->next; } if (flog == 0) { printf("抱歉,你要找的书不存在!\n"); } } } } void PrintBookList(struct PPZBOOK * head) { struct PPZBOOK * p; if (head == NULL || head->next == NULL) { printf(" ━━━━ 没有图书记录! ━━━━\n"); return; } p = head; while (p->next != NULL) { p = p->next; printf("%s %s %s %s %s %s\n", p->id, p->name, p->author, p->isbn, p->data, p->status); } printf("\n"); } void DeleteBook(struct PPZBOOK * head) { struct PPZBOOK *s, *p; char temp[20]; int panduan; panduan = 0; p = s = head; if (head == NULL || head->next == NULL) { printf(" ━━━━ 图书库为空!━━━━\n"); } else { printf("请输入您要删除的书名:"); scanf("%s", temp); while (p != NULL) { if (strcmp(p->name, temp) == 0) { panduan++; break; } p = p->next; } if (panduan == 1) { while (s->next != p) { s = s->next; } s->next = p->next; free(p); printf("━━━━ 删除成功! ━━━━\n"); system("cls"); } else { printf("您输入的书目不存在,请确认后输入!\n"); } } } void ChangeBook(struct PPZBOOK * head) { struct PPZBOOK *pp; pp = head; if (head == NULL || head->next == NULL) { printf(" ━━━━ 图书库为空!━━━━\n"); } else { char tmp[100]; char ttt[100]; int g = 0; int flog = 0; printf("请输入你要修改的种类:φ(>ω<*) \n"); printf("1.修改书名\n2.修改作者\n3.修改状态\n友情提示:按其他数字键可以退出哦(*/ω\*)\n"); scanf("%d", &g); if (g == 1) { printf("请输入你要修改的书名:\n"); fflush(stdin); scanf("%s", &tmp); while (pp != NULL) { if (strcmp(pp->name, tmp) == 0) { printf("\n图书已找到!\n"); printf("\n"); printf("请输入你要它变为什么:\n"); scanf("%s", &ttt); strcpy(pp->name, ttt); flog = 1; } if (pp->next == NULL) { printf("正在为你修改!\n"); } pp = pp->next; } if (flog == 1) { printf("修改成功!\n"); } else { printf("修改失败!可能是你输入的信息我没找到\n"); } } else if (g == 2) { printf("请输入你要修改的作者:\n"); fflush(stdin); scanf("%s", &tmp); while (pp != NULL) { if (strcmp(pp->author, tmp) == 0) { printf("\n图书已找到!\n"); printf("\n"); printf("请输入你要它变为什么:\n"); scanf("%s", &ttt); strcpy(pp->author, ttt); flog = 1; } if (pp->next == NULL) { printf("正在为你修改!\n"); } pp = pp->next; } if (flog == 1) { printf("修改成功!\n"); } else { printf("修改失败!可能是你输入的信息我没找到\n"); } } else if (g == 3) { printf("请输入你要修改的状态:\n"); fflush(stdin); scanf("%s", &tmp); while (pp != NULL) { if (strcmp(pp->status, tmp) == 0) { printf("\n图书已找到!\n"); printf("\n"); printf("请输入你要它变为什么:\n"); scanf("%s", &ttt); strcpy(pp->status, ttt); flog = 1; } if (pp->next == NULL) { printf("正在为你修改!\n"); } pp = pp->next; } if (flog == 1) { printf("修改成功!\n"); } else { printf("修改失败!可能是你输入的信息我没找到\n"); } } else { printf("正在退出。。。。。。。。已退出\n"); } } } int Mima(char lwj[]) { if ((strcmp(lwjj, lwj) == 0) || (strcmp("123456", lwj) == 0)) { return 2; } else { return 1; } } void M(char q[]) { FILE *fp; fp = fopen("pwd.dat", "w+"); fprintf(fp, "%s\n", q); fclose(fp); strcpy(lwjj, q); } int User(char ppz[]) { if ((strcmp(ppzz, ppz) == 0) || (strcmp("admin", ppz) == 0)) { return 2; } else { return 1; } } void U(char p[]) { FILE *fp; fp = fopen("zhl是小可爱.txt", "w+"); fprintf(fp, "%s\n", p); fclose(fp); strcpy(ppzz, p); } void menu() { int choice = 0; struct PPZBOOK * head; head = NULL; while (1) { printf("●○○○○○○○○○○○○○○○○○○○○○○○○○○●\n"); printf("○ ○\n"); printf("○ 1、显示所有书籍 ○\n"); printf("○ 2、添加书籍信息 ○\n"); printf("○ 3、修改书籍信息 ○\n"); printf("○ 4、删除书籍信息 ○\n"); printf("○ 5、查询书籍信息 ○\n"); printf("○ 6、结束应用程序 ○\n"); printf("○ ○\n"); printf("●○○○○○○○○○○○○○○○○○○○○○○○○○○●\n"); printf("请选择:"); fflush(stdin); scanf("%d", &choice); switch (choice) { case 1: PrintBookList(head); break; case 2: if (head == NULL) { head = Creat(); } AddBook(head); break; case 3: ChangeBook(head); break; case 4: DeleteBook(head); break; case 5: SearchBook(head); break; case 6: printf("\n"); printf("**************** 感谢使用lwj的图书管理系统 ****************\n"); exit(1); default: printf(" ━━━━ (╬ ̄皿 ̄)=○#( ̄#)3 ̄) 你是傻的吗?<( ̄ ﹌  ̄)@m 这都会输入错误,快点请重新输入!━━━━\n"); break; } } } void jiemian() { char mima[100]; char user[100]; int count = 1; int s = 0, l = 0, j; printf("亲爱的用户,您是否已有账号密码了呢? ̄ω ̄=\n"); printf("如果有的话请按1,否则请按2\n"); while (1) { scanf("%d", &j); if (j == 1) { system("cls"); printf("●○○○○○○○○○○○○○○○●\n"); printf("○ ○\n"); printf("○ 请输入用户名和密码: ○\n"); printf("○ ○\n"); printf("●○○○○○○○○○○○○○○○●\n"); printf("你只有5次机会来输入正确的用户名和密码。(^_?)☆\n"); while (count < 6) { printf("第%d次\n", count); printf("请输入用户名:"); scanf("%s", user); l = User(user); printf("请输入密码:"); scanf("%s", &mima); s = Mima(mima); if (l == 2 && s == 2) { system("cls"); menu(); } else { printf("用户名或密码错误!b( ̄▽ ̄)d\n"); } count++; } break; } else { printf("(o?▽?)o 请输入你要注册的用户名:(ノ ̄▽ ̄)\n"); scanf("%s", user); U(user); printf("(o?▽?)o 请输入你要注册的密码:(ノ ̄▽ ̄)\n"); scanf("%s", mima); M(mima); printf("哇塞!注册成功了耶ヽ( ̄▽ ̄)?\n"); printf("请按1登录系统吧!(*/ω\*)\n"); } } } int main() { jiemian(); return 0; }

c语言数据结构链表空指针问题

这是一个在LeetCode上面的问题,就是把两个已经排序的链表合成一个也是排序的链表,如{1,2,3},{2,3,5}变为{1,2,2,3,3,5}; 在指针传入mergeTwoLists(struct ListNode* l1, struct ListNode* l2) 函数之前,就对其进行验证,看其是否为空指针![在指针传入mergeTwoLists(struct ListNode* l1, struct ListNode* l2) 函数之前,就对其进行验证,看其是否为空指针](https://img-ask.csdn.net/upload/201803/09/1520607866_55354.png) 结果说明不是空指针 ![结果说明不是](https://img-ask.csdn.net/upload/201803/09/1520607815_42578.png) 但是最后结果却说l2是一个空指针,想不通![但是最后结果让人很无奈](https://img-ask.csdn.net/upload/201803/09/1520608187_189608.png) 结果 ![图片说明](https://img-ask.csdn.net/upload/201803/09/1520610748_272371.png) 附上源代码 ``` #include<stdio.h> #include<stdlib.h> #include<string.h> struct ListNode { int val; struct ListNode *next; }; void Print(struct ListNode* l); struct ListNode* CreateList(int a[]); struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2); int main() { int a[] = { 1,2,3,4 }; int b[] = { 1,2,3,4,5 }; struct ListNode* ptr1 = CreateList(a); struct ListNode* ptr2 = CreateList(b); if (ptr2 == NULL) printf("a null"); printf("not a null\n"); printf("%d", ptr2->val); printf("%d", ptr2->next->val); printf("%d", ptr2->next->next->val); printf("%d", ptr2->next->next->next->val); struct ListNode* ptr3 = mergeTwoLists(ptr1, ptr2); //printf("%d", ptr3->val); //printf("%d", ptr3->next->val); //printf("%d", ptr3->next->next->val); //printf("%d", ptr3->next->next->next->val); system("pause"); } struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) //将l1 和 l2 合成 l3, 并返回指向l3的指针 { if (l1 == NULL&&l2 == NULL) return NULL; struct ListNode* res = (struct ListNode*)malloc(sizeof(struct ListNode)); res->val = 0; res->next = NULL; struct ListNode* head = res; while (l1 != NULL || l2 != NULL) { if (l1 == NULL) { res->next = l2; res = l2; l2 = l2->next; } else if(l2==NULL) { res->next = l1; res = l1; l1 = l1->next; } if (l1->val >= l2->val) { res->next = l2; res = l2; l2 = l2->next; } else { res->next = l1; res = l1; l1 = l1->next; } } return head->next; } struct ListNode* CreateList(int a[])//用数组a创造一个链表 { struct ListNode* res = (struct ListNode*)malloc(sizeof(struct ListNode)); res->val = 0; res->next = NULL; struct ListNode* head = res; struct ListNode*new; int length = sizeof(a); //printf("%d", length); for (int i = 0; i < length; i++) { res->val = a[i]; //printf_s("%d-------", res->val); new = (struct ListNode*)malloc(sizeof(struct ListNode)); new->val = 0; new->next = NULL; res->next = new; res = res->next; } //printf("%d", head->val); //printf("%d", head->next->val); //printf("%d", head->next->next->val); //printf("%d", head->next->next->next->val); return head; } ```

在C++数据结构中,关于单向链表的排序顺序控制,如何让单向链表按照逆序排列?

在C++数据结构中,关于单向链表的排序顺序控制,如何让单向链表按照逆序排列?

C语言数据结构 一元多项式

请求大佬花点点时间,帮我查查到底哪儿出错了,非常感谢! #include<stdio.h> #include<stdlib.h> struct Node { double coef; int expn; Node *next; }; void CreatPolynomial(Node *&head, int n) // 生成带表头结点的单链表,除头结点外另生成n个结点 { int i; head = (Node *)malloc(sizeof(Node)); head->coef = 0; head->expn = 0; head->next = NULL; // 初始化头结点 printf("请输入各项系数和指数:\n"); Node *p = head; for (int i = 0; i < n; i++) { p->next = (Node *)malloc(sizeof(Node)); // 生成新结点,尾插入生成链表 p = p->next; scanf("%lf %d",&p->coef,&p->expn); p->next = NULL; } } void PrintPolynomial(Node *&head) { if (head->next == NULL) // 结果是0时直接输出0 putchar('0'); else { for (Node *p = head->next; p != NULL; p = p->next) { if (p != head->next && p->coef >0) // 当p非首项且指向的系数为正时才输出'+' putchar('+'); // 之前只判定了p->coef >0 if (p->coef == 1) { // 系数为1或-1时特殊处理 if (p->expn == 0) putchar('1'); // 判断条件不能写在一起: } // if(p->coef == 1 && p->expn == 0) putchar('1'); else if (p->coef == -1) putchar('-'); else printf("%lf\n", p->coef); switch (p->expn) { // 指数为0或1时特殊处理 case 0: break; case 1: putchar('x'); break; default: p->expn < 0 ? printf("x^(%d)", p->expn) : printf("x^%d", p->expn); // 指数小于0时打括号 break; } } } printf("\n"); } void Free(Node *&head) { Node *q = NULL; for (Node *p = head; p != NULL; p = q) { q = p->next; free(p); } } char cmp(int a, int b) { if (a > b) return '>'; if (a < b) return '<'; return '='; } void AddPolynomial(Node *&pA, Node *&pB) // 传进两个链表的头指针 { Node *ha = pA; Node *hb = pB; Node *qa = ha->next; // ha, hb分别跟在qa, qb的后一位置 Node *qb = hb->next; // qa, qb分别指向Pa, Pb中当前比较元素 while (qa && qb) { double sum = 0; int a = qa->expn; int b = qb->expn; switch (cmp(a, b)) { case '<': ha = qa; qa = qa->next; // 非ha = ha->next; break; case '=': sum = qa->coef + qb->coef; if (sum != 0.0) { qa->coef = sum; ha = qa; } else { if (ha->next != qa) printf("Error: ha->next != qa \n"); ha->next = ha->next->next; // 删除和为0的结点,ha不变,还在qa后一位置 free(qa); } if (hb->next != qb) printf("Error: hb->next != qb \n"); hb->next = hb->next->next; free(qb); qb = hb->next; qa = ha->next; break; case '>': hb->next = hb->next->next; // 删除qb指向的结点 qb->next = ha->next; // 将qb插入ha后qa前 ha->next = qb; qb = hb->next; // not qb = ha->next ha = ha->next; break; default: printf("Error! \n"); break; } } if (qb) ha->next = qb; free(hb); } int main(void) { Node *A = NULL; Node *B = NULL; int lenA; int lenB; do { printf("请输入A的项数:\n"); scanf(" %d", &lenA); CreatPolynomial(A, lenA); // 生成A链表 printf("请输入B的项数:\n");// 生成B链表 scanf("%d\n",&lenB); CreatPolynomial(B, lenB); printf(" A= "); // 输出A链表 PrintPolynomial(A); printf(" B= ");// 输出B链表 PrintPolynomial(B); AddPolynomial(A, B); // A = A + B printf(" A+B= "); PrintPolynomial(A); // 输出和 printf("\n"); Free(A); // 释放结点 } while (true); return 0; }

线性表中的无头节点链表排序

第五题怎么做,用c语言编程代码是什么?![图片](https://img-ask.csdn.net/upload/201610/15/1476486886_512785.jpg)

C语言 数据结构 创建链表的时候,在for循环中的变量是否每次循环结束都被销毁

如题,先谢谢大神解答。 ![图片说明](https://img-ask.csdn.net/upload/201610/04/1475513733_456747.png) ![图片说明](https://img-ask.csdn.net/upload/201610/04/1475513745_903732.png)

用链表实现学生成绩管理系统的问题

今天试图用链表写一个学生成绩管理系统,可是如果要实现既可以按照学号排序又可以按照成绩排序的话,需要对链表进行排序,然后我看网上说对链表排序时一般都很低效,那想问问各位,这样的话用链表划不划算呢,还是干脆用顺序表?

C语言数据结构,输入一句英文为什么输出乱码?

输入 i am a student,输完一个单词按enter再输入,输‘0’结束,输出结果就乱了,为什么呢? 但是直接输入 i am a student就可以完整输出 ``` #include<stdio.h> #include<stdlib.h> //定义结构体 struct list { char data[15]; struct list *next; }; typedef struct list node; typedef node *link; //建立链表 link create_list (link head) { link pointer,newpointer; char data1[15]; int i; head=(link)malloc(sizeof(node)); if(head==NULL) { printf("error"); } else { printf("input data:\n"); gets(data1); for(i=0;i<15;i++) head->data[i]=data1[i]; head->next=NULL; } while(1) { newpointer=(link)malloc(sizeof(node)); if(newpointer==NULL) { printf("error"); } else { gets(data1); if(data1[0]=='0') break; else { for(i=0;i<15;i++) head->data[i]=data1[i]; newpointer->next=head; head=newpointer; } } } return head; } //输出链表 void printf_list (link head) { link pointer; pointer=head; printf("data is:"); while(pointer!=NULL) { printf("%s",pointer->data); pointer=pointer->next; } } //释放链表 void free_list (link head) { link pointer; while(head!=NULL) { pointer=head; head=head->next; free(pointer); } } //主函数 int main() { link head; head=(link)malloc(sizeof(node)); if(head==NULL) printf("error"); else { head=create_list(head); printf_list(head); free_list(head); } return 0; } ```

顺序链表的插入用C语言编程实现

题目是:向递增的顺序链表中插入一个数,将插入后的链表输出。下面是源程序,但只能输入,但一输出就崩溃是咋回事啊?哪位大神求解,,,感激不尽。。。 #include <stdio.h> #include <stdlib.h> typedef struct Lnode { int data; struct Lnode *next; }Lnode,*LinkList; LinkList CreateListR(LinkList L) { int n; LinkList p,s; p=L=(LinkList)malloc(sizeof(Lnode)); L->next=NULL; scanf("%d",&n); for(;n>0;n--) { s=(LinkList)malloc(sizeof(Lnode)); scanf("%d",&s->data); p->next=s; p=s; } p->next=NULL; return L; } LinkList ListInsert(LinkList L) { int m; LinkList s,p=L; scanf("%d",&m); while(p!=NULL) { if(p->data>m) { s=(LinkList)malloc(sizeof(Lnode)); s->data=m; s->next=L->next; L->next=s; break; } else if(p->next->data>m) { s=(LinkList)malloc(sizeof(Lnode)); s->data=m; s->next=p->next; p->next=s; break; } p=p->next; } return L; } int main() { LinkList q=NULL,L=NULL; L=CreateListR(L); q=ListInsert(L); q=q->next; while(q) { printf("%d ",q->data); q=q->next; } return 0; }

怎么合并链表????

两个非降序链表的并集,例如将链表1->2->3 和 2->3->5 并为 1->2->3->5,只能输出结果,不能修改两个链表的数据。 #include <stdio.h> #include <stdlib.h> typedef int DataType; typedef struct node { DataType data; struct node *next; }*LinkList, *pNode; LinkList GetEmptyList() { LinkList head = (pNode)malloc(sizeof(struct node)); head->data = 0; head->next = 0; return head; } int AddNode(LinkList head, DataType data) { pNode newnode,p = head; while(p->next) { if(p->next->data == data) return 0; if(p->next->data > data) { newnode = (pNode)malloc(sizeof(struct node)); newnode->data = data; newnode->next = p->next; p->next = newnode; return 1; } p = p->next; } p->next = (pNode)malloc(sizeof(struct node)); p->next->data = data; p->next->next = 0; return 1; } LinkList MergeList(LinkList LA, LinkList LB) { // 合并LA、LB到新表 LinkList head; pNode p,q,t; int flag; head = p = GetEmptyList(); for(q = LA->next; q; q = q->next) { p->next = (pNode)malloc(sizeof(struct node)); p->next->data = q->data; p = p->next; } p->next = 0; for(p = LB->next; p; p = p->next) { // 合并 flag = 1; for(q = head; q->next && flag; q = q->next) { if(p->data == q->next->data) flag = 0; else if(p->data < q->next->data) { t = (pNode)malloc(sizeof(struct node)); t->data = p->data; t->next = q->next; q->next = t; flag = 0; } } if(flag) { q->next = (pNode)malloc(sizeof(struct node)); q->next->data = p->data; q->next->next = 0; } } return head; } void Show(LinkList head) { pNode p = head->next; while(p) { printf("%d ",p->data); p = p->next; } printf("\n"); } int main() { DataType x; LinkList LA = GetEmptyList(); LinkList LB = GetEmptyList(); LinkList LC; printf(""); while(scanf("%d",&x) == 1) { AddNode(LA,x); AddNode(LB,x); printf(""); } LC = MergeList(LA,LB); Show(LC); return 0; } 怎么好像不可以,怎么优化一下?

数据结构两个有序链表合并为一个有序链表

函数部分如下: node* combine(node* a,node* b) { node *p=a,*q=b,*pre,*head; if(p->info>=q->info) head=p; else head=q; pre=head; while( p!=NULL && q!=NULL ) { if(p->info >= q->info) { pre->next=p; pre=p; p=p->next; } else { pre->next=q; pre=q; q=q->next; } } while(p!=NULL) { pre->next=p; pre=p; p=p->next; } while(q!=NULL) { pre->next=q; pre=q; q=q->next; } return head; } 可是什么也不显示,运行结果如下![图片说明](https://img-ask.csdn.net/upload/201704/20/1492693359_539259.png),上面的是其他功能的函数

c语言菜鸟#数据结构头插法,怎样正序输出呢?

用头插法输出数据,发现是倒序的。请问大佬们,不用尾插法,怎么将数据正序输出 ``` #include<stdio.h> #include<stdlib.h> struct list { char data; struct list *next; }; typedef struct list node; typedef node *link; //创建链表 link create_list (link head) { link pointer,newpointer; char data1; head=(link)malloc(sizeof(node)); if(head==NULL) { printf("error"); } else { printf("input data:\n"); scanf("%c",&data1); head->data=data1; head->next=NULL; } while(1) { newpointer=(link)malloc(sizeof(node)); if(newpointer==NULL) { printf("error"); } else { scanf("%c",&data1); if(data1=='0') break; newpointer->data=data1; newpointer->next=head; head=newpointer; } } return head; } //输出链表 void printf_list (link head) { link pointer; pointer=head; printf("data is:"); while(pointer!=NULL) { printf("%c",pointer->data); pointer=pointer->next; } } //释放链表 void free_list (link head) { link pointer; while(head!=NULL) { pointer=head; head=head->next; free(pointer); } } //主函数 int main() { link head; head=(link)malloc(sizeof(node)); if(head==NULL) printf("error"); else { head=create_list(head); printf_list(head); free_list(head); } return 0; } ```

数据结构合并两个递增的有序链表LA,LB形成新的有序链表LC

数据结构合并两个递增的有序链表LA,LB形成新的有序链表LC

数据结构中的排序和查找

100以内的10到20个随机数的排序,查找,用C语言写出代码

用fscanf和fgets从文件读取数据存储到链表失败是为什么??

我建立了链表结构,然后从文件导入数据,然后输出链表内容,发现输出的内容顺序不对内容也有点地方出错了! (下面是代码) #include <iostream> #include<fstream> #include<stdlib.h> #include<string.h> #include<stdio.h> typedef struct node{ char question[200]; char option_A[50]; char option_B[50]; char option_C[50]; char option_D[50]; char answer[3]; char respond[3]; char analysis[200]; int length; struct node *next; }LNODE,*LinkList; int main(void) { LNODE *L; L=new LNODE; L->next=NULL; L->length=0; LNODE *p; LNODE *q; q=L; int i; FILE *tk; if((tk=fopen("//Users//apple//Documents//Test System//test question.txt","r"))==NULL) { printf("File open error!\n"); exit(0); } while(!feof(tk)) { fgets(q->question,sizeof(LNODE),tk); fgets(q->option_A,sizeof(LNODE),tk); fgets(q->option_B,sizeof(LNODE),tk); fgets(q->option_C,sizeof(LNODE),tk); fgets(q->option_D,sizeof(LNODE),tk); fgets(q->answer,sizeof(LNODE),tk); fgets(q->analysis,sizeof(LNODE),tk); p=new LNODE; p->next=NULL; q->next=p; q=q->next; } if(fclose(tk)) { printf("Can not close the file!\n"); exit(0); } q=L; while(q->next) { printf("%s",q->question); printf("%s",q->option_A); printf("%s",q->option_B); printf("%s",q->option_C); printf("%s",q->option_D); printf("%s",q->answer); printf("%s",q->analysis); q=q->next; } } (这是文档里的内容) 在数据结构中,从逻辑结构上可以把数据结构分成() A.动态结构和静态结构 B.紧凑结构和非紧凑结构 C.线性结构和非线性结构 D.内部结构和外部结构 C 略 与数据元素本身的形式,内容,相对位置,个数无关的是数据的() A.存储结构 B.存储实现 C.逻辑结构 D.运算实现 C 略 通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着() A.数据具有同一特点 B.每个数据元素都一样 C.不仅每个数据元素所包含的数据项都一样,而且对应数据项的类型要一致 D.数据元素所包含的数据项的个数要相等 C 只有这样系统才能高效统一的对数据进行管理。 算法的时间复杂度取决于() A.问题的规模 B.待处理的数据的初态 C.计算机的配置 D.A和B D 略 顺序表中第一个元素的储存地址是100,每个元素的长度为2,则第5个元素的地址是() A.100 B.108 C.100 D.120 B 100+(5-1)*2==108 线性表若采用链式存储结构,要求内存中可用存储单元的地址() A.部分是连续的 B.一定是不连续的 C.必须是连续的 D.连续或不连续都可以 D 因为链表有指针跟踪从而连不连续都可以。 用链接方式存储的队列,在进行删除运算时() A.仅修改头指针 B.仅修改尾指针 C.头尾指针都一定要修改 D.头尾指针可能都要修改 D 一般只修改头指针,但是删除的结点若为最后一个时,则要重新对尾指针赋值。 一个递归算法必须包括() A.递归部分 B.终止条件和递归部分 C.迭代部分 D.终止条件和迭代部分 D 略 串是一种特殊的线性表,其特殊性体现在() A.可以顺序储存 B.可以链式储存 C.数据元素是单个字符 D.数据元素可以是多个字符 C 串是一种内容受限的线性表。 把一棵树转化为二叉树后,这棵二叉树的形态是() A.唯一的 B.有多种 C.有多种,但根结点都没有左孩子 D.有多种,但根结点都没有右孩子 A 略。 利用二叉链表存储树,则根结点的右指针() A.指向最左孩子 B.指向最右孩子 C.非空 D.为空 C 右指针指向兄弟结点。 在以下的存储形式中,不是树的存储形式的是() A.双亲表示法 B.孩子链表表示法 C.孩子兄弟表示法 D.顺序存储表示法 D 常用孩子兄弟表示法转化为二叉树进行储存。 在一个无向图,所有顶点的度数之和等于图的边数的()倍 A.1/2 B.1 C.2 D.4 A 略 折半查找与二叉排序树的时间性能() A.相同 B.完全不同 C.有时不相同 D.数量级都是O(log2n) C 要看初始数据的状态。 堆的形状是一棵() A.二叉排序树 B.满二叉树 C.完全二叉树 D.平衡二叉树 C 略 若一组记录的排序码为(46,79,56,38,40,84),则利用堆排序的方式建立的初始堆为() A.79,46,56,38,40,84 B.84,79,56,38,40,46 C.84,79,56,46,40,38 D.84,56,79,40,46,38 C 画出图去找矛盾。 快速排序在下列()最易发挥作用 A.被排序的数据中具有多个相同的排序码 B.被排序的数据已经基本有序 C.被排序的数据完全无序 D.被排序的数据中的最大值和最小值相差悬殊 C 完全无序时用快速排序。 (这是输出后的内容,第一行与原文档的根本不同,而且后面也有很多乱的错误的) ![图片说明](https://img-ask.csdn.net/upload/201812/31/1546187214_133620.jpeg) 有哪位大神指导一下小白!!

一个c语言单向链表,编译通过,运行结果却不知所谓,请求帮助

这段代码在rhel6中用gcc编译通过,运行结果未定义,其中作的链表按number大小排序打印出来是没有排过序的结果,而且输入记录多了,其中某些项的number打印出来会由输入的值变成0或者一个莫名其妙的整数. vs2008中编译通过,打入多项记录只能显示2条,而且前一条是乱码. 最简单的一个数据结构,却忙了半天还查不出原因,帮个忙吧-_-||| **原代码:** /*简单单向链表,输入学生名称和号码,按号码排序, * 如果号码相同则记录合并为一条,附输出函数*/ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<ctype.h> #define N 50 #define LEN (sizeof(student *)) static int n=0;//计数器 typedef struct student{ char name[N]; int number; struct student *next;}student;//链表节点结构 int main() { student *add(student *head);//添加记录函数声明 void list(student *head);//列表函数声明 student *head=NULL; while(1){ printf("'N/n' to add,'L/l' to list,other to exit:"); char ch=toupper(getchar()); getchar(); if(ch=='N')head=add(head); else if(ch=='L')list(head); else break;} return 0; }//主函数 student *add(student *head){ student *p,*p1=head,*p2=head; p=(student *)malloc(LEN);//分配一片空间 printf("Input name:"); gets(p->name); printf("Input number:"); scanf("%d",&p->number); scanf("%*[^\n]"); scanf("%*c"); if(p->number<=0){//如果输入号码<=0,直接返回 printf("Wrong number!!\n"); return head;} else{ if(head==NULL){//如果表空直接接到头指针 head=p; head->next=NULL; n++;} else{//表不空 //确定p1指向 while(p->number>p1->number&&p1->next!=NULL){ p2=p1;//p2保存p1指向下一节点之前的值 p1=p1->next;} if(p->number<p1->number){//插入表中的情况 p2->next=p; p->next=p1; n++} //如果号相等,合并记录 else if(p->number==p1->number)strcpy(p1->name,p->name); else if(p1->next==NULL){//输入新记录的号码比链表里所有都大的情况 p1->next=p; p->next=NULL; n++;} } } return head;} void list(student *head){//遍历打印函数 student *p=head; printf("There's %d records!!\n",n); printf("Name:\t\tNumber:\n"); while(p){ printf("%s\t\t%d\n",p->name,p->number); p=p->next;} }

实验是数据结构中做一个学生成绩管理系统,在网上找到了相应代码,但是不知道怎么插入学生信息,希望大佬帮助完成这个课题

#include<stdio.h> #include<stdlib.h> #include<string.h> char top[50]; //成绩文件顶部的标题用top保存 typedef struct student //单个学生成绩的记录 { char name[10]; //姓名 int number; //学号 int chinese; //语文 int math; //数学 int english; //英语 struct student *next; }student,*gradelist; gradelist fileread(char *adress) //读取成绩文件 { FILE * fp; if((fp=fopen(address,"r"))==NULL) //打开文件 { printf("文件打开出错"); exit(0); } gradelist file=(student *)malloc(sizeof(student)); //申请空间 file->next=NULL; student * p=file; //操作指针 int n=0; //循环标记,具体作用是在第一次循环时方便处理标题 while(!feof(fp)) { if(n==0) { fgets(top,50,fp); //处理标题,并且文件指针移到第二行 } if(n==1) //申请空间 { (p->next)=(student *)malloc(sizeof(student)); p=p->next; p->next=NULL; } fscanf(fp,"%s%d%d%d%d",p->name,&p->number,&p->chinese,&p->math,&p->english); //将文件的数据输入到链表中 n=1; } if(fclose(fp)) //关闭文件 { printf("文件关闭失败"); exit(0); } return file; } void FilePrint(gradelist file) //将成绩文件打印到屏幕上 { student *p=file; printf("%s\n",top); //打印标题 while(p->next!=NULL) { printf("%6s %2d %d %d %d\n",p->name,p->number,p->chinese,p->math,p->english); //循环打印 p=p->next; } } void merger() //合并文件 { char * address1="1.txt",*address2="2.txt",*address3="3.txt"; gradelist file1=fileread(address1),file2=fileread(address2); FILE *fp; if((fp=fopen("3.txt","w+"))==NULL) //先新建一个3.txt,然后将1.txt和2.txt的内容输入到里面 { printf("合并成绩文档失败,原因:建立文档出错"); exit(0); } student *p1=file1,*p2=file2; fprintf(fp,"%s",top); //先输入标题 while(p1->next!=NULL) { fprintf(fp,"%6s %2d %d %d %d\n",p1->name,p1->number,p1->chinese,p1->math,p1->english); //输入1.txt p1=p1->next; } while(p2->next!=NULL) { fprintf(fp,"%6s %2d %d %d %d\n",p2->name,p2->number,p2->chinese,p2->math,p2->english); //输入2.txt p2=p2->next; } if(fclose(fp)) { printf("文件关闭失败"); exit(0); } } void extract() //抽取补考的成绩记录 { char * address4="4.txt",*address3="3.txt"; FILE *fp; if((fp=fopen("4.txt","w+"))==NULL) //新建文件4.txt { printf("抽取补考学生成绩记录建立新文件失败"); exit(0); } gradelist file3=fileread(address3); student *p=file3; fprintf(fp,"%s",top); //先输入标题 while(p->next!=NULL) { if((p->chinese)<60||(p->math)<60||(p->english)<60) //补考条件 { fprintf(fp,"%6s %2d %d %d %d\n",p->name,p->number,p->chinese,p->math,p->english); } p=p->next; } if(fclose(fp)) { printf("文件关闭失败"); exit(0); } } void sort(int i) { char * address3="3.txt"; gradelist file3=fileread(address3); //先将3.txt读入链表 student *p=file3; if(remove("3.txt")) //由于排序后的内容也要保存到3.txt,故删除3.txt { printf("删除文件出错"); exit(0); } int n=0; //学生个数 FILE *fp; if((fp=fopen("3.txt","w+"))==NULL) //新建一个空的3.txt { printf("新建文件出错"); exit(0); } fprintf(fp,"%s",top); //标题先输入 while(p->next!=NULL) { n++; p=p->next; } typedef struct //链表不容易操作,故而新建一个结构数组 { int totalgrade; char name[10]; int number; int chinese; int math; int english; }gradenote; //成绩记录 typedef struct { gradenote r[100]; //只初始化了100了空间,学生人数超过100就不能了,懒得动态分配了 }grade_list; //待排序成绩表 grade_list L; p=file3; int t; for(t=1;t<=n;t++,p=p->next) //将链表的内容复制到结构数组里 { strcpy(L.r[t].name,p->name); L.r[t].number=p->number; L.r[t].chinese=p->chinese; L.r[t].math=p->math; L.r[t].english=p->english; L.r[t].totalgrade=p->chinese+p->math+p->english; } if(i==1) //直接插入排序 { int k; for(k=2;k<=n;++k) { if(L.r[k].totalgrade<L.r[k-1].totalgrade) { L.r[0]=L.r[k]; L.r[k]=L.r[k-1]; int j; for(j=k-2;L.r[0].totalgrade<L.r[j].totalgrade;--j) { L.r[j+1]=L.r[j]; } L.r[j+1]=L.r[0]; } } } if(i==2) //折半插入排序 { int m; int k; for(k=2;k<=n;++k) { L.r[0]=L.r[k]; int low=1,high=k-1; while(low<=high) { m=(low+high)/2; if(L.r[0].totalgrade<L.r[m].totalgrade) high=m-1; else low=m+1; } int j; for(j=k-1;j>=high+1;--j) L.r[j+1]=L.r[j]; L.r[high+1]=L.r[0]; } } int q; for(q=n;q>=1;q--) //将排序好的内容输入到3.txt { fprintf(fp,"%6s %2d %d %d %d\n",L.r[q].name,L.r[q].number,L.r[q].chinese,L.r[q].math,L.r[q].english); } if(fclose(fp)) { printf("文件关闭失败"); exit(0); } } void search(char *name) //按姓名查找 { gradelist file=fileread("3.txt"); student * p=file; while(p->next!=NULL) { if(strcmp(name,p->name)==0) { printf("%6s %2d %d %d %d\n",p->name,p->number,p->chinese,p->math,p->english); return; } p=p->next; } printf("查无此人,请确定名字输入正确\n"); exit(0); } void main(void) // { int chioce; gradelist file1=fileread("1.txt"),file2=fileread("2.txt"); printf("现有成绩记录文件1\n"); printf("*********************************************************\n"); FilePrint(file1); printf("*********************************************************\n"); printf("现有成绩记录文件2\n"); printf("*********************************************************\n"); FilePrint(file2); printf("*********************************************************\n"); printf("第一步,合并成绩记录文件\n"); merger(); printf("合并成功\n"); system("PAUSE"); printf("现有合并后的成绩记录文件3\n"); printf("*********************************************************\n"); gradelist file3=fileread("3.txt"); FilePrint(file3); printf("*********************************************************\n"); printf("第二步,抽取补考成绩记录\n"); extract(); system("PAUSE"); printf("现有补考成绩记录文件4\n"); printf("*********************************************************\n"); gradelist file4=fileread("4.txt"); FilePrint(file4); printf("*********************************************************\n"); printf("第三步,对文件3进行排序\n"); printf("请输入排序方式(1/2)\n1:直接插入排序\n2:折半插入排序\n"); scanf("%d",&chioce); if(chioce==1) sort(1); else if(chioce==2) sort(2); else { printf("输入不合理,程序默认采用1方式\n"); sort(1); } file3=fileread("3.txt"); printf("现有按总分降序的成绩记录3\n"); printf("*********************************************************\n"); FilePrint(file3); printf("*********************************************************\n"); printf("第四步,查找学生信息\n"); char name[100]; printf("请输入学生姓名\n"); scanf("%s",name); search(name); printf("按任意键结束程序\n"); getchar(); } 姓名 学号 语文 数学 英语 张明明 01 67 78 82 李成友 02 78 91 88 张辉灿 03 68 82 56 王露 04 56 45 77 陈东明 05 67 38 47 姓名 学号 语文 数学 英语 陈果 31 57 68 82 李华明 32 88 90 68 张明东 33 48 42 56 李明国 34 50 45 87 陈道亮 35 47 58 77

新手求指教!用c语言 简单学生成绩统计软件 。万分感谢,编好发到邮箱425572938@.

实现的任务: (1)每个学生记录中包含学号、姓名和C 语言课设成绩等信息; (2)创建学生记录链表; (3)更新学生记录(插入、排序、删除); (4)能统计各分数段的人数,并以分布图显示; (5)输出学生记录到屏幕。 设计内容: 1. 学生记录应该包括学号、姓名、C 语言课设成绩等信息,是本程序的核心数据结构,定 义如下: typedef struct { char num[11]; /*学号*/ char name[10]; /*姓名*/ int cgrade; /*c 语言课设成绩*/ }elemtype ; 使用链表实现学生记录的存储,链表中的结点结构如下: typedef struct node { elemtype data; struct node * next; } NODE,*Nodeptr; int n=0; 2.程序应具有以下基本功能: (1)以菜单形式显示主界面,提示用户进行选择,完成相应任务,如图1-1 所示。 (2)创建学生记录链表:从键盘输入一定数量的学生记录。 (3)插入学生记录:从键盘输入待插入的学生记录,插入到指定位置。 (4)对学生记录中的C 语言课设成绩按指定顺序(升序、降序)进行排序; (5)删除学生记录:在指定位置上删除学生记录。 (6)能统计各分数段的人数,并以分布图显示,如图1-2 所示。 (7)输出学生记录到屏幕。 设计要求: 1.核心数据结构用到的结构体要采用动态内存分配和链表结构。 2.使用文件进行存储和管理。程序启动时可从文件中读取学生成绩信息, 或从键盘输入学生成绩信息;运行过程中如添加或删除记录时也可对文件进 行存取;退出前可根据需要提醒是否保存学生成绩信息到文件中。 3.不同的功能使用不同的函数实现(模块化),对每个函数的功能和调用 接口要注释清楚。对程序其它部分也进行必要的注释。

02-线性结构1 两个有序链表序列的合并----答案错误求解

本题要求实现一个函数,**将两个链表表示的递增整数序列合并为一个递增的整数序列。** 函数接口定义: ``` List Merge( List L1, List L2 ); ``` 其中List结构定义如下: ``` typedef struct Node *PtrToNode; struct Node {     ElementType Data; /* 存储结点数据 */     PtrToNode   Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */ ``` **L1和L2是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Merge要将L1和L2合并为一个递增的整数序列。应直接使用原序列中的结点,返回归并后的链表头指针。** 裁判测试程序样例: ``` #include <stdio.h> #include <stdlib.h> typedef int ElementType; typedef struct Node *PtrToNode; struct Node {     ElementType Data;     PtrToNode   Next; }; typedef PtrToNode List; List Read(); /* 细节在此不表 */ void Print( List L ); /* 细节在此不表;空链表将输出NULL */ List Merge( List L1, List L2 ); int main() {     List L1, L2, L;     L1 = Read();     L2 = Read();     L = Merge(L1, L2);     Print(L);     Print(L1);     Print(L2);     return 0; } /* 你的代码将被嵌在这里 */ ``` 输入样例: 3 1 3 5 5 2 4 6 8 10 输出样例: 1 2 3 4 5 6 8 10  NULL NULL****   编译器:gcc 时间限制:400ms 内存限制:64MB 代码长度限制:16kB 判题程序:系统默认 作者:DS课程组 单位:浙江大学 我的答案: ``` List Merge( List L1, List L2 ){ PtrToNode p1,p2,q1,q2; p1 = L1; q1 = L2; p2 = L1->Next; q2 = L2->Next; while(p2&&q2){ if(p2->Data >= q2->Data){ q1->Next = q2->Next; q2->Next = p2; p1->Next = q2; p1 = p1->Next; q2 = q1->Next; } else{ p1 = p2; p2 = p2->Next; } } if(q2) p1->Next = q2; PtrToNode q3 = L2; L2->Next = NULL; free(q3); PtrToNode front = (PtrToNode)malloc(sizeof(struct Node)); front->Next = L1->Next; L1->Next = front; PtrToNode p3 = L1; L1 = L1->Next; p3->Next =NULL; free(p3); return L1; } ``` ******我的想法是直接在L1中进行排序: 设置p1,p2指向L1链表,其中p2指向L1的当前结点,初始化为第一个节点;p1指向当前结点的前一节点,方便L2结点插入,初始化为头节点。 设置q1,q2指向L2链表,其中q2指向L2的当前结点,初始化为第一个节点;q1指向当前结点的前一节点,方便q2重新定位,不过没太多用处。 然后比较 p2->Data 和 q2>Data,知道其中一方为空。 q2->Data小的话,则将q2指向的结点插入到L1中。 p2->Data小的话,则将p1,p2都指向下一位。 比较到p2,q2其中一方为空。 如果L2还有剩余(即p2先指向NULL),则将其接到的p1后。 最后由于原L1,L2需输出为空,所以建立一个结点 front,先头插到L1原头结点和第一个节点之间。 然后将L1原头结点free,L2则直接free。 思路是如此。但答案错误........ 也从网上看到其他人的答案,思路比我更好,也更容易理解。 但还是不明白自己哪部错了。 向大家求解,多谢!!!******

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

点沙成金:英特尔芯片制造全过程揭密

“亚马逊丛林里的蝴蝶扇动几下翅膀就可能引起两周后美国德州的一次飓风……” 这句人人皆知的话最初用来描述非线性系统中微小参数的变化所引起的系统极大变化。 而在更长的时间尺度内,我们所生活的这个世界就是这样一个异常复杂的非线性系统…… 水泥、穹顶、透视——关于时间与技艺的蝴蝶效应 公元前3000年,古埃及人将尼罗河中挖出的泥浆与纳特龙盐湖中的矿物盐混合,再掺入煅烧石灰石制成的石灰,由此得来了人...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

外包程序员的幸福生活

今天给你们讲述一个外包程序员的幸福生活。男主是Z哥,不是在外包公司上班的那种,是一名自由职业者,接外包项目自己干。接下来讲的都是真人真事。 先给大家介绍一下男主,Z哥,老程序员,是我十多年前的老同事,技术大牛,当过CTO,也创过业。因为我俩都爱好喝酒、踢球,再加上住的距离不算远,所以一直也断断续续的联系着,我对Z哥的状况也有大概了解。 Z哥几年前创业失败,后来他开始干起了外包,利用自己的技术能...

C++11:一些微小的变化(新的数据类型、template表达式内的空格、nullptr、std::nullptr_t)

本文介绍一些C++的两个新特性,它们虽然微小,但对你的编程十分重要 一、Template表达式内的空格 C++11标准之前建议在“在两个template表达式的闭符之间放一个空格”的要求已经过时了 例如: vector&lt;list&lt;int&gt; &gt;; //C++11之前 vector&lt;list&lt;int&gt;&gt;; //C++11 二、nullptr ...

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

深入剖析Springboot启动原理的底层源码,再也不怕面试官问了!

大家现在应该都对Springboot很熟悉,但是你对他的启动原理了解吗?

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

【阿里P6面经】二本,curd两年,疯狂复习,拿下阿里offer

二本的读者,在老东家不断学习,最后逆袭

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《经典算法案例》01-08:如何使用质数设计扫雷(Minesweeper)游戏

我们都玩过Windows操作系统中的经典游戏扫雷(Minesweeper),如果把质数当作一颗雷,那么,表格中红色的数字哪些是雷(质数)?您能找出多少个呢?文中用列表的方式罗列了10000以内的自然数、质数(素数),6的倍数等,方便大家观察质数的分布规律及特性,以便对算法求解有指导意义。另外,判断质数是初学算法,理解算法重要性的一个非常好的案例。

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

正确选择比瞎努力更重要!

面试官:你连SSO都不懂,就别来面试了

大厂竟然要考我SSO,卧槽。

微软为一人收购一公司?破解索尼程序、写黑客小说,看他彪悍的程序人生!...

作者 | 伍杏玲出品 | CSDN(ID:CSDNnews)格子衬衫、常掉发、双肩包、修电脑、加班多……这些似乎成了大众给程序员的固定标签。近几年流行的“跨界风”开始刷新人们对程序员的...

终于,月薪过5万了!

来看几个问题想不想月薪超过5万?想不想进入公司架构组?想不想成为项目组的负责人?想不想成为spring的高手,超越99%的对手?那么本文内容是你必须要掌握的。本文主要详解bean的生命...

我说我懂多线程,面试官立马给我发了offer

不小心拿了几个offer,有点烦

自从喜欢上了B站这12个UP主,我越来越觉得自己是个废柴了!

不怕告诉你,我自从喜欢上了这12个UP主,哔哩哔哩成为了我手机上最耗电的软件,几乎每天都会看,可是吧,看的越多,我就越觉得自己是个废柴,唉,老天不公啊,不信你看看…… 间接性踌躇满志,持续性混吃等死,都是因为你们……但是,自己的学习力在慢慢变强,这是不容忽视的,推荐给你们! 都说B站是个宝,可是有人不会挖啊,没事,今天咱挖好的送你一箩筐,首先啊,我在B站上最喜欢看这个家伙的视频了,为啥 ,咱撇...

立即提问
相关内容推荐