C语言 关于链表的一个程序(请高手帮忙!)

C语言 关于链表的一个程序(请高手帮忙!),第1张

//修改完了。。。。

#include<stdioh>

#include <stringh>

#include<stdlibh>

struct student{

char name[20];

char num[20];

int grade;

struct student Nextptr;

};

typedef struct student Stu;

typedef Stu St;

St creat();

main()

{

St headptr1=NULL;

St headptr2=NULL;

headptr1=creat();

//headptr2=find(&headptr1);

//print(headptr2);

//destory(headptr1,headptr2);

system("pause");

}

St creat()//建立链表1

{

St headptr1=NULL,last1=NULL,current1=NULL;

printf("Please input the information of the students:\n");

// fflush(stdin);

current1=(St) malloc(sizeof(current1));

gets(current1->name);

// fflush(stdin);

gets(current1->num);

scanf("%d",&current1->grade);

while(strcmp(current1->name,"#####")!=0)

{

if(headptr1==NULL)

{

headptr1=current1;

last1=current1;

}

else

{

last1->Nextptr=current1;

last1=current1;

}

current1=(St) malloc(sizeof(current1));

fflush(stdin);

gets(current1->name);

fflush(stdin);

gets(current1->num);

scanf("%d",&current1->grade);

}

current1->Nextptr=NULL;

return headptr1;

}

C语言创建单链表如下:

#include"stdioh"

#include"stdlibh"

#include"malloch"

#include "iostreamh"

typedef struct node

{

int  data;

node next;

}node , List;

void create(int n)

{

int c;

List s,L;

L=(List)malloc(sizeof(node));

L->next=NULL;

printf("请输入第1个数据:");

scanf("%d",&c);

L->data=c;

for(int i=2;i<=n;i++)

{

s=(List)malloc(sizeof(node));

printf("请输入第%d个数据:",i);

scanf("%d",&c);

s->data=c;

s->next=L;

L->next =s;

}

printf("链表创建成功!");

}

void main()

{

int n;

printf("请你输入链表的个数:");

scanf("%d",&n);

create(n);

}

单链表创建方法:

单链表的建立有头插法、尾插法两种方法。

1. 头插法

单链表是用户不断申请 存储单元和改变链接关系而得到的一种特殊 数据结构,将链表的左边称为链头,右边称为链尾。头插法建单链表是将链表右端看成固定的,链表不断向左延伸而得到的。头插法最先得到的是尾结点

由于链表的长度是随机的,故用一个while循环来控制链表中结点个数。假设每个结点的值都大于O,则循环条件为输入的值大于o。申请 存储空间可使用malloc()函数实现,需设立一申请单元 指针,但malloc()函数得到的指针并不是指向 结构体的指针,需使用 强制类型转换,将其转换成结构体型指针。刚开始时,链表还没建立,是一空链表,head 指针为NULL。

链表建立的过程是申请空间、得到数据、建立链接的循环处理过程。

2. 尾插法

若将链表的左端固定,链表不断向右延伸,这种建立链表的方法称为尾插法。尾插法建立链表时,头 指针固定不动,故必须设立一个搜索指针,向链表右边延伸,则整个算法中应设立三个链表指针,即头指针head、搜索指针p2、申请单元指针pl。尾插法最先得到的是 头结点。

这是个很简单的链表创建和输出

#include

#include

typedef

struct

linkednode

{

char

data;

struct

linkednode

next;

}node,link_list;//链表节点的结构及重命名

link_list

creat()//创建一个链表返回类型是链表的首地址

{

link_list

L;

node

p1,p2;

char

data;

L=(node)malloc(sizeof(node));//开辟存储空间

p2=L;

while((data=getchar())!='\n')//输入回车键时结束输入

{

p1=(node)malloc(sizeof(node));

p1->data=data;

p2->next=p1;

p2=p1;

}

p2->next=NULL;

return

L;

}

void

print(link_list

L)//把链表输出

{

node

p;

p=L->next;

while(p!=NULL)

{

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

p=p->next;

}

printf("\n");

}

void

main()

{

link_list

L=NULL;

char

x;

printf("请输入链表节点:\n");

L=creat();

print(L);

}

虽然题目一个链表只要3元素,但我不想把代码写死,修改常量可实现任意长度链表。

另外你强调不能用头结点,所以我用指向首节点的指针。(头结点只是方便定位链表,和首节点指针其实意义相同,否则你去哪找之前创建好的链表)

#include <stdioh>

#include <malloch>

#define LN 3//最大链表元素数量,这里题目只要3个

typedef struct list

{

    int num;

    struct list next;

}LIST;

LIST  creatList();

LIST px(LIST listP);

void printfLIST(LIST listP);

LIST cLists(LIST listP1,LIST listP2);

int main()

{

    LIST listP1=NULL,listP2=NULL;

    printf("输入:\n");

    listP1=creatList();

    px(listP1);

    listP2=creatList();

    px(listP2);

    printf("输出:\n");

    printfLIST(listP1);

    printfLIST(listP2);

    printfLIST(cLists(listP1,listP2));

    return 0;

}

void printfLIST(LIST listP)//打印链表

{

    while(listP)

    {

        printf("%d ",listP->num);

        if(listP->next==NULL)

            break;

        listP=listP->next;

    }

    printf("\n");

}

LIST  creatList()//输入创建单链表,返回首节点指针

{

    int i=LN;

    LIST listP=NULL,listTail=NULL;

    while(i-->0)

    {

        LIST listNew=(LIST )malloc(sizeof(LIST));

        listNew->next=NULL;

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

        if(listP==NULL)

            listP=listNew;

        else

            listTail->next=listNew;

        listTail=listNew;

    }

    return listP;

}

LIST px(LIST listP)//排序,返回首节点指针

{

    LIST  listf=listP,listn=NULL;

    while(listf)

    {

        listn=listf->next;

        while(listn)

        {

            if(listf->num>listn->num)

                listf->num^=listn->num,listn->num^=listf->num,listf->num^=listn->num;

            if(listn->next==NULL)

                break;

            listn=listn->next;

        }

        if(listf->next==NULL)

            break;

        listf=listf->next;

    }

    return listP;

}

LIST cLists(LIST listP1,LIST listP2)//连接两个链表,返回首节点指针

{

    LIST listP3=listP1;

    while(listP1)

    {

        if(listP1->next==NULL)

            break;

        listP1=listP1->next;

    }

    listP1->next=listP2;

    return listP3;

}

前阵子做的用单向链表实现约瑟夫问题:

有M个人围一圈玩报数,凡报到N的出退出,输出每次退出的人的编号。

#include "stdioh"

struct game

{

int ID;

game pNext;

};

void main()

{

int i,m=17,n=3;

game pPrev,pNode,pTop;

printf("Input M N:");

scanf("%d %d",&m,&n);

if(n>m||n<1) return;

pTop=new game;

pTop->ID=1;

pPrev=pTop;

for(i=2;i<=m;i++)

{

pNode=new game;

pNode->ID=i;

pPrev->pNext=pNode;

pPrev=pNode;

}

pNode->pNext=pTop;

pPrev=pNode;

pNode=pTop;

i=0;

while(pNode->pNext!=pNode)

{

i++;

if(i%n==0)

{

printf("%d ",pNode->ID);

pPrev->pNext=pNode->pNext;

delete pNode;

pNode=pPrev->pNext;

i=0;

}

else

{

pPrev=pNode;

pNode=pNode->pNext;

}

}

delete pNode;

}

你只是给了

主函数

,其他函数都没有给,

结构体

的内容也没有给,如果是

链表

的话,是把插入的数据向新建的结点复制后往

头结点

后面接,应该不存在冲掉,除非你的insert *** 作是直接把stu这个结点接在head后面,那就相当于给head的next域重复赋值,那就冲掉了,

感觉你

这里说的插入就是给head后面一个结点的next赋stu的值,而不是新建一个结点,因此就冲掉了

/creat

a

list/

#include

"stdlibh"

#include

"stdioh"

struct

list

{

int

data;

struct

list

next;

};

typedef

struct

list

node;

typedef

node

link;

void

main()

{

link

ptr,head;

int

num,i;

ptr=(link)malloc(sizeof(node));

ptr=head;

printf("please

input

5

numbers==>\n");

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

{

scanf("%d",&num);

ptr->data=num;

ptr->next=(link)malloc(sizeof(node));

if(i==4)

ptr->next=NULL;

else

ptr=ptr->next;

}

ptr=head;

while(ptr!=NULL)

{

printf("The

value

is

==>%d\n",ptr->data);

ptr=ptr->next;

}

}

上面是一个简单的创建链表的C程序。所谓链表形象的讲就是一个数据块里面存有数据,并且存有下一个数据的指针,这样一个指一个形成一个数据链。这个数据链可以被 *** 作,例如插入数据,删除数据,等。至于指令,首先定义一个结构体,它存有数据和指向下一个数据块的指针。然后分配空间。注意最后一个为NULL,当然你也可以指向开头一个数据块形成一个循环链表。

以上就是关于C语言 关于链表的一个程序(请高手帮忙!)全部的内容,包括:C语言 关于链表的一个程序(请高手帮忙!)、C语言如何创建单链表、用C语言实现建立一个单链表的过程,并实现打印链表中每一个元素,写出完整程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存