C语言 实现链表

向顺序表插入元素的时候需要移动大量的数据

链表采用动态存储分配,

可以根据需要申请内存单元


#include "stdafx.h"
#include "stdlib.h"
#include "string.h"
typedef struct{
	char key[15];
	char name[20];
	int age;
}DATA;

typedef struct Node{
	DATA data;
	struct Node * next;

}ChainListType;
//  添加到节点的尾部
	ChainListType * ChainListAddEnd(ChainListType * head,DATA data){
		//head 为链表的头指针,data为节点保存的数据
		ChainListType *node, *h;
		//因为需要动态分配内存 所以需要引入 stdlib.h 头文件
		if (!(node = (ChainListType *)malloc(sizeof(ChainListType)))){
			printf("为保存的节点数据申请内存失败");
			return NULL;
		}
		node->data = data;
		node->next = NULL;
		if (head == NULL){
			head = node;
			return head;
		}
		h = head;
		while (h->next!=NULL)
			h = h->next;
		    h->next = node;
			return head;
}
		//添加节点到首部
	ChainListType * ChainListAddFirst(ChainListType *head,DATA data){
		ChainListType * node, *h;
		if (!(node = (ChainListType *)malloc(sizeof(ChainListType)))){
			printf("为保存的节点数据申请内存失败");
			return NULL;
		}
		node->data = data;
		node->next = head;		//指向头指针所指节点
		head = node;			//头指针指向新增节点
		return head;

	}
	//按照关键字查找节点
	ChainListType * ChainListFind(ChainListType * head,char *key){
		ChainListType *h;
		h = head;
		while (h)
		{
			if (strcmp(h->data.key, key) == 0){		//若节点的关键字与传入关键字相同
				return h;							//	返回该节点指针
				h = h->next;						//	处理下一个节点
			}
		}
	}
	//插入节点到链表
	ChainListType * ChainListInsert(ChainListType *head,char *findkey,DATA data){
		ChainListType * node, *node1;
		if (!(node = (ChainListType *)malloc(sizeof(ChainListType)))){
			printf("为保存的节点数据申请内存失败");
			return 0;
		}
		node->data = data;
		node1 = ChainListFind(head, findkey);
		if (node1){
			node->next = node1->next;
			node1->next = node;
		}
		else{
			free(node);
			printf("未找到插入位置\n");
		
		}
		return head;
	}
	//删除节点
	int ChainListDelete(ChainListType *head, char *key){
		ChainListType *node, *h;
		node = h = head;
		while (h){
			if (strcmp(h->data.key, key) == 0){
				node->next = h->next;
				free(h);
				return 1;
			}
			else{
				node = h;
				h = h->next;
			}
		}
		return 0;
	}
	void ChainListAll(ChainListType *head){
		ChainListType *h;
		DATA data;
		h = head;
		printf("链表所有的数据如下\n");
		while (h)
		{
			data = h->data;
			printf("%s%s%d\n", data.key, data.name, data.age);
			h = h->next;
		}
	}
	//统计链表的长度
	int ChainListLength(ChainListType * head){
		ChainListType *h;
		int i = 0;
		h = head;
		while (h){
			i++;
			h = h->next;
		}
		return i;
	}

实现

int main(){
	ChainListType *node, *head = NULL;
	DATA data;
	char key[15], findkey[15];
	printf("输入链表中的数据.包括关键字,姓名,年龄,关键字输入0\n");
	do{
		fflush(stdin);
		scanf("%s", data.key);
		if (strcmp(data.key, "0") == 0) break;	//若输入0,则退出
		scanf("%s%d", data.name, &data.age);
		head = ChainListAddEnd(head, data);
	} while (1);
	ChainListAll(head);
	
	printf("在链表中查找,请输入关键字\n");
	fflush(stdin);		//	清空输入缓冲区
	scanf("%s", key);
	node = ChainListFind(head, key);
	if (node){
		data = node->data;
		printf("关键字%s对应的节点数据(%s,%s,%d)\n",key,data.key,data.name,data.age);
	}
	else{
		printf("在链表中未找到关键字为%s的节点\n", key);
	}

	printf("在链表中删除节点,输入要删除的关键字\n");
	fflush(stdin);
	scanf("%s", key);
	ChainListDelete(head, key);
	ChainListAll(head);
	//getch();
	system("pause");
}


你可能感兴趣的:(C语言 实现链表)