//修改完了。。。。
#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",¤t1->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",¤t1->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语言实现建立一个单链表的过程,并实现打印链表中每一个元素,写出完整程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)