一天一更新呀 都快赶上小说了 呵呵 昨天写的一个线性表 因为当然的理解不行 误写成了链表 还好各位园友提醒 今天这个才是真正的链表 不过这是个简单的链表 单向链表 虽然感觉简单 但是蛮绕人的 虽然现在写出来的 但是还是根据上课老师写的参考 一点点加 虽然关于链表是个小问题 还是希望各位园友多多帮助 下面这是关于链表的操作代码:
链表操作
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
//联系人节点结构体
typedef struct _LinkNode
{
char name[9]; //姓名
char phone[14]; //电话
struct _LinkNode* next; //下一个联系人指针
}LinkNode;
//初始化操作
LinkNode* InitList()
{
LinkNode* head = NULL;
head = (LinkNode*)malloc(sizeof(LinkNode));
if(head == NULL)
{
printf("内存分配失败\n");
return NULL;
}
//初始化 将其指向下一节点指针置空
memset(head, 0, sizeof(LinkNode));
head->next = NULL;
return head;
}
//取元素操作,i为需要取的元素排序
LinkNode* GetElem(LinkNode* ls, int i)
{
LinkNode* temp = NULL;
int j = 0;
if(ls == NULL)
{
printf("头结点不存在\n");
return NULL;
}
if(i < 1)
{
printf("参数输入错误\n");
return NULL;
}
//temp指向第一个元素
temp = ls->next;
j = 1;
//循环找到第i个元素
while(temp != NULL && j < i)
{
temp = temp->next;
j++;
}
//第i个元素为空 或者 元素数量少于i
if(temp == NULL || j != i)
{
printf("元素不存在\n");
return NULL;
}
return temp;
}
//插入新元素到第i个位置之前
void InsertElem(LinkNode* ls, int i, LinkNode* elem)
{
LinkNode* temp = NULL;
LinkNode* newnode = NULL;
int j = 0;
if(ls == NULL)
{
printf("线性表不存在\n");
return ;
}
if(i < 1)
{
printf("参数输入错误\n");
return NULL;
}
if(elem == NULL)
{
printf("待插入元素不存在");
return ;
}
temp = ls;
j = 1;
//寻找第i-1个节点
while(temp != NULL && j < i)
{
temp = temp->next;
j++;
}
if(j < i - 1)
{
printf("第%d个元素不存在\n", i - 1);
return ;
}
//为新节点分配内存
newnode = (LinkNode*)malloc(sizeof(LinkNode));
if(newnode == NULL)
{
printf("内存分配失败\n");
return ;
}
memcpy(newnode, elem, sizeof(LinkNode));
newnode->next = temp->next;
temp->next = newnode;
}
//销毁链表
void DestroyList(LinkNode* ls)
{
LinkNode* temp = NULL;
LinkNode* next = NULL;
if(ls == NULL)
{
printf("链表不存在\n");
return ;
}
temp = ls;
while(temp != NULL)
{
next = temp->next;
free(temp);
temp = next;
}
}
void PrintNode(LinkNode* elem)
{
if(elem == NULL)
return ;
printf("%8s %13s\n", elem->name, elem->phone);
}
//遍历输出链表
void TravList(LinkNode* ls)
{
LinkNode* temp = NULL;
if(ls == NULL)
{
printf("链表不存在\n");
return ;
}
temp = ls->next;
while(temp != NULL)
{
PrintNode(temp);
temp = temp->next;
}
}
//删除元素
LinkNode DeleteElem(LinkNode* ls, int i)
{
LinkNode ret = {"", "", NULL};
LinkNode* temp = NULL;
LinkNode* del = NULL;
int j = 0;
if(ls == NULL)
{
printf("链表不存在\n");
return ret;
}
if(i < 1)
{
printf("输入参数错误\n");
return ret;
}
temp = ls;
j = 1;
while(temp != NULL && j < i)
{
temp = temp->next;
j++;
}
if(temp == NULL || j != i)
{
printf("第%d个元素不存在\n", i - 1);
return ret;
}
if(temp->next == NULL)
{
printf("第%d个元素不存在\n", i);
return ret;
}
//修改i-1元素的指针 指向i的下一位置, 拷贝第i个元素信息到ret中,然后说删除第i个元素
del = temp->next;
temp->next = del->next;
memcpy(&ret, temp->next, sizeof(LinkNode));
free(del);
return ret;
}
//修改第i个元素
void ModifyElem(LinkNode* ls, int i, LinkNode* mod)
{
LinkNode* temp = NULL;
int j = 0;
if(ls == NULL || mod == NULL || i < 1)
{
printf("参数无效\n");
return ;
}
temp = ls->next;
j = 1;
while(temp != NULL && j < i)
{
temp = temp->next;
j++;
}
if(temp == NULL || j != i)
{
printf("第%d个元素不存在\n", i);
return ;
}
strcpy(temp->name, mod->name);
strcpy(temp->phone, mod->phone);
}
int main()
{
LinkNode* head = NULL;
int i = 0;
LinkNode temp;
LinkNode* result;
//初始化链表
head = InitList();
if(head == NULL)
return 1;
//链表操作
for(i = 0; i < 20; i++)
{
sprintf(temp.name, "stu%03d", i + 1);
sprintf(temp.phone, "1311122%04d", i + 10);
InsertElem(head, i + 1, &temp);
}
TravList(head);
//查找操作验证 查找元素
printf("\n分别查找第1,20,10,21个元素\n");
result = GetElem(head, 1);
if(result != NULL)
{
printf("%8s %13s\n", result->name, result->phone);
}
result = GetElem(head, 20);
if(result != NULL)
{
printf("%8s %13s\n", result->name, result->phone);
}
result = GetElem(head, 10);
if(result != NULL)
{
printf("%8s %13s\n", result->name, result->phone);
}
result = GetElem(head, 21);
if(result != NULL)
{
printf("%8s %13s\n", result->name, result->phone);
}
result = GetElem(head, -1);
if(result != NULL)
{
printf("%8s %13s\n", result->name, result->phone);
}
//删除元素验证
printf("\n删除元素验证\n");
DeleteElem(head, 1);
DeleteElem(head, 10);
DeleteElem(head, 20);
DeleteElem(head, 21);
TravList(head);
//修改元素验证
printf("\n修改元素验证\n");
strcpy(temp.name, "mod");
strcpy(temp.phone, "123");
ModifyElem(head, 0, &temp);
ModifyElem(head, 1, &temp);
ModifyElem(head, 10, &temp);
ModifyElem(head, 18, &temp);
ModifyElem(head, 21, &temp);
TravList(head);
//销毁链表
DestroyList(head);
return 0;
}
这个方法和昨天线性表差不多 所以就不分开了 若有不足之处还望各位园友指点