1.实现创建链表,打印链表,摧毁链表的基本操作,代码如下
所用的结构体定义:
typedef int DATATYPE;
typedef struct Node{
DATATYPE data;
struct Node *next;
}Node, *linkList;
main函数实现整体框架
int main()
{
char display[64+1] = {0};
//定义一个链表
Node *list = NULL;
//初始化链表,主要是生成一个头节点
list=initList();
//初始插入1,2,3,4,5,6,7,8,9,10
//给链表插入数据
for(int i = 1; i<=10; i++)
insertList(list, 1, i);
//打印插入的数据
sprintf(display, "创建");
printList(list, display);
//在第八位插入33
int data = 33;
insertList(list, 8, data);
//打印插入的数据
memset(display, 0, sizeof(display));
sprintf(display, "第%d位插入%d", 8,data);
printList(list, display);
//表头插入数据
data = 66;
pushHead(list, data);
//打印插入的数据
memset(display, 0, sizeof(display));
sprintf(display, "表头插入");
printList(list,display);
//表尾插入数据
data = 77;
pushEnd(list, data);
//打印插入的数据
memset(display, 0, sizeof(display));
sprintf(display, "表尾插入");
printList(list,display);
//删除指定结点
deleteNode(list, 8);
memset(display, 0, sizeof(display));
sprintf(display, "删除第8位");
printList(list,display);
//摧毁链表
destoryList(list);
return 0;
}
运行结果如下:
初始化链表:
//初始化链表
Node *initList()
{
Node *head=(Node *)malloc(sizeof(Node));
if(head == NULL) {
printf("分配头指针失败!!\n");
return NULL;
}
head->next = NULL;
return head;
}
创建整个链表/插入数据:
//插入数据
void insertList(linkList list, int location, DATATYPE data )
{
Node *pList=NULL;
if((list ==NULL) || (location<0)) { printf("链表不存在或者插入位置不对!!\n");}
/*中途插入数据beg*/
//中途插入数据需要找到前面location-1个
int ii = 0;
while( (ii< (location-1)) && (list != NULL) ){
list = list->next;
ii++;
}
/*中途插入数据end*/
pList=list;
Node *temp=(Node *)malloc(sizeof(Node));
//插入数据
//strcpy(temp->data, data );
temp->data = data;
//插入新的结点
temp->next = pList->next;
pList->next = temp;
}
打印整个链表:
//打印链表数据
void printList(linkList list, char *display)
{
Node* pList=NULL;
if(list == NULL) {printf("链表不存在!!!\n");}
//从第一个结点开始打印,注意不是头节点
pList = list->next;
printf("链表:%s [", display);
while(pList != NULL){
printf("%d ", pList->data);
pList = pList->next;
}
printf("]\n");
}
摧毁整个链表:
//摧毁链表
void destoryList(linkList list)
{
Node *temp=NULL;
while(list != NULL){
temp = list->next; //temp保存下一个结点地址
free(list); //释放当前结点
list = temp; //移动到下一个结点
}
}
表头插入:
//表头插入数据
void pushHead(linkList list, DATATYPE data)
{
insertList(list, 1, data);
}
表尾插入数据:
//表尾插入数据
void pushEnd(linkList list, DATATYPE data)
{
if(list == NULL) {printf("链表不存在!!!\n"); return;}
//先要找到尾结点
while(list->next != NULL){
list = list->next;
}
Node *temp = (Node *)malloc(sizeof(Node));
if(temp == NULL) {printf("malloc error\n"); return;}
//尾结点next置为NULL
temp->next = NULL;
temp->data = data;
list->next = temp;
}
删除指定结点:
//删除指定结点
void deleteNode(linkList list, int location)
{
if((list == NULL) || (location < 0)) {printf("链表不存在或者需要删除的结点位置错误!!!\n");}
//要找到指定结点前一个结点
int ii = 0;
while((ii<location-1) && (list != NULL)){
list = list->next;
ii++;
}
//判断指定的被删结点是不是尾结点
if(list->next == NULL) {printf("被删结点位置不合法!!\n"); return ;};
Node *temp = list->next; //temp存放需要删除的结点
list->next = temp->next; //被删结点前一个结点的next指向被删结点的下一个结点
free(temp);
}