/*單鏈表的頭插法和尾插法c語言實現(xiàn)*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
/*簡單的定義一個鏈表節(jié)點的數(shù)據(jù)單元*/
typedef struct student_t
{
int num;
char name[SIZE];
struct student_t* pNext;
}studentList, *pStudentList;
/*定義一個全局的靜態(tài)的鏈表頭節(jié)點指針*/
static pStudentList g_pstStudentList = NULL;
/*創(chuàng)建一個學(xué)生信息的鏈表節(jié)點*/
pStudentList createaOneStudentListNode()
{
pStudentList pNewNode = NULL;
pNewNode = (pStudentList)malloc(sizeof(studentList));
return pNewNode;
}
/*在鏈表頭插入數(shù)據(jù)節(jié)點*/
int addOneStudentToListHead(int num, char* name)
{
pStudentList pNewNode = NULL;
int result = 0;
if ((num < 0) || (name == NULL))
{
result = -1;
printf("error inoput parameter!\n");
return result;
}
pNewNode = createaOneStudentListNode();
pNewNode->num = num;
memcpy(pNewNode->name, name, strlen(name));
pNewNode->pNext = g_pstStudentList;
g_pstStudentList = pNewNode;
return result;
}
/*在鏈表尾部插入數(shù)據(jù)節(jié)點*/
int addOneStudentToListTail(int num, char* name)
{
pStudentList pTempHead = NULL;
pStudentList pTailNode = NULL;
pStudentList pNewNode = NULL;
int result = 0;
if ((num < 0) || (name == NULL))
{
result = -1;
printf("error input parameter!\n");
return result;
}
pTempHead = g_pstStudentList;
while(pTempHead)
{
if (pTempHead->pNext == NULL)
{
pTailNode = pTempHead;
}
pTempHead = pTempHead->pNext;
}
pNewNode = createaOneStudentListNode();
pNewNode->num = num;
memcpy(pNewNode->name, name, strlen(name));
pNewNode->pNext = NULL;
pTailNode->pNext = pNewNode;
return result;
}
/*輸出整個鏈表中的學(xué)號信息芒帕,檢查插入的是否正確蔚鸥,插入時沒有考慮是否有相同學(xué)號*/
void printList()
{
pStudentList pTempHead = NULL;
pTempHead = g_pstStudentList;
while(pTempHead)
{
printf("studnet num = %d\n", pTempHead->num);
pTempHead = pTempHead->pNext;
}
}
/*釋放整個鏈表的資源*/
void freeList()
{
pStudentList pTempHead = NULL;
pStudentList pFree = NULL;
int i = 0;
pTempHead = g_pstStudentList;
pFree = g_pstStudentList;
while(pTempHead)
{
pFree = pTempHead;
printf("free studnet num = %d\n", pTempHead->num);
pTempHead = pTempHead->pNext;
if (pFree != NULL)
{
printf("i = %d\n", i);/*測試是否正確釋放資源*/
free(pFree);
}
++i;
}
}
int main()
{
/*構(gòu)建頭節(jié)點*/
char* cName = "allan";
g_pstStudentList = createaOneStudentListNode();
g_pstStudentList->num = 0;
memcpy(g_pstStudentList->name, cName, strlen(cName));
g_pstStudentList->pNext = NULL;
/*使用尾插法插入數(shù)據(jù)*/
char* cName1 = "allan1";
addOneStudentToListTail(1,cName1);
/*使用尾插法插入數(shù)據(jù)*/
char* cName2 = "allan2";
addOneStudentToListTail(2,cName2);
/*使用頭插法插入數(shù)據(jù)*/
char* cName3 = "allan3";
addOneStudentToListHead(3,cName3);
/*輸出當(dāng)前鏈表中存儲的學(xué)號膘流,沒有考慮學(xué)號的唯一性,假設(shè)輸入的都是不同數(shù)字*/
printList();
/*使用完資源后進行釋放資源紊扬,防止內(nèi)存泄漏*/
freeList();
return 0;
}