第一次没看书把代码全部敲出来一遍也算一种进步吧。。。
代码是根据自己理解写的,写的很烂可能有些地方处理的不妥当,但大概就是这样吧。
代码很简单,没注释,但很容易看懂。
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int num;
int data;
struct Node *pNext;
}Node,*pNode;
pNode CreateNode(pNode phead,int num,int data)
{
if (phead == NULL)
{
pNode NewNode = (pNode)malloc(sizeof(Node));
NewNode->num = num;
NewNode->data = data;
NewNode->pNext = NULL;
phead = NewNode;
}
else
{
pNode p = phead;
while (p->pNext != NULL)
{
p = p->pNext;
}
pNode NewNode = (pNode)malloc(sizeof(Node));
NewNode->num = num;
NewNode->data = data;
p->pNext = NewNode;
NewNode->pNext = NULL;
}
return phead;
}
pNode DeleteNode(pNode phead,int num)
{
if (phead == NULL)
{
printf("链表为空不能删除\n");
return NULL;
}
else if (phead->num == num)
{
pNode p = phead;
phead=p->pNext;
free(p);
}
else
{
pNode p1, p2;
p1 = phead;
p2 = NULL;
while (p1->pNext->num != num)
{
p1 = p1->pNext;
}
p2 = p1->pNext;
p1->pNext = p2->pNext;
free(p2);
}
return phead;
}
pNode Search(pNode phead, int num)
{
pNode p = phead;
while (p != NULL)
{
if (p->num == num)
{
return p;
break;
}
p = p->pNext;
}
return NULL;
}
pNode AddNodeBack(pNode phead,int num,int inum,int idata)
{
if (phead == NULL)
{
pNode NewNode = (pNode)malloc(sizeof(Node));
NewNode->num = inum;
NewNode->data = idata;
NewNode->pNext = NULL;
phead = NewNode;
}
else
{
pNode p = Search(phead, num);
pNode NewNode = (pNode)malloc(sizeof(Node));
pNode p1 = NULL;
NewNode->num = inum;
NewNode->data = idata;
p1 = p->pNext;
p->pNext = NewNode;
NewNode->pNext = p1;
}
return phead;
}
pNode AddNodeAhead(pNode phead, int num, int inum, int idata)
{
if (phead == NULL)
{
pNode NewNode = (pNode)malloc(sizeof(Node));
NewNode->num = inum;
NewNode->data = idata;
NewNode->pNext = NULL;
phead = NewNode;
}
else if (num == 1)
{
pNode p = phead;
pNode NewNode = (pNode)malloc(sizeof(Node));
NewNode->num = inum;
NewNode->data = idata;
NewNode->pNext = p;
phead=NewNode;
}
else
{
pNode p = Search(phead, num-1);
pNode NewNode = (pNode)malloc(sizeof(Node));
pNode p1 = NULL;
NewNode->num = inum;
NewNode->data = idata;
p1 = p->pNext;
p->pNext = NewNode;
NewNode->pNext = p1;
}
return phead;
}
void SortAllNode(pNode phead, char ch)
{
if (ch == '>')
{
for (pNode p = phead; p != NULL; p = p->pNext)
{
for (pNode p1 = phead; p1 != NULL; p1 = p1->pNext)
{
if (p->data < p1->data)
{
Node temp;
temp.num = p->num;
p->num = p1->num;
p1->num = temp.num;
temp.data = p->data;
p->data = p1->data;
p1->data = temp.data;
}
}
}
}
else if (ch == '<')
{
for (pNode p = phead; p != NULL; p = p->pNext)
{
for (pNode p1 = phead; p1 != NULL; p1 = p1->pNext)
{
if (p->data > p1->data)
{
Node temp;
temp.num = p->num;
p->num = p1->num;
p1->num = temp.num;
temp.data = p->data;
p->data = p1->data;
p1->data = temp.data;
}
}
}
}
}
void ChangeNode(pNode phead,int num, int NewNum, int NewData)
{
pNode p = Search(phead, num);
p->num = NewNum;
p->data = NewData;
}
void PrintAllNode(pNode phead)
{
if (phead == NULL)
{
printf("链表为空无法显示\n");
return;
}
else
{
pNode p = phead;
while (p!=NULL)
{
printf("num=%d data=%d %p %p\n", p->num, p->data,p,p->pNext);
p = p->pNext;
}
}
}
int CountAllNode(pNode phead)
{
int sum = 0;
if (phead == NULL)
{
printf("链表为空\n");
}
else
{
pNode p = phead;
while (p!=NULL)
{
p = p->pNext;
sum++;
}
}
return sum;
}
void *FreeAll(pNode phead)
{
pNode p1, p2;
p1 = p2 = NULL;
p1 = phead;
while (p1->pNext != NULL)
{
p2 = p1->pNext;
p1->pNext = p2->pNext;
free(p2);
}
free(phead);
return NULL;
}
int main()
{
pNode head = NULL;
head = CreateNode(head, 1, 78);
head = CreateNode(head, 2, 38);
head = CreateNode(head, 3, 43);
head = CreateNode(head, 4, 57);
head = CreateNode(head, 5, 70);
head = CreateNode(head, 6, 69);
head = CreateNode(head, 7, 91);
PrintAllNode(head);
printf("总计%d个节点\n", CountAllNode(head));
head=AddNodeBack(head, 5, 22, 57);
head = AddNodeAhead(head, 1, 17, 45);
ChangeNode(head, 7, 100, 100);
PrintAllNode(head);
printf("总计%d个节点\n", CountAllNode(head));
SortAllNode(head, '>');
PrintAllNode(head);
head=(pNode)FreeAll(head);
printf("删除之后\n");
PrintAllNode(head);
getchar();
return 0;
}