#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef enum SEX SEX;
enum SEX
{
male = 0,
female = 1
};
typedef struct student_node student_node;
struct student_node
{
unsigned int m_id;
unsigned char m_age;
SEX m_sex;
char * m_name;
student_node *m_next;
};
//创建头节点
student_node * head = NULL;
//创建节点
static student_node * mk_node(unsigned int id,unsigned char age,const char *name,SEX sex)
{
student_node * p= NULL;
p = ( student_node *)malloc(sizeof(student_node));
if(p == NULL)
{
printf("malloc failed\n");
return NULL;
}else
{
p->m_name = (char *)malloc(20);
if(p->m_name == NULL)
{
printf("malloc failed...\n");
return NULL;
}else
{
p->m_id = id;
p->m_age = age;
strncpy(p->m_name,name,20);
p->m_sex = sex;
p->m_next = NULL;
return p;
}
}
}
//表头插入节点,一直换head
int insert_node_head(student_node * now)
{
now->m_next = head;
head = now;
return 0;
}
//表尾插入节点
int insert_node_tail(student_node * now)
{
student_node * p = head;
if(head == NULL)
{
// printf("list is empty\n");
head = now;
}else
{
//printf("list is not empty\n");
while(p->m_next != NULL)
{
p = p->m_next;
}
p->m_next = now;
}
}
//遍历节点,返回链表的长度
int traverse_node(void)
{
student_node * p= head;
int cnt = 0;
if(head != NULL)
{
printf("---------------first------------\n");
printf("ID=%d\n",p->m_id);
printf("SEX= %d\n",p->m_sex);
printf("AGE = %d\n",p->m_age);
printf("NAME= %s\n",p->m_name);
printf("--------------------------------\n");
cnt++;
}
while(p->m_next != NULL)
{
p = p->m_next;
cnt++;
printf("--------------------------------\n");
printf("ID=%d\n",p->m_id);
printf("SEX= %d\n",p->m_sex);
printf("AGE = %d\n",p->m_age);
printf("NAME= %s\n",p->m_name);
printf("--------------------------------\n");
}
return cnt;
}
static void print_infor(student_node *addr)
{
printf("--------------------------------\n");
printf("ID=%d\n",addr->m_id);
printf("SEX= %d\n",addr->m_sex);
printf("AGE = %d\n",addr->m_age);
printf("NAME= %s\n",addr->m_name);
printf("--------------------------------\n");
}
student_node * find_node(unsigned int id)
{
student_node * p = head;
//先看第一个节点是不是
if(head != NULL)
{
if(p->m_id == id)
return p;
}
// 用p->m_next 做判断时
while(p->m_next != NULL)
{
if(p->m_id == id)
break;
p = p->m_next;
}
return p;
}
//删除某个节点
int delete_node (student_node * p)
{
student_node *pre = head;
//删除第一个节点
if(p == head)
{
head = p->m_next;
free(p->m_name);
free(p);
return;
}
//删除一般节点
//上一个节点的m_next 指向当前节点的m_next
// 关键是寻找上一个节点
while(pre->m_next != NULL)
{
if(pre->m_next == p)
{
pre->m_next = p->m_next;
free(p->m_name);
free(p);
}
pre = pre->m_next;
}
return;
}
//清空链表
int destory_list()
{
student_node *p = head;
if(head != NULL)
{
free(head->m_next);
free(head);
}
while(p->m_next != NULL)
{
free(p->m_name);
free(p);
p = p->m_next;
}
return;
}
int main()
{
student_node *addr;
int cnt;
//student_node * mk_node(unsigned int id,unsigned char age,char *name,SEX sex)
addr = mk_node(1,10,"james",male);
insert_node_head(addr);
//print_infor(addr);
addr = mk_node(2,3,"hellotitty",female);
insert_node_tail(addr);
//print_infor(addr);
addr = mk_node(3,100,"superman",male);
insert_node_tail(addr);
//print_infor(addr);
cnt = traverse_node();
printf("%d\n",cnt);
addr = find_node(2);
if(addr != NULL)
delete_node (addr);
cnt = traverse_node();
printf("%d\n",cnt);
destory_list();
return 0;
}
#include <string.h>
#include <stdlib.h>
typedef enum SEX SEX;
enum SEX
{
male = 0,
female = 1
};
typedef struct student_node student_node;
struct student_node
{
unsigned int m_id;
unsigned char m_age;
SEX m_sex;
char * m_name;
student_node *m_next;
};
//创建头节点
student_node * head = NULL;
//创建节点
static student_node * mk_node(unsigned int id,unsigned char age,const char *name,SEX sex)
{
student_node * p= NULL;
p = ( student_node *)malloc(sizeof(student_node));
if(p == NULL)
{
printf("malloc failed\n");
return NULL;
}else
{
p->m_name = (char *)malloc(20);
if(p->m_name == NULL)
{
printf("malloc failed...\n");
return NULL;
}else
{
p->m_id = id;
p->m_age = age;
strncpy(p->m_name,name,20);
p->m_sex = sex;
p->m_next = NULL;
return p;
}
}
}
//表头插入节点,一直换head
int insert_node_head(student_node * now)
{
now->m_next = head;
head = now;
return 0;
}
//表尾插入节点
int insert_node_tail(student_node * now)
{
student_node * p = head;
if(head == NULL)
{
// printf("list is empty\n");
head = now;
}else
{
//printf("list is not empty\n");
while(p->m_next != NULL)
{
p = p->m_next;
}
p->m_next = now;
}
}
//遍历节点,返回链表的长度
int traverse_node(void)
{
student_node * p= head;
int cnt = 0;
if(head != NULL)
{
printf("---------------first------------\n");
printf("ID=%d\n",p->m_id);
printf("SEX= %d\n",p->m_sex);
printf("AGE = %d\n",p->m_age);
printf("NAME= %s\n",p->m_name);
printf("--------------------------------\n");
cnt++;
}
while(p->m_next != NULL)
{
p = p->m_next;
cnt++;
printf("--------------------------------\n");
printf("ID=%d\n",p->m_id);
printf("SEX= %d\n",p->m_sex);
printf("AGE = %d\n",p->m_age);
printf("NAME= %s\n",p->m_name);
printf("--------------------------------\n");
}
return cnt;
}
static void print_infor(student_node *addr)
{
printf("--------------------------------\n");
printf("ID=%d\n",addr->m_id);
printf("SEX= %d\n",addr->m_sex);
printf("AGE = %d\n",addr->m_age);
printf("NAME= %s\n",addr->m_name);
printf("--------------------------------\n");
}
student_node * find_node(unsigned int id)
{
student_node * p = head;
//先看第一个节点是不是
if(head != NULL)
{
if(p->m_id == id)
return p;
}
// 用p->m_next 做判断时
while(p->m_next != NULL)
{
if(p->m_id == id)
break;
p = p->m_next;
}
return p;
}
//删除某个节点
int delete_node (student_node * p)
{
student_node *pre = head;
//删除第一个节点
if(p == head)
{
head = p->m_next;
free(p->m_name);
free(p);
return;
}
//删除一般节点
//上一个节点的m_next 指向当前节点的m_next
// 关键是寻找上一个节点
while(pre->m_next != NULL)
{
if(pre->m_next == p)
{
pre->m_next = p->m_next;
free(p->m_name);
free(p);
}
pre = pre->m_next;
}
return;
}
//清空链表
int destory_list()
{
student_node *p = head;
if(head != NULL)
{
free(head->m_next);
free(head);
}
while(p->m_next != NULL)
{
free(p->m_name);
free(p);
p = p->m_next;
}
return;
}
int main()
{
student_node *addr;
int cnt;
//student_node * mk_node(unsigned int id,unsigned char age,char *name,SEX sex)
addr = mk_node(1,10,"james",male);
insert_node_head(addr);
//print_infor(addr);
addr = mk_node(2,3,"hellotitty",female);
insert_node_tail(addr);
//print_infor(addr);
addr = mk_node(3,100,"superman",male);
insert_node_tail(addr);
//print_infor(addr);
cnt = traverse_node();
printf("%d\n",cnt);
addr = find_node(2);
if(addr != NULL)
delete_node (addr);
cnt = traverse_node();
printf("%d\n",cnt);
destory_list();
return 0;
}