关于C链表的实现
学习了数据结构后,自己学习写了一个链表的程序。
初步功能是实现了。但是不知道会不会有一些隐含的问题。所以希望大佬指导指导
/******************/ /*一个小的链表程序*/ /******************/ #include <stdio.h> #include <stdlib.h> //结点的结构体 typedef struct node { char data; struct node*next; }Node; //链表的结构体 typedef struct { Node *head; Node *list1; int num; }NList; //生成一个链表 void CreateList(NList *list) { list->head = NULL; list->list1 = NULL; list->num = 0; } //向链表中添加数据 void AddList(NList *list) { char data; scanf("%c",&data); while(data != '#') { if(list->head == NULL) { list->head = (Node *)malloc(sizeof(Node)); list->head->data = data; list->head->next = NULL; list->list1 = list->head; list->num = 1; } else { Node *p = (Node *)malloc(sizeof(Node)); list->list1->next = p; p->data = data; list->list1 = p; list->list1->next = NULL; list->num++; } scanf("%c",&data); } } //显示链表中的数据 void ShowList(NList list) { Node *P1; P1=list.head; while(P1 != NULL) { printf("%c",P1->data); P1 = P1->next; } } //删除链表头的数据 void DelList_head(NList *list) { if(list->head != NULL) { Node *p2 = list->head; list->head = p2->next; list->num--; free(p2); } else { printf("链表中不存在数据\n"); } } int main() { NList list2; CreateList(&list2); AddList(&list2); ShowList(list2); printf("\n链表中的数据个数是:%d个\n",list2.num); DelList_head(&list2); ShowList(list2); printf("\n链表中的数据个数是:%d个\n",list2.num); return 0; }
程序的执行结果如下:
另一个更加优化的链表代码,注释思路更加清晰:
#include <stdio.h>
#include <stdlib.h>
//结点的结构
typedef struct Node
{
int data;
struct Node *link;
}node;
//创建一个头结点
node * create_list(int x)
{
node *p = (node *)malloc(sizeof(node));
p->data = x;
p->link = NULL;
return p;
}
//向链表中添加数据
void add_list(node * head,int x)
{
if(!head)return;
while(head->link)
head = head->link;
node *p = (node *)malloc(sizeof(node));
p->data = x;
p->link = NULL;
head->link = p;
}
//在链表中查找数据
node * find_list(node * head,int x)
{
while(head && head->data != x)
head = head->link;
if(head) return head;
return NULL;
}
//打印链表中的数据
void show_list(node * head)
{
while(head)
{
printf("%d->",head->data);
head = head->link;
}
printf("null\n");
}
//反转链表
node * reverse(node * head)
{
node * new = NULL,*old = head,*temp;
while(old)
{
temp = old->link;
old->link = new;
new = old;old = temp;
}
return new;
}
//删除链表头节点
node * del_list(node * head)
{
if(!(head))return NULL;
node *p = (head);
(head) = (head)->link;
free(p);
return head;
}
//删除链表,需要修改head的指向,所以使用二级指针
void del_list_all(node **head)
{
while((*head))
(*head) = del_list((*head));
}
//测试程序
int main()
{
node *ptr = create_list(1);
add_list(ptr,2);
add_list(ptr,3);
add_list(ptr,4);
show_list(ptr);
if(find_list(ptr,5)) printf("查找到3的节点\n");
else printf("未找到3的节点\n");
if((ptr = del_list(ptr)) == NULL) printf("该链表为空链表,不可删除\n");
show_list(ptr);
del_list_all(&ptr);
show_list(ptr);
return 0;
}
本文来自博客园,作者:Air-Liu,转载请注明原文链接:https://www.cnblogs.com/ghost-98210/p/9544789.html