2016年7月15日18:07:28
单链表的创建:建立一个单链表,首先需要明确需要创建的节点的个数,创建哪个链表
最后用一个函数来实现,最后返回链表的头指针,有了头指针之后,一个单链表也就确定
实现链表的创建有两种方式:
1.头插入法:使得每次新生成的节点成为第一个节点;
2.尾插入法:使得每次新生成的节点都成为最后一个节点;
本程序实现:使用尾插法实现单链表的创建,创建的链表都有头结点的;
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct
{
long num;
char name[10];
float score;
}STUDENT;
typedef struct node
{
STUDENT stu;
struct node * pNext;
}linkList;
void showMenu(void);
linkList * initLinkList(linkList * pHead);
linkList * createLinkList(linkList * pHead,int len);
linkList * createLinkList1(linkList * pHead,int len);
void traverseLinkList(linkList * pHead);
void showMenu(void)
{
printf("___________________________________\n");
printf(" 学生信息创建系统\n");
printf("\t1.头插法创建信息\n");
printf("\t2.尾插法创建信息\n");
printf("\t3.显示学生信息\n");
printf("\t4.退出系统\n");
printf("___________________________________\n\n");
return;
}
linkList * initLinkList(linkList * pHead)
{
pHead = (linkList *)malloc(sizeof(linkList));
if(NULL == pHead)
{
printf("动态内存分配失败!\n");
return NULL;
}
pHead->pNext = NULL;
return pHead;
}
linkList * createLinkList(linkList * pHead,int len)
{
linkList * pNew, * pTail;
int i;
pTail = pHead;
pHead->stu.num = 0;
for(i = 0;i<len;i++)
{
pNew = (linkList * )malloc(sizeof(linkList));
if(NULL == pNew)
{
printf("动态内存分配失败!\n");
return NULL;
}
printf("请输入学生信息!\n");
printf("学号=");
scanf("%ld",&pNew->stu.num);
printf("姓名=");
scanf("%s",pNew->stu.name);
printf("分数=");
scanf("%f",&pNew->stu.score);
pNew->pNext = NULL;
pTail->pNext = pNew;
pTail = pNew;
pHead->stu.num++;
}
return pHead;
}
linkList * createLinkList1(linkList * pHead,int len)
{
linkList * pNew,* pTail;
int i;
for(i = 0;i<len;i++)
{
pNew = (linkList * )malloc(sizeof(linkList));
if(NULL == pNew)
{
printf("动态内存分配失败!\n");
return NULL;
}
printf("请输入学生信息!\n");
printf("学号=");
scanf("%ld",&pNew->stu.num);
printf("姓名=");
scanf("%s",pNew->stu.name);
printf("分数=");
scanf("%f",&pNew->stu.score);
pNew->pNext = pHead->pNext;
pHead->pNext = pNew;
}
return pHead;
}
void traverseLinkList(linkList * pHead)
{
linkList * cur = pHead->pNext;
int i = 0;
if(NULL == cur)
{
printf("链表为空!\n");
}
while(cur != NULL)
{
printf("第%d个学生",i+1);
printf(" %-7ld%-7s%-7.2f\n",cur->stu.num,cur->stu.name,cur->stu.score);
cur = cur->pNext;
i++;
}
return;
}
int main(void)
{
int len,choice;
linkList * pHead;
pHead = initLinkList(pHead);
while(true)
{
showMenu();
printf("请输入您的选择:");
scanf("%d",&choice);
system("cls");
switch(choice)
{
case 1:while(len<1)
{
printf("请输入需要创建链表节点的个数:");
scanf("%d",&len);
system("cls");
}
createLinkList1(pHead,len);
printf("______________________________________________\n");
printf(" 您所创建的学生信息显示\n");
printf(" 学号 姓名 分数\n");
traverseLinkList(pHead);
printf("______________________________________________\n\n");
break;
case 2:while(len<1)
{
printf("请输入需要创建链表节点的个数:");
scanf("%d",&len);
system("cls");
}
createLinkList1(pHead,len);
printf("______________________________________________\n");
printf(" 您所创建的学生信息显示\n");
printf(" 学号 姓名 分数\n");
traverseLinkList(pHead);
printf("______________________________________________\n\n");
break;
case 3: printf("______________________________________________\n");
printf(" 班级学生信息显示\n");
traverseLinkList(pHead);
printf("______________________________________________\n\n");
break;
default:printf("您的输入有误!\n");
}
}
return 0;
}