您的位置:首页 > 编程语言 > C语言/C++

C语言----链表及其应用

2012-09-16 17:26 288 查看
本部分是C语言的最后一部分,因为教研室的一些工作,导致了我的进度滞后,在此对自己提出批评。

1、链表的定义:特点:按需分配存储单元,物理地址不连续 单向链表分为 队列 和 堆栈

2、链表的插入和删除;

====================================================================================

习题训练:

1、设计一个程序,将十进制转化为任何进制数;

#include <stdio.h>

#include <stdlib.h>

struct obj

{

struct obj *link;

int a;

};

struct obj *createlink(int x)

{

struct obj *p,*head;

int m,n;

head=NULL;

printf("请输入要转换的进制: ");

scanf("%d",&n);

while(x){

m=x%n;

p=(struct obj *)malloc(sizeof(struct obj)); //申请一个链表p,p的a部分赋值为m,p 的头部分为head。。

p->a=m;

p->link=head;

head=p;

x=x/n;

}

return (head);

}

int outlink(struct obj *p)

{

while(p){

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

p=p->link;

}

printf("\n");

return 0;

}

int main()

{

struct obj *head;

int num;

printf("请输入一个数:");

scanf("%d",&num);

head = createlink(num);

outlink(head);

return 0;

}

//思想:将要转换的数x除以要转换的进制,取余数放入链表,动态申请,商进行循环。。。

2、建立一个链表,从键盘上输入字符,输入字符为'0'时停止,然后反序输出。

#include <stdio.h>

#include <stdlib.h>

struct obj

{

struct obj *link;

char ch;

};

struct obj *createlink()

{

struct obj *p,*head;

char c;

head=NULL;

while((c=getchar())!='0')

{

if((p=(struct obj *)malloc(sizeof(struct obj)))==NULL){

printf("堆栈溢出\n");

break;

}

p->ch=c;

p->link=head;

head=p;

}

return head;

}

int outlink(struct obj *p)

{

while(p){

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

p=p->link;

}

printf("\n");

return 0;

}

int main()

{

struct obj *head;

printf("请输入一个字符,以0结束:");

head = createlink();

outlink(head);

return 0;

}

//与上题写函数的方法相似,先写一个创建链表的函数,在创建的过程中,就按照要求对链表里面内容进行赋值,然后写一个打印链表的函数。这里涉及到了单向链表 堆栈的存储结构,特点是先进后出。先存入的元素最后打印,这样就实现了题目中要求的倒序的要求。

3、用链表的方式,输入若干书的书名和单价,输入的单价为‘0’时停止输入,然后按单价进行排序后输出。

#include <stdio.h>

#include <stdlib.h>

struct obj

{

struct obj *link;

char bookname[40];

int price;

};

struct obj *createlink()

{

struct obj *p,*head;

char name[40];

int pr;

printf("请输入书名:");

scanf("%s",&name);

printf("请输入书的价格:");

scanf("%d",&pr);

head=NULL;

while(pr!=0)

{

if((p=(struct obj *)malloc(sizeof(struct obj)))==NULL){

printf("堆栈溢出\n");

break;

}

strcpy(p->bookname,name);

p->price=pr;

p->link=head;

printf("请输入书名:");

scanf("%s",&name);

printf("请输入书的价格:");

scanf("%d",&pr);

}

return (head);

}

int outlink(struct obj *p)

{

struct obj *head,*q;

int tt;

char aa[40];

head=p;

while(p!=NULL){

q=p->link;

while(q!=NULL){

if((p->price)>(q->price)){

strcpy(aa,(q->bookname));

tt=q->price;

strcpy((q->bookname),(p->bookname));

q->price=p->price;

strcpy((p->bookname),aa);

p->price=tt;

}

q=q->link;

}

p=p->link;

}

while(head){

printf("%s",head->bookname);

printf(" %d",head->price);

head=head->link;

}

printf("\n");

return 0;

}

int main()

{

struct obj *head;

head = createlink();

outlink(head);

return 0;

}

4、编写函数creat,用来建立一个单链表,新产生的结点总在链表的末尾,单链表的头指针作为函数值返回。

struct obj *createlink()

{

struct obj *p,*head,*q;

char name[40];

int pr;

printf("请输入书名:");

scanf("%s",&name);

printf("请输入书的价格:");

scanf("%d",&pr);

head=NULL;

while(pr!=0)

{

if((p=(struct obj *)malloc(sizeof(struct obj)))==NULL){

printf("堆栈溢出\n");

break;

}

strcpy(p->bookname,name);

p->price=pr;

p->link=head;

q->link=p;

q=p;

printf("请输入书名:");

scanf("%s",&name);

printf("请输入书的价格:");

scanf("%d",&pr);

}

return (head);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: