在C程序如何动态链表

在C程序如何动态链表,第1张

struct student{ char strID[256]; char strName[256]; char strClass[256]; struct student pNext;}; main(){struct student node = new student();

struct student head = NULL;

memset(&node,0,sizeof(student));

head = node;

// 自己赋值node->strID等数据 node->pNext = new student();

memset(&node,0,sizeof(student));

// 自己赋值node->strID等数据 node->pNext = new student();

memset(&node,0,sizeof(student));

// 自己赋值node->strID等数据 } // 这是3个学生数据的单链表,没用循环做,你可以自己根据需要修改一下

恩 我看看

我已经帮你改好了 部分地方加了注释!如还有疑问发百度的短消息给我!

#include <stdioh>

#include "conioh"

#include "mathh"

#include "malloch"

#define null 0

struct id

{

int num;

char name[10];

struct id next;

};

struct id input()

{

struct id a,b,c;

int n;

b=c=(struct id )malloc(sizeof(struct id));

b->next=c->next=null;

b = a = c; //这里修改了 a=null;

printf("input num :");

scanf("%d",&c->num);

printf("input name:");

scanf("%s", c->name);

//for(n=1;c->num!=0;n++);

for(n=1;c->num!=0;n++) //这里的';'去掉 它造成了这里的死循环

{

//这里以上的代码进行了修改 逻辑上有问题

c=(struct id )malloc(sizeof(struct id));

printf("input num : (input '0' exit!)");

scanf("%d",&c->num);

if(c->num == 0) ///增加的代码 这里以下都进行了修改

break;

printf("continue input name: ");

scanf("%s", c->name);

b->next=c;

c->next=null;

b=c;

}

return(a);

}

void print(struct id head)

{

printf("\nPrinting All The Infomation\n");

while(head!=null)

{

//printf("%d %s\n",&head->num,head->name);

printf("num:%d name:%s\n",head->num,head->name); //如果用上句中的&head->num 那么打印出的是head->num变量的地址 不知你是否是这个用意

head=head->next;

}

}

void main()

{

struct id head;

head=input();

print(head);

printf("Enter any key to exit!");

getch();

}

//只要把p2->next=p1; p2=p1;这句后移几行,要先把P1覆盖后再输入

#include<stdioh>

#include<conioh>

#include<stdlibh>

#include<stringh>

#include<malloch>

#define zero printf("");

#define zero4 printf(" 学生信息显示 ");

#define zero5 printf(" 姓名 学号 成绩\n");

#define LEN sizeof(struct student)

#define zero3 printf("----------------------------学生信息输入--------------------------------------");

struct student

{

int num;

int score;

char name[20];

struct student next;

}head;

struct student creat(struct student head)

{

struct student p1,p2;int i=0;char temp;

p1=p2=head=(struct student )malloc(LEN);

zero3

printf("请输入学生姓名:");

scanf("%s",p1->name);

printf("请输入学生学号:");

scanf("%d",&p1->num);

printf("请输入学生成绩:");

scanf("%d",&p1->score);

while(temp!='n')

{

if(i==0)

{

head=p1;

i++;

printf("是否继续输入Y|N\n");

if(getch()=='n')

{

p1->next=NULL;

system("cls");

return head;

}

}

else

{

p1=(struct student )malloc(LEN);

printf("请输入学生姓名:");

scanf("%s",p1->name);

printf("请输入学生学号:");

scanf("%d",&p1->num);

printf("请输入学生成绩:");

scanf("%d",&p1->score);

p2->next=p1; //这句移到这里就可以了

p2=p1;

printf("是否继续输入Y|N\n");

temp=getch();

}

}

p2->next=NULL;

return head;

}

void print(struct student head)

{

struct student p;

p=head;

zero

zero4

zero

zero5

while(p!=NULL)

{

printf(" %-13s%-16d%-16d\n",p->name,p->num,p->score);

p=p->next;

zero

}

}

main()

{

head=creat(head);

system("cls");

print(head);

}

看一看我怎么删这个链表的,应该对你有启发

#include<stdioh>

#include<stdlibh>

typedef int datatype;

typedef struct node

{

datatype data;

struct node next;

}linklist;

linklist head;

linklist hrear_creat()//建立链表

{

int x;

linklist head,p,rear;

head=(struct node)malloc(20);

head->data=-999;

rear=head;

//clear();

printf("请输入互不相同的正整数以0结束:\n\t");

scanf("%d",&x);

while(x!=0)

{

p=(struct node)malloc(20);

p->data=x;

rear->next=p;

rear=p;

scanf("%d",&x);

}

rear->next=NULL;

return(head);

}

linklist key_delete(linklist head)

{

void print(linklist rb);

linklist p,q;

int x,y,i;

printf("请输入要删除的起始结点:\n\t");

scanf("%d",&x);

printf("请输入要删除结点的个数:\n\t");

scanf("%d",&y);

p=head;

while( p && (p->data!=x) )

{

q = p;

p=p->next;

}

if(p!=NULL)

{

for(i=1;i<=y;i++)

{

p = q->next;

if ( p == NULL ) break;

q->next =p->next;

free(p);

}

return(head);

}

else

{

printf("\n\t要删除的结点不存在,请重新输入数据!\n",x);

return(NULL);

}

}

void print(linklist rb)

{

linklist p,head;

int n=0;

head=rb->next;

printf("链表中的数据为:\n\t%5d",head->data);

p=head->next;

while( p )

{

printf("%5d",p->data);

p=p->next;

n=n+1;

if((n+1)%10==0)

printf("\n\t");

}

printf("\n\t");

}

int main()

{

linklist p;

p=hrear_creat();

print(p);

key_delete(p);

print(p);

}

//没有编译,不知道有错没,当成伪代码来看吧

lp=headp->next;

lq=headq->next;

//如果q第一个数就比p大,需要插入到lp前面。以后不会有这种情况

if(lp->data>lq->data)

{

headp->next=lq;

headp->next->next=lp;

lp=lq;

lq=lq->next;

}

while(lp->next!=null&&lq!=null)

{

//如果两个数相等,不插入

if(lp->data==lq->data)

{

lp=lp->next;

lq=lq->next;

}

//如果需要插入

else if(lp->next->data>lq->data)

{

temp=lp->next;

lp->next=lq;

lp=lq;

lp->next=temp;

lq=lq->next;

}

else

//不需要插入

{

lp=lp->next;

}

}

//如果p中的最后一个数仍比q中的数小,将q中剩余的数都放在后面

if(lp->next==null)

{

lp->next=lq;

}

1、申请分配内存后,应该检查是否成功分配了;

2、你没有保存链表的头指针。在生成链表的过程中,头指针丢了。你应该有一个变量在程序运行过程中一直保存头指针,用其他变量执行生成和输出的 *** 作;

3、生成链表的过程中没有明确给新节点的NEXT赋NULL;

4、你的输出过程也有问题,一般应该是看其NEXT是否为NULL来判断结束的,未结束则应该指向其NEXT。你这里指针一直没变,而且还是个未赋值的指针;

5、输入的时候scanf应该是用变量地址。

//输入n等于5

//连续输入5个数据  20 12 25 10 30

//从大到小排序后是 30 25 20 12 10

#include <stdioh>

#include <stdlibh>

struct linkNode

{

    int data;

    struct linkNode next;

};

typedef struct linkNode Link;

Link CreateLink(int n) //创建链表

{

    Link head;

    Link newNode,pNow;

    int value;

    int i;

    head=NULL;

    for(i=0;i<n;i++)

    {

        scanf("%d",&value);

        newNode=(Link)malloc(sizeof(struct linkNode));

        if(newNode==NULL)

        {

            printf("\n分配动态内存时出错\n");

            exit(1);

        }

        newNode->data = value;

        newNode->next = NULL;

        if(head==NULL)

        {

            head = newNode;

            pNow = newNode;

        }

        else

        {

            pNow->next = newNode;

            pNow = newNode;

        }

    }

    return head;

}

void DispLink(Link p) //输出链表的所有节点

{

    while(p)

    {

        printf("%d ",p->data);

        p = p->next;

    }

}

Link LinkSort(Link head) //选择排序法(从大到小)

{

    Link p,other,maxNode;

    int temp;

    if(head == NULL) return head;  //空链表

    for(p = head; p->next != NULL; p = p->next)

    {

        maxNode=p;

        for(other = p->next; other != NULL; other = other->next)

        {

            if(other->data > maxNode->data)

            {

                maxNode = other;

            }

        }

        if(maxNode != p)

        {

            temp = p->data;

            p->data = maxNode->data;

            maxNode->data = temp;

        }

    }

    return head;

}

int main()

{

    Link head; //链表(不带头节点)

    int n;

    printf("输入链表的长度n: ");

    scanf("%d",&n);

    printf("连续输入%d个数据(以空格隔开): ",n);

    head=CreateLink(n);

    printf("\n原本链表的节点是: ");

    DispLink(head);

    LinkSort(head);

    printf("\n从大到小排序之后: ");

    DispLink(head);

    printf("\n");

    return 0;

}

以上就是关于在C程序如何动态链表全部的内容,包括:在C程序如何动态链表、C程序链表问题!!!!、c程序设计 链表等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9686673.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存