c语言链表编程作业,C语言编程入门——链表
鏈表是為克服數(shù)組的缺點(diǎn),在內(nèi)存空間中離散存儲(chǔ),但需要一個(gè)指針記住下一個(gè)結(jié)點(diǎn)的地址,以便可以將鏈表結(jié)點(diǎn)連接起來。
鏈表與數(shù)組的比較:
數(shù)組
優(yōu)點(diǎn):存取速度快。
缺點(diǎn):插入和刪除元素的效率很低;
需要一塊連續(xù)的內(nèi)存空間。
鏈表
專業(yè)術(shù)語
首節(jié)點(diǎn)
存放第一個(gè)有效數(shù)據(jù)的節(jié)點(diǎn)
尾節(jié)點(diǎn)
存放最后一個(gè)有效數(shù)據(jù)的節(jié)點(diǎn)
頭結(jié)點(diǎn)
頭結(jié)點(diǎn)的數(shù)據(jù)類型和首節(jié)點(diǎn)的類型是一樣的(結(jié)構(gòu)體變量類型)
頭結(jié)點(diǎn)是首節(jié)點(diǎn)前面的那個(gè)節(jié)點(diǎn),頭結(jié)點(diǎn)并不存放有效數(shù)據(jù),
設(shè)置頭結(jié)點(diǎn)的目的是為了方便對(duì)鏈表的操作。
頭指針
存放頭結(jié)點(diǎn)地址的指針變量
優(yōu)點(diǎn):插入刪除元素效率高;
不需要一塊連續(xù)的很大的內(nèi)存空間。
缺點(diǎn):查找某個(gè)位置的元素效率低。
定義
鏈表的基本單元是節(jié)點(diǎn),節(jié)點(diǎn)分為兩部分:數(shù)據(jù)域和指針域,數(shù)據(jù)域用來存放有效數(shù)據(jù),指針域存
放下一個(gè)節(jié)點(diǎn)的地址。所以鏈表的節(jié)點(diǎn)都是結(jié)構(gòu)體變類型。
用創(chuàng)建鏈表時(shí),鏈表必須為動(dòng)態(tài)創(chuàng)建,以便其它函數(shù)對(duì)其進(jìn)行操作。
要確定一個(gè)鏈表,只需鏈表的頭指針即可,即函數(shù)參數(shù)只需一個(gè)。
鏈表的實(shí)現(xiàn):
# include
# include
# include
struct Node //通過結(jié)構(gòu)體定義節(jié)點(diǎn)
{
int data; //創(chuàng)建數(shù)據(jù)域
struct Node * pNext; //創(chuàng)建指針域
};
//函數(shù)聲明
struct Node * CreateList(void);
void TraverseList(struct Node *);
bool isEmpty(struct Node *);
int main(void)
{
struct Node * pHead; //創(chuàng)建頭指針,用來存放頭結(jié)點(diǎn)的地址。
pHead = CreateList(); //CreateList()函數(shù)動(dòng)態(tài)創(chuàng)建鏈表并返回頭結(jié)點(diǎn)的地址。
printf("\n");
TraverseList(pHead); //函數(shù)參數(shù)只需頭指針即可確定一個(gè)鏈表。
return 0;
}
struct Node * CreateList(void) //函數(shù)返回值為struct Node * 類型。
{
int len;
int i;
int val;
struct Node * pHead = (struct Node *)malloc(sizeof(struct Node));
if (NULL == pHead)
{
printf("分配頭結(jié)點(diǎn)空間失敗,程序終止!\n");
exit(-1); //exit函數(shù),退出程序。
}
struct Node * pTail = pHead; //創(chuàng)建尾指針指向尾節(jié)點(diǎn)
pTail->pNext = NULL;
printf("請(qǐng)輸入鏈表的節(jié)點(diǎn)個(gè)數(shù):len = ");
scanf("%d", &len);
for (i=0; i
{
printf("請(qǐng)輸入第%d個(gè)節(jié)點(diǎn)的值:", i+1);
scanf("%d", &val);
struct Node * pNew = (struct Node *)malloc(sizeof(struct Node)); //鏈表的不連續(xù)性在于它的內(nèi)存空間在不斷地一個(gè)個(gè)分配,而數(shù)組則是一次性分配完成。
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; //使指針指向下一個(gè)節(jié)點(diǎn)
printf("鏈表中的數(shù)據(jù)為:\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;
}
應(yīng)用實(shí)例:學(xué)生信息管理系統(tǒng)
# 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("請(qǐng)輸入學(xué)生的個(gè)數(shù):\n");
printf("len = ");
scanf("%d", &len);
pArr = (struct Student *)malloc(len*sizeof(struct Student));
Input(pArr, len);
sort(pArr, len);
printf("\n\n");
printf("排序結(jié)果是:\n");
Output(pArr, len);
return 0;
}
void Input(struct Student * pArr, int len)
{
int i;
for (i=0; i
{
printf("請(qǐng)輸入第%d個(gè)學(xué)生的信息:\n", i+1);
printf("name = ");
scanf("%s", pArr[i].name); //結(jié)構(gòu)體中name成員本身為數(shù)組,數(shù)組名name即為第一個(gè)元素的地址,不需要加&
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名學(xué)生的信息是:\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");
}
}
總結(jié)
以上是生活随笔為你收集整理的c语言链表编程作业,C语言编程入门——链表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中信银联标准IC信用卡申请多久下卡
- 下一篇: 中信银联标准ic信用卡额度一般是多少