c语言链表编程作业,C语言编程入门——链表

链表是为克服数组的缺点,在内存空间中离散存储,但需要一个指针记住下一个结点的地址,以便可以将链表结点连接起来。

链表与数组的比较:

数组

优点:存取速度快。

缺点:插入和删除元素的效率很低;

需要一块连续的内存空间。

链表

专业术语

首节点

存放第一个有效数据的节点

尾节点

存放最后一个有效数据的节点

头结点

头结点的数据类型和首节点的类型是一样的(结构体变量类型)

头结点是首节点前面的那个节点,头结点并不存放有效数据,

设置头结点的目的是为了方便对链表的操作。

头指针

存放头结点地址的指针变量

优点:插入删除元素效率高;

不需要一块连续的很大的内存空间。

缺点:查找某个位置的元素效率低。

定义

链表的基本单元是节点,节点分为两部分:数据域和指针域,数据域用来存放有效数据,指针域存

放下一个节点的地址。所以链表的节点都是结构体变类型。

用创建链表时,链表必须为动态创建,以便其它函数对其进行操作。

要确定一个链表,只需链表的头指针即可,即函数参数只需一个。

链表的实现:

# include

# include

# include

struct Node //通过结构体定义节点

{

int data; //创建数据域

struct Node * pNext; //创建指针域

};

//函数声明

struct Node * CreateList(void);

void TraverseList(struct Node *);

bool isEmpty(struct Node *);

int main(void)

{

struct Node * pHead; //创建头指针,用来存放头结点的地址。

pHead = CreateList(); //CreateList()函数动态创建链表并返回头结点的地址。

printf("\n");

TraverseList(pHead); //函数参数只需头指针即可确定一个链表。

return 0;

}

struct Node * CreateList(void) //函数返回值为struct Node * 类型。

{

int len;

int i;

int val;

struct Node * pHead = (struct Node *)malloc(sizeof(struct Node));

if (NULL == pHead)

{

printf("分配头结点空间失败,程序终止!\n");

exit(-1); //exit函数,退出程序。

}

struct Node * pTail = pHead; //创建尾指针指向尾节点

pTail->pNext = NULL;

printf("请输入链表的节点个数:len = ");

scanf("%d", &len);

for (i=0; i

{

printf("请输入第%d个节点的值:", i+1);

scanf("%d", &val);

struct Node * pNew = (struct Node *)malloc(sizeof(struct Node)); //链表的不连续性在于它的内存空间在不断地一个个分配,而数组则是一次性分配完成。

if (NULL == pNew)

{

printf("分配空间失败,程序终止!\n");

exit(-1);

}

pNew->data = val;

pTail->pNext = pNew;

pNew->pNext = NULL;

pTail = pNew; //递归

}

return pHead;

}

void TraverseList(struct Node * pHead) //遍历输出

{

struct Node * p;

if (isEmpty(pHead))

{

printf("链表为空!\n");

}

else

{

p = pHead->pNext; //使指针指向下一个节点

printf("链表中的数据为:\n");

while (NULL != p)

{

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

p = p->pNext;

}

printf("\n");

}

return;

}

bool isEmpty(struct Node * pHead)

{

if (NULL == pHead)

return true;

else

return false;

}

应用实例:学生信息管理系统

# include

# include

struct Student

{

char name[20];

int age;

float score;

};

void Input(struct Student *, int);

void sort(struct Student *, int);

void Output(struct Student *, int);

int main(void)

{

int len;

struct Student * pArr;

printf("请输入学生的个数:\n");

printf("len = ");

scanf("%d", &len);

pArr = (struct Student *)malloc(len*sizeof(struct Student));

Input(pArr, len);

sort(pArr, len);

printf("\n\n");

printf("排序结果是:\n");

Output(pArr, len);

return 0;

}

void Input(struct Student * pArr, int len)

{

int i;

for (i=0; i

{

printf("请输入第%d个学生的信息:\n", i+1);

printf("name = ");

scanf("%s", pArr[i].name); //结构体中name成员本身为数组,数组名name即为第一个元素的地址,不需要加&

printf("age = ");

scanf("%d", &pArr[i].age);

printf("score = ");

scanf("%f", &pArr[i].score);

}

}

void sort(struct Student * pArr, int len)

{

int i, j;

struct Student t;

for (i=0; i

{

for (j=0; j

{

if (pArr[j].score < pArr[j+1].score)

{

t = pArr[j];

pArr[j] = pArr[j+1];

pArr[j+1] = t;

}

}

}

}

void Output(struct Student * pArr, int len)

{

int i;

for (i=0; i

{

printf("第%d名学生的信息是:\n", i+1);

printf("name = ");

printf("%s",pArr[i].name);

printf("\n");

printf("age =");

printf("%d", pArr[i].age);

printf("\n");

printf("score = ");

printf("%f", pArr[i].score);

printf("\n");

}

}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值