单链表的基本功能实现(基于C语言)
声明(技术有限,仅限参考,可直接通过GCC编译使用,大神勿喷)
也真诚希望各位可以提些真实有用的意见
基本功能
- 新建链表
- 初始化
- 遍历
- 计算长度
- 删除单个结点
- 插入新结点
- 修改结点内容
- 查看单个结点
- 清空链表
- 销毁链表
代码区
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LinkList struct ListNode
struct DataNode
{
int num;
char name[21];
char addr[31];
int score[2];
};
LinkList
{
struct DataNode *data;
LinkList *next;
};
LinkList* creat_LinkList()
{
LinkList* newNode = malloc(sizeof(LinkList));
newNode->data = malloc(sizeof(struct DataNode));
newNode->next = NULL;
return newNode;
}
LinkList* init_LinkList(LinkList* newNode)
{
if (newNode == NULL)
{
return NULL;
}
LinkList* pHeader = newNode;
LinkList* pCurrent = newNode;
int val = -1;
while(1)
{
printf("Input -1 is colse!!!\n");
scanf("%d",&val);
if(val == -1) break;
pCurrent->next = creat_LinkList();
printf("Input num,name,addr and two score:\n");
scanf("%d",&pCurrent->next->data->num);
scanf("%s",pCurrent->next->data->name);
scanf("%s",pCurrent->next->data->addr);
scanf("%d",&pCurrent->next->data->score[0]);
scanf("%d",&pCurrent->next->data->score[1]);
pCurrent = pCurrent->next;
}
pCurrent->next = NULL;
return pHeader;
}
void size_LinkList(LinkList* pHeader)
{
if(pHeader->next == NULL)
{
printf("Count:NULL LinkList\n");
return;
}
LinkList* pCurrent = pHeader->next;
int size = 1;
while(pCurrent)
{
pCurrent = pCurrent->next;
size++;
}
printf("The LinkList have %d node(include a NULL node)\n", size);
printf("The LinkList size is %ld Byte\n", size * sizeof(LinkList));
}
void delete_LinkList(LinkList* pHeader)
{
printf("Input Delete Num:\n");
int num = -1;
scanf("%d",&num);
if(pHeader == NULL)
{
printf("Delete Fail: NULL LinkList\n");
return;
}
LinkList* pCurrent = pHeader->next;
LinkList* pTemp = pCurrent;
while(pCurrent)
{
if(pCurrent->data->num == num)
break;
pTemp = pCurrent;
pCurrent = pCurrent->next;
}
if (pCurrent == NULL)
{
printf("Delete Fail: NOT FIND\n");
return;
}
pTemp->next = pCurrent->next;
free(pCurrent);
printf("Delete Success!\n");
}
void foreach_LinkList(LinkList* pHeader)
{
if (pHeader->next == NULL)
{
printf("Foreach:NULL LinkList\n");
return;
}
LinkList* pCurrent = pHeader->next;
printf("Number\tName\tAddr\tscore1\tscore2\n");
while(pCurrent)
{
printf("%d\t",pCurrent->data->num);
printf("%s\t",pCurrent->data->name);
printf("%s\t",pCurrent->data->addr);
printf("%d\t",pCurrent->data->score[0]);
printf("%d\n",pCurrent->data->score[1]);
pCurrent = pCurrent->next;
}
}
int size_LinkListNode(LinkList* pHeader)
{
int size = 0;
LinkList* pCurrent = pHeader->next;
while(pCurrent)
{
size++;
pCurrent = pCurrent->next;
}
return size;
}
void insert_LinkList(LinkList* pHeader)
{
if (pHeader == NULL)
{
printf("Insert Fail: NULL LinkList!!!\n");
return;
}
printf("Input a insert station:\n");
int station = -1;
scanf("%d",&station);
if (station < 1 || station > size_LinkListNode(pHeader))
{
printf("Insert Fail: station error!!!\n");
return;
}
LinkList* pCurrent = pHeader;
int staTemp = 1;
while(staTemp != station)
{
pCurrent = pCurrent->next;
staTemp++;
}
LinkList* pTemp = creat_LinkList();
if (pTemp == NULL)
{
printf("Creat NewNode Fail\n");
return;
}
printf("Input NewNode num,name,addr and two score:\n");
scanf("%d",&pTemp->data->num);
scanf("%s",pTemp->data->name);
scanf("%s",pTemp->data->addr);
scanf("%d",&pTemp->data->score[0]);
scanf("%d",&pTemp->data->score[1]);
pTemp->next = pCurrent->next;
pCurrent->next = pTemp;
}
void update_LinkList(LinkList* pHeader)
{
int tnum = -1;
printf("Input Update Number:\n");
scanf("%d",&tnum);
LinkList* pCurrent = pHeader->next;
while(pCurrent)
{
if(pCurrent->data->num == tnum)
break;
pCurrent = pCurrent->next;
}
if(pCurrent == NULL)
{
printf("NOT FIND\n");
return;
}
printf("Success! Found\n");
printf("Selete Item:\n1.Num 2.Name 3.Addr 4.Score1 5.Score2\n");
int item = 0;
scanf("%d",&item);
if (item < 0 || item >5)
{
printf("Selete Item Error\n");
return;
}
switch(item)
{
case 1:
{
printf("New Number is:\n");
int num_temp = 0;
scanf("%d",&num_temp);
pCurrent->data->num = num_temp;
break;
}
case 2:
{
printf("New Name is:\n");
char* name_temp = malloc(sizeof(char*));
scanf("%s",name_temp);
strcpy(pCurrent->data->name,name_temp);
break;
}
case 3:
{
printf("New Addr is:\n");
char* addr_temp = malloc(sizeof(char*));
scanf("%s",addr_temp);
strcpy(pCurrent->data->addr,addr_temp);
break;
}
case 4:
{
printf("New Score1 is:\n");
int score1_temp = 0;
scanf("%d",&score1_temp);
pCurrent->data->score[0] = score1_temp;
break;
}
case 5:
{
printf("New Score2 is:\n");
int score2_temp = 0;
scanf("%d",&score2_temp);
pCurrent->data->score[1] = score2_temp;
break;
}
}
printf("Update Success!\n");
}
void read_LinkList(LinkList* pHeader)
{
if (pHeader == NULL)
return;
printf("Input read Number:\n");
int num_temp = -1;
scanf("%d",&num_temp);
LinkList* pCurrent = pHeader->next;
while(pCurrent)
{
if(pCurrent->data->num == num_temp)
break;
pCurrent = pCurrent->next;
}
if (pCurrent == NULL)
{
printf("Not Found\n");
return;
}
printf("This Node item have:\n");
printf("%d\t",pCurrent->data->num);
printf("%s\t",pCurrent->data->name);
printf("%s\t",pCurrent->data->addr);
printf("%d\t",pCurrent->data->score[0]);
printf("%d\n",pCurrent->data->score[1]);
}
void clean_LinkList(LinkList* pHeader)
{
if (pHeader == NULL)
{
return;
}
LinkList* p,*q;
p = pHeader->next;
while(p)
{
q = p->next;
free(p);
p = q;
}
pHeader->next = NULL;
printf("Clean LinkList Success\n");
}
void destroy_LinkList(LinkList* pHeader)
{
if (pHeader == NULL)
{
return;
}
while(pHeader)
{
LinkList* p = pHeader->next;
free(pHeader);
pHeader = p;
}
pHeader = NULL;
printf("Destroy LinkList Success\n");
}
int main(void)
{
LinkList* pHeader = creat_LinkList();
init_LinkList(pHeader);
printf("--------------------------\n");
foreach_LinkList(pHeader);
printf("--------------------------\n");
size_LinkList(pHeader);
printf("--------------------------\n");
delete_LinkList(pHeader);
foreach_LinkList(pHeader);
printf("--------------------------\n");
insert_LinkList(pHeader);
foreach_LinkList(pHeader);
printf("--------------------------\n");
update_LinkList(pHeader);
foreach_LinkList(pHeader);
read_LinkList(pHeader);
printf("--------------------------\n");
clean_LinkList(pHeader);
foreach_LinkList(pHeader);
printf("--------------------------\n");
destroy_LinkList(pHeader);
size_LinkList(pHeader);
foreach_LinkList(pHeader);
return 0;
}