头结点:第一个有效结点之前的那个结点; 头结点并不存有效数据;加头结点的目的主要是为了方便对链表的操作
头指针:指向头结点的指针变量尾指针:指向尾节点的指针变量
如果希望通过一个函数对链表进行处理,只需要一个参数:头指针
首先要定义一个单链表存储结构
然后建立一个空表,即初始化,我写的这个提前设置好了一个首结点和尾结点
向链表中插入元素,我直接进行了有序的插入,大致的想法就是新插入结点的值和已经插入的进行比较,若新插入结点的值小,则插入其中;若相等,则不插入;若大于,则指针向下一位移动。
搜索和删除功能在别的代码中测试成功,这代码没有体现出来
</pre></p><p></p><pre name="code" class="plain">#include<stdio.h>
#include<stdlib.h>
typedef struct linknode
{
int element;
struct linknode* next;
}LinkNode,*LinkPtr;
LinkPtr initializeLinkList();
LinkPtr createLinkList(int *paraArray, int arrayLength);
void insertToNode(LinkPtr parahead, int paraElement);
void printLinkList(LinkPtr parahead);
int deleteNode(LinkPtr parahead, int val);
int searchNode(LinkPtr parahead, int find);
void testLinkList();
//插入结点
void insertToNode(LinkPtr parahead, int paraElement)
{
LinkPtr p, q, r; //p代表前驱结点,q代表后继结点,r代表新插入结点
p = parahead;
q = parahead->next;
printf("insert to list\n");
r = (LinkPtr)malloc(sizeof(LinkNode));
r->element = paraElement;
r->next = NULL;
while (q != NULL)
{
if ((q->element) > (r->element))
{
r->next = q;
p->next = r;
break;
}
else if ((q->element) == (r->element))
{
free(r);
break;
}
else
{
p = q;
q = p->next;
}
}
printf("insert success\n");
printLinkList(parahead);
}
//初始化链表
LinkPtr initializeLinkList()
{
LinkPtr head, tail;
head = (LinkPtr)malloc(sizeof(LinkNode));
tail = (LinkPtr)malloc(sizeof(LinkNode));
head->element = -65535;
tail->element = 65535;
tail->next = NULL;
head->next = tail;
return head;
}
//创建链表
LinkPtr createLinkList(int *paraArray, int arrayLength)
{
LinkPtr head = initializeLinkList();
printf("initializeLinkList success\r\n");
printLinkList(head);
printf("\n");
int i;
for (i = 0; i < arrayLength; i++)
{
insertToNode(head, paraArray[i]);
printf("\n");
}
return head;
}
//打印链表
void printLinkList(LinkPtr parahead)
{
LinkPtr head = parahead;
while (head != NULL)
{
printf("%d ", head->element);
head = head->next;
}
}
//删除结点
int deleteNode(LinkPtr parahead, int val)
{
int num = 1;
LinkPtr p = parahead;
while ((p != NULL) && (num < val))
{
p = p->next;
num++;
}
if ((p != NULL)&&(num==val))
{
LinkPtr r = p->next;
p->next = r->next;
free(r);
return 1;
}
else
{
printf("NOT FOUND");
return 0;
}
}
//查找结点
int searchNode(LinkPtr parahead, int find)
{
LinkPtr p = parahead;
int i = 1;
while ((p != NULL) && (i < find))
{
p = p->next;
i++;
}
if ((p != NULL) && (i == find))
{
return p->element;
}
return 0;
}
void testLinkList()
{
int tempArray[] = { 5, 7, 5, 8, 3 };
LinkPtr tempList = createLinkList(tempArray, 5);
}
void main()
{
testLinkList();
}