单链表结构特点 其中,DATA数据元素,可以为你想要储存的任何数据格式,可以是数组,可以是int,甚至可以是结构体(结构体套结构体);NEXT为一个指针,其代表了一个可以指向的区域,通常是用来指向下一个结点,链表的尾部NEXT指向NULL(空),因为尾部没有任何可以指向的空间了。 以下:单链表的创建, 添加, 插入, 删除.
下面为临摹老师的代码:
(1).创建链表
typedef struct LinkNode
{
char data;
struct LinkNode *next;
} LNode,*LinkList,*NodePtr;
(2).建立头节点(初始化)
生成新结点作为头结点,用头指针指向头结点——头结点的指针域置空
头结点和头指针的区分:不管带不带头结点,头指针始终指向单链表的第一个结点,而头结点是带头结点的单链表中的第一个结点,结点内通常不存储信息。
LinkList initLinkList()
{
NodePtr tempHeader = (NodePtr)malloc(sizeof(LNode));
tempHeader->data = ' ';
tempHeader->next = NULL;
return tempHeader;
}
(3).输出当前链表
void printList(NodePtr paraHeader)
{
NodePtr p = paraHeader->next;
while(p!=NULL)
{
printf("%c",p->data);
p = p->next;
}
printf("rn");
}
(4).尾插法插入
void appendElement(NodePtr paraHeader,char paraChar)
{
NodePtr p,q;
q = (NodePtr)malloc(sizeof(LNode));
q->data = paraChar;
q->next = NULL;
p = paraHeader;
while(p->next!=NULL)
{
p = p->next;
}
p->next = q;
}
(5).指定位置插入
void insertElement(NodePtr paraHeader,char paraChar,int paraPosition)
{
NodePtr p,q;
p = paraHeader;
for(int i = 0;i < paraPosition;i++)
{
p = p->next;
if(p==NULL)
{
printf("The position %d is beyond the scope of the list.",paraPosition);
return;
}
}
q=(NodePtr)malloc(sizeof(LNode));
q->data = paraChar;
printf("linkingrn");
q->next = p->next;
p->next = q;
}
(6).删除指定元素
void deleteElement(NodePtr paraHeader,char paraChar)
{
NodePtr p,q;
p = paraHeader;
while((p->next!=NULL)&&(p->next->data!=paraChar))
{
p=p->next;
}
if(p->next==NULL)
{
printf("Cannot delete %crn",paraChar);
return;
}
q=p->next;
p->next=p->next->next;
free(q);
}
(7).测试
void appendInsertDeleteTest()
{
LinkList tempList = initLinkList();
printList(tempList);
appendElement(tempList, 'H');
appendElement(tempList, 'e');
appendElement(tempList, 'l');
appendElement(tempList, 'l');
appendElement(tempList, 'o');
appendElement(tempList, '!');
printList(tempList);
deleteElement(tempList, 'e');
deleteElement(tempList, 'a');
deleteElement(tempList, 'o');
printList(tempList);
insertElement(tempList, 'o', 1);
printList(tempList);
}
全部代码展示:
#include#include typedef struct LinkNode { char data; struct LinkNode *next; } LNode,*LinkList,*NodePtr; LinkList initLinkList() { NodePtr tempHeader = (NodePtr)malloc(sizeof(LNode)); tempHeader->data = ' '; tempHeader->next = NULL; return tempHeader; }//Of initLinkList void printList(NodePtr paraHeader) { NodePtr p = paraHeader->next; while(p!=NULL) { printf("%c",p->data); p = p->next; }//of while printf("rn"); }//of printList void appendElement(NodePtr paraHeader,char paraChar) { NodePtr p,q; //step 1.Construct a new node. q = (NodePtr)malloc(sizeof(LNode)); q->data = paraChar; q->next = NULL; //step 2.search to the tail. p = paraHeader; while(p->next!=NULL) { p = p->next; }//of while //step 3.Now add/link. p->next = q; } //of appendElement void insertElement(NodePtr paraHeader,char paraChar,int paraPosition) { NodePtr p,q; //step 1.search to the position. p = paraHeader; for(int i = 0;i < paraPosition;i++) { p = p->next; if(p==NULL) { printf("The position %d is beyond the scope of the list.",paraPosition); return; }//of if }//of for i //step 2.construct a new node. q=(NodePtr)malloc(sizeof(LNode)); q->data = paraChar; //step 3.Now link. printf("linkingrn"); q->next = p->next; p->next = q; }//of insertElement void deleteElement(NodePtr paraHeader,char paraChar) { NodePtr p,q; p = paraHeader; while((p->next!=NULL)&&(p->next->data!=paraChar)) { p=p->next; }//of while if(p->next==NULL) { printf("Cannot delete %crn",paraChar); return; }//of it q=p->next; p->next=p->next->next; free(q); }//of deleteElement void appendInsertDeleteTest() { // Step 1. Initialize an empty list. LinkList tempList = initLinkList(); printList(tempList); // Step 2. Add some characters. appendElement(tempList, 'H'); appendElement(tempList, 'e'); appendElement(tempList, 'l'); appendElement(tempList, 'l'); appendElement(tempList, 'o'); appendElement(tempList, '!'); printList(tempList); // Step 3. Delete some characters (the first occurrence). deleteElement(tempList, 'e'); deleteElement(tempList, 'a'); deleteElement(tempList, 'o'); printList(tempList); // Step 4. Insert to a given position. insertElement(tempList, 'o', 1); printList(tempList); }// Of appendInsertDeleteTest void basicAddressTest() { LNode tempNode1, tempNode2; tempNode1.data = 4; tempNode1.next = NULL; tempNode2.data = 6; tempNode2.next = NULL; printf("The first node: %d, %d, %drn",&tempNode1, &tempNode1.data, &tempNode1.next); printf("The second node: %d, %d, %drn",&tempNode2, &tempNode2.data, &tempNode2.next); tempNode1.next = &tempNode2; }// Of basicAddressTest int main() { appendInsertDeleteTest(); }// Of main
2.insertElement()函数更多测试void appendInsertDeleteTest() {
LinkList tempList = initLinkList();
printList(tempList);
appendElement(tempList, 'H');
appendElement(tempList, 'e');
appendElement(tempList, 'l');
appendElement(tempList, 'l');
appendElement(tempList, 'o');
appendElement(tempList, '!');
//多加几个字符测试一下
appendElement(tempList, '!');
appendElement(tempList, '!');
appendElement(tempList, '!');
appendElement(tempList, 'S');
appendElement(tempList, 'W');
appendElement(tempList, 'P');
appendElement(tempList, 'U');
printList(tempList);
deleteElement(tempList, 'U');
deleteElement(tempList, 'P');
deleteElement(tempList, 'S');
deleteElement(tempList, 'W');
deleteElement(tempList, 'A');
printList(tempList);
insertElement(tempList, 'o', 1);
printList(tempList);
}
运行结果



