单链表的头插法和尾插法c语言实现

/*单链表的头插法和尾插法c语言实现*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
/*简单的定义一个链表节点的数据单元*/
typedef struct student_t
{
int num;
char name[SIZE];
struct student_t* pNext;
}studentList, *pStudentList;

/*定义一个全局的静态的链表头节点指针*/
static pStudentList g_pstStudentList = NULL;

/*创建一个学生信息的链表节点*/
pStudentList createaOneStudentListNode()
{
pStudentList pNewNode = NULL;
pNewNode = (pStudentList)malloc(sizeof(studentList));
return pNewNode;
}
/*在链表头插入数据节点*/
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;
}
/*在链表尾部插入数据节点*/
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;
}
/*输出整个链表中的学号信息,检查插入的是否正确,插入时没有考虑是否有相同学号*/
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()
{
/*构建头节点*/
char* cName = "allan";
g_pstStudentList = createaOneStudentListNode();
g_pstStudentList->num = 0;
memcpy(g_pstStudentList->name, cName, strlen(cName));
g_pstStudentList->pNext = NULL;

/*使用尾插法插入数据*/
char* cName1 = "allan1";
addOneStudentToListTail(1,cName1);

/*使用尾插法插入数据*/
char* cName2 = "allan2";
addOneStudentToListTail(2,cName2);

/*使用头插法插入数据*/
char* cName3 = "allan3";
addOneStudentToListHead(3,cName3);

/*输出当前链表中存储的学号,没有考虑学号的唯一性,假设输入的都是不同数字*/
printList();

/*使用完资源后进行释放资源,防止内存泄漏*/
freeList();
return 0;
}

使用VS2008运行结果如下图所示:

时间: 2024-08-04 17:40:55

单链表的头插法和尾插法c语言实现的相关文章

单链表:头插法和尾插法

头插法: linklist *CreateList_Front() { linklist *head, *p; char ch; head = NULL; printf("依次输入字符数据(‘#’表示输入结束):\n"); ch = getchar(); while(ch != '#') { p = (linklist*)malloc(sizeof(linklist)); p->data = ch; p->next = head; head = p; ch = getcha

链表的头插法和尾插法

链表的头插法和尾插法 本文的链表均是带头结点的链表. 链表可以说是最简单的链式结构,在C语言中,通常用结构体封装其数据域及指针域作为一个结点. 今天我们说的是链表结点的构造方式以及插入方式. 尾插法 1 //尾插法 2 3 void createlistR(LNode *&C,int a[],int n){ 4 LNode *s,*r; 5 int i; 6 C = (LNode*)malloc(sizeof(LNode)); 7 C->next = NULL; 8 r = C; 9 for

C实现头插法和尾插法来构建单链表(不带头结点)

链表的构建事实上也就是不断插入节点的过程.而节点的插入能够分为头插法和尾插法. 头插法就是在头结点后插入该节点,始终把该节点作为第一个节点.尾插法就是在链表的最后一个节点处插入元素,作为最后一个节点.假设想要了解链表的概念和其它链表操作.请參考<数据结构与算法之链表><C语言实现链表的基本操作>两篇文章.演示样例代码上传至  https://github.com/chenyufeng1991/HeadInsertAndTailInsert . // // main.c // Hea

C实现头插法和尾插法来构建链表

链表的构建其实也就是不断插入节点的过程.而节点的插入可以分为头插法和尾插法.头插法就是在头结点后插入该节点,始终把该节点作为第一个节点.尾插法就是在链表的最后一个节点处插入元素,作为最后一个节点.如果想要了解链表的概念和其他链表操作,请参考<数据结构与算法之链表><C语言实现链表的基本操作>两篇文章.示例代码上传至  https://github.com/chenyufeng1991/HeadInsertAndTailInsert . // // main.c // HeadIns

C实现头插法和尾插法来构建非循环双链表(不带头结点)

在实际使用中,双链表比单链表方便很多,也更为灵活.对于不带头结点的非循环双链表的基本操作,我在<C语言实现双向非循环链表(不带头结点)的基本操作>这篇文章中有详细的实现.今天我们就要用两种不同的方式头插法和尾插法来建立双链表.代码上传至  https://github.com/chenyufeng1991/HeadInsertAndTailInsertDoubleList  . 核心代码如下: //尾插法创建不带头结点的非循环双向链表 Node *TailInsertCreateList(No

二、单链表的头插与尾插

只要懂了单链表的头插与尾插,双链表的就非常好理解了.对于这,我觉得用图形解释没一步是最好的方法.附上我自己对头插与尾插的理解. 1.头插法在我学的过程中最难以理解的是s->next=L->next.解决方法:我是通过上面这幅图了解头插是如何一步一步插入元素,按步骤分析即可.A:创建一个指针域为NULL,数据域为空的头节点L:B:假设插入的节点为S,将头节点后面一个节点的地址(L->next)赋值给新节点S的指针域(S->next),在这一步中因为头结点后面没有节点了,即L->

单链表的头插、尾插、删除、合并等操作

单链表的头插.尾插.删除.合并等操作实现代码如下: #include<iostream> using namespace std; //单链表的存储结构 typedef struct Node { int data; struct Node* next; }Node,*LinkList;//LinkList为结构指针类型 //初始化单链表 void InitList(LinkList *L) { *L = (LinkList)malloc(sizeof(Node));//建立头结点 (*L)-

头插法和尾插法

. #include "stdio.h" #include "stdlib.h" typedef struct List { int data; //数据域 struct List *next; //指针域 } List; void TailCreatList(List *L) //尾插法建立链表 { List *s, *r;//s用来指向新生成的节点.r始终指向L的终端节点. r = L; //r指向了头节点,此时的头节点是终端节点. for (int i = 0

采用头插插法和尾插法建立单项链表

PS: 来源2014年数据结构联考复习指导 Page27. #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; const int END_INPUT = -1; typedef struct LNode { int data; struct LNode *next; }LNode, *LinkList; LinkList CreatList1(LinkList