c语言 链表指针程序,C语言指针和链表操作

1、C语言指针操作

程序运行的时候要位于内存之中

内存可以当成一个一个的格子,每个格子都有编号,一个格子对应一个字节

定义一个变量,必定有内存来存储它,不管是什么类型的变量;int *p;指针变量p

定义了指针变量,如果没有现成的结构赋值给指针变量,就需要通过手动分配内存的方式来初始化指针变量。

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

p=&a(变量名);取址符号,取出变量a的存储地址赋给变量P。

*p=0x12345678;地址p所指向的地方,存储的内容设置为0x12345678;

*变量:把变量p的值作为地址,去访问这个地址处的内存所存储的内容。

指针例子如下:

#include

typedef struct {

int a;

int b;

}T_AB;

int main(int argc, char **argv)

{

char c;

int a;

T_AB tTest;

int *p;

int **pp;

/* 1. */

p = &a;

printf("p = 0x%x, a'addr = 0x%x\n", p, &a);

/* 2. */

*p = 0x12345678;

printf("a = 0x%x\n", a);

/* 3. */

p = &c;

printf("p = 0x%x, c'addr = 0x%x\n", p, &c);

/* 4. */

*p = 'A';

printf("c = %c\n", c);

/* 5. */

p = &tTest;

printf("p = 0x%x, tTest'addr = 0x%x\n", p, &tTest);

/* 6. */

*p = &tTest;

printf("tTest.a = 0x%x, tTest'addr = 0x%x\n", tTest.a, &tTest);

/* 7. */

pp = &p;

printf("pp = 0x%x, p'addr = 0x%x\n", pp, &p);

/* 8. */

**pp = 0xABCD1234;

printf("tTest.a = 0x%x\n", tTest.a);

return 0;

}

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

二、C语言链表操作

链表是一种数据结构,有基本数据类型构成。

利用好内存不连续的资源,联系到一起。

结构体的成员包含自己的指针。

链表头:结构体指针。

链表有如下类似结构:

typedef struct NAME{

char *name;

struct NAME *pre;

struct NAME *next;

}T_Name, *PT_Name;

static PT_Name g_ptNameHead;//定义链表头

#include

#include

#include

typedef struct NAME{

char *name;

struct NAME *pre;

struct NAME *next;

}T_Name, *PT_Name;

static PT_Name g_ptNameHead;//定义链表头

void add_name(PT_Name ptNew)

{

PT_Name ptCur;

if (g_ptNameHead == NULL)

{

g_ptNameHead = ptNew;

}

else

{

ptCur = g_ptNameHead;

while (ptCur->next)

{

ptCur = ptCur->next;

}

ptCur->next = ptNew;

ptNew->pre = ptCur;

}

}

void del_name(PT_Name ptDel)

{

PT_Name ptCur;

PT_Name ptPre;

PT_Name ptNext;

if (g_ptNameHead == ptDel)

{

g_ptNameHead = ptDel->next;

/* 释放 */

return;

}

else

{

ptCur = g_ptNameHead->next;

while (ptCur)

{

if (ptCur == ptDel)

{

/* 从链表中删除 */

ptPre = ptCur->pre;

ptNext = ptCur->next;

ptPre->next = ptNext;

if (ptNext)

{

ptNext->pre = ptPre;

}

break;

}

else

{

ptCur = ptCur->next;

}

}

}

free(ptDel->name);

free(ptDel);

}

void add_one_name()

{

PT_Name ptNew;

char *str;

char name[128];

printf("enter the name:");

scanf("%s", name);

str = malloc(strlen(name) + 1);

strcpy(str, name);

ptNew = malloc(sizeof(T_Name));

ptNew->name = str;

ptNew->pre = NULL;

ptNew->next = NULL;

add_name(ptNew);

}

PT_Name get_name(char *name)

{

PT_Name ptCur;

if (g_ptNameHead == NULL)

{

return NULL;

}

else

{

ptCur = g_ptNameHead;

do {

if (strcmp(ptCur->name, name) == 0)

return ptCur;

else

ptCur = ptCur->next;

}while (ptCur);

}

return NULL;

}

void del_one_name()

{

PT_Name ptFind;

char name[128];

printf("enter the name:");

scanf("%s", name);

ptFind = get_name(name);

if (ptFind == NULL)

{

printf("do not have this name\n");

return ;

}

del_name(ptFind);

}

void list_all_name(void)

{

PT_Name ptCur;

int i = 0;

ptCur = g_ptNameHead;

while (ptCur)

{

printf("%02d : %s\n", i++, ptCur->name);

ptCur = ptCur->next;

}

}

int main(int argc, char **argv)

{

char c;

while (1)

{

printf(" List all the names\n");

printf(" add one name\n");

printf(" del one name\n");

printf(" exit\n");

printf("Enter the choise: ");

c = getchar();

switch (c)

{

case 'l':

{

list_all_name();

break;

}

case 'a':

{

add_one_name();

break;

}

case 'd':

{

del_one_name();

break;

}

case 'x':

{

return 0;

break;

}

default:

{

break;

}

}

}

return 0;

}

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png